feat: Implement crash reporting system with CrashLogsScreen and integration in ProfileScreen
This commit is contained in:
256
CRASH_REPORTS_SYSTEM.md
Normal file
256
CRASH_REPORTS_SYSTEM.md
Normal file
@@ -0,0 +1,256 @@
|
||||
# Система 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
|
||||
Reference in New Issue
Block a user