Files
mobile-android/CRASH_REPORTS_SYSTEM.md

8.9 KiB
Raw Blame History

Система Crash Reports для Rosetta Android

📋 Обзор

Реализована система автоматического сохранения crash reports в приложении Rosetta Android. Теперь при каждом краше приложения информация о нем будет сохраняться в локальное хранилище для последующего анализа.

🎯 Функциональность

Автоматический сбор

  • Отлов крашей: Все необработанные исключения автоматически перехватываются
  • Детальная информация: Сохраняется полная информация о краше:
    • Timestamp (дата и время)
    • Информация о приложении (package, версия)
    • Информация об устройстве (модель, Android версия)
    • Thread информация
    • Exception type и message
    • Полный stack trace
    • Вложенные causes (до 10 уровней)

Управление логами

  • Просмотр: Удобный UI для просмотра всех крашей
  • Детали: Подробный просмотр каждого краша с возможностью копирования
  • Удаление: Можно удалить отдельный краш или все разом
  • Автоочистка: Хранится максимум 50 последних крашей

📁 Файловая структура

rosetta-android/app/src/main/java/com/rosetta/messenger/
├── RosettaApplication.kt                    # Application класс с инициализацией
├── utils/
│   └── CrashReportManager.kt               # Основной класс управления крашами
└── ui/
    └── crashlogs/
        └── CrashLogsScreen.kt              # UI для просмотра логов

🚀 Как использовать

1. Просмотр Crash Logs

В приложении:

  1. Откройте Профиль (Settings)
  2. Нажмите на Crash Logs
  3. Увидите список всех крашей
  4. Нажмите на краш для просмотра деталей

2. Программный доступ

// Получить список всех крашей
val crashes = CrashReportManager.getCrashReports(context)

// Удалить конкретный краш
CrashReportManager.deleteCrashReport(context, fileName)

// Удалить все краши
CrashReportManager.deleteAllCrashReports(context)

3. Тестирование системы

Для проверки работы crash reporter можно добавить тестовый краш:

// В любом месте приложения
Button(onClick = {
    throw RuntimeException("Test crash for debugging")
}) {
    Text("Test Crash")
}

📝 Формат Crash Report

Пример сохраненного crash report:

=== CRASH REPORT ===

Timestamp: 2026-01-25 14:30:45

=== App Info ===
Package: com.rosetta.messenger
Version: 1.0.0 (1)

=== Device Info ===
Manufacturer: Samsung
Model: SM-G991B
Android Version: 13 (API 33)
Device: o1s
Board: s5e9925

=== Thread Info ===
Thread: main
Thread ID: 2

=== Exception ===
Exception Type: java.lang.NullPointerException
Message: Attempt to invoke virtual method on null object

=== Stack Trace ===
java.lang.NullPointerException: Attempt to invoke virtual method on null object
    at com.rosetta.messenger.ui.MainActivity.onCreate(MainActivity.kt:123)
    at android.app.Activity.performCreate(Activity.java:8051)
    ...

=== Caused by (level 1) ===
...

🔧 Настройки

В CrashReportManager.kt:

private const val MAX_CRASH_FILES = 50  // Максимум файлов
private const val CRASH_DIR = "crash_reports"  // Директория хранения

💾 Хранение данных

  • Расположение: /data/data/com.rosetta.messenger/files/crash_reports/
  • Формат файлов: crash_YYYY-MM-DD_HH-mm-ss.txt
  • Автоочистка: Старые файлы удаляются при превышении лимита

🎨 UI Features

Список крашей

  • Красная иконка bug для каждого краша
  • 📅 Дата и время краша
  • 🔍 Тип исключения
  • 🗑️ Кнопка удаления для каждого

Детальный просмотр

  • 📄 Полный текст crash report
  • ✂️ Возможность выделения и копирования текста
  • 🔙 Навигация назад
  • 🗑️ Удаление краша

Пустое состояние

Если нет крашей, показывается дружелюбное сообщение:

🐛 No crash reports
Great! Your app is running smoothly

🔒 Безопасность и Privacy

  • Данные хранятся только локально
  • Не отправляются на сторонние серверы
  • Пользователь контролирует удаление
  • Автоматическая ротация старых логов

🛠️ Техническая реализация

Инициализация

Crash reporter автоматически инициализируется в RosettaApplication.onCreate():

class RosettaApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        CrashReportManager.init(this)
    }
}

Обработка крашей

CrashReportManager реализует Thread.UncaughtExceptionHandler:

  • Перехватывает необработанные исключения
  • Сохраняет детальную информацию
  • Передает управление дефолтному handler (для нормального завершения)

📊 Мониторинг

Что отслеживать:

  1. Частота крашей: Как часто происходят краши
  2. Тип исключений: Какие типы ошибок встречаются
  3. Места крашей: В каких частях кода происходят проблемы
  4. Устройства: На каких устройствах чаще крашится

Аналитика

Регулярно проверяйте Crash Logs раздел для:

  • Выявления паттернов
  • Приоритизации багов
  • Улучшения стабильности

🚧 Дальнейшие улучшения

Возможные доработки:

  1. Export: Экспорт крашей в файл для отправки разработчикам
  2. Filtering: Фильтрация по типу исключения, дате
  3. Statistics: Статистика по типам крашей
  4. Auto-report: Опциональная отправка на сервер (с согласия)
  5. Symbols: Интеграция с символами для более читаемых stack traces

🐛 Debug режим

В debug режиме рекомендуется добавить быстрый доступ к Crash Logs:

// В ProfileScreen или DebugMenu
if (BuildConfig.DEBUG) {
    Button(onClick = {
        throw RuntimeException("Test crash")
    }) {
        Text("Trigger Test Crash")
    }
}

Чеклист интеграции

  • CrashReportManager создан
  • RosettaApplication настроен
  • AndroidManifest обновлен
  • UI для просмотра создан
  • Навигация добавлена
  • Автоочистка настроена

📞 Получение крашей от пользователей

Если пользователь сообщает о краше:

  1. Попросите открыть Profile → Crash Logs
  2. Найти краш по дате/времени
  3. Скопировать текст краша
  4. Отправить разработчикам

🎯 Best Practices

  1. Регулярная проверка: Просматривайте краши минимум раз в неделю
  2. Приоритеты: Сначала исправляйте частые краши
  3. Тестирование: После исправления проверяйте что краш не воспроизводится
  4. Документация: Документируйте причины и решения крашей

Статус: Готово к использованию
Версия: 1.0
Дата: 25 января 2026