# Система 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. Программный доступ ```kotlin // Получить список всех крашей val crashes = CrashReportManager.getCrashReports(context) // Удалить конкретный краш CrashReportManager.deleteCrashReport(context, fileName) // Удалить все краши CrashReportManager.deleteAllCrashReports(context) ``` ### 3. Тестирование системы Для проверки работы crash reporter можно добавить тестовый краш: ```kotlin // В любом месте приложения 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](rosetta-android/app/src/main/java/com/rosetta/messenger/utils/CrashReportManager.kt): ```kotlin 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()`: ```kotlin 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: ```kotlin // В ProfileScreen или DebugMenu if (BuildConfig.DEBUG) { Button(onClick = { throw RuntimeException("Test crash") }) { Text("Trigger Test Crash") } } ``` ## ✅ Чеклист интеграции - [x] CrashReportManager создан - [x] RosettaApplication настроен - [x] AndroidManifest обновлен - [x] UI для просмотра создан - [x] Навигация добавлена - [x] Автоочистка настроена ## 📞 Получение крашей от пользователей Если пользователь сообщает о краше: 1. Попросите открыть Profile → Crash Logs 2. Найти краш по дате/времени 3. Скопировать текст краша 4. Отправить разработчикам ## 🎯 Best Practices 1. **Регулярная проверка**: Просматривайте краши минимум раз в неделю 2. **Приоритеты**: Сначала исправляйте частые краши 3. **Тестирование**: После исправления проверяйте что краш не воспроизводится 4. **Документация**: Документируйте причины и решения крашей --- **Статус**: ✅ Готово к использованию **Версия**: 1.0 **Дата**: 25 января 2026