Synthèse automatique
Ce skill configure la surveillance des crashs et ANR avec Crashlytics, StrictMode, et une journalisation structurée pour les applications Android.
Points forts
- Intégration complète avec Firebase Crashlytics pour les crashs fatals et non fatals
- Détection des ANR via un watchdog personnalisé et StrictMode
- Journalisation structurée avec Timber pour les logs contextuels
Limites
- Nécessite un projet Firebase et une configuration Android existante
- Les ANR ne sont pas détectés sur tous les appareils en production
- Dépend de la bibliothèque Firebase Crashlytics (version spécifique)
Idéal lors de la préparation d’une release ou pour le diagnostic de problèmes de performance en production.
À éviter si l’application n’utilise pas Firebase ou si un système de monitoring alternatif est déjà en place.
Analyse de sécurité
SûrThe skill provides standard setup instructions for crash monitoring tools like Firebase Crashlytics, ANR detection, and structured logging. It does not contain any destructive commands, data exfiltration, obfuscated payloads, or instructions to disable safety features. All code snippets are benign and follow typical mobile development practices.
Aucun point d'attention détecté
Comment cette analyse est faiteExemples
Please complete Firebase Crashlytics integration following the Firebase Crashlytics Setup section.Add StrictMode and ANR Watchdog following the ANR Analysis section.Unify log format using structured logging as per the Structured Logging section.id: crash_monitoring name: Crash Monitoring description: Crashlytics 設定、ANR 分析與結構化日誌
Crash Monitoring (當機監控)
Instructions
- 確認需求屬於當機/ANR/日誌監控
- 依照下方章節順序套用
- 一次只調整一種監控或警報設定
- 完成後對照 Quick Checklist
When to Use
- Scenario D:效能問題排查
- Scenario E:發布前監控準備
Example Prompts
- "請依照 Firebase Crashlytics Setup,完成 Crashlytics 整合"
- "用 ANR Analysis 章節加入 StrictMode 與 ANR Watchdog"
- "請依 Structured Logging 章節統一日誌格式"
Workflow
- 先完成 Crashlytics 基本設定與 Custom Keys
- 再加入 ANR 與 Structured Logging
- 最後用 Dashboard & Alerting 與 Quick Checklist 驗收
Practical Notes (2026)
- Release 前先確立 Crash/ANR 的告警門檻
- 重要流程必有結構化事件與關鍵鍵值
- Non-Fatal 記錄以高價值事件為主
Minimal Template
目標:
監控範圍:
告警門檻:
事件欄位:
驗收: Quick Checklist
Firebase Crashlytics Setup
基本設定
// build.gradle.kts (app)
plugins {
id("com.google.firebase.crashlytics")
}
dependencies {
implementation(platform("com.google.firebase:firebase-bom:32.7.0"))
implementation("com.google.firebase:firebase-crashlytics-ktx")
implementation("com.google.firebase:firebase-analytics-ktx")
}
Custom Keys
// 記錄使用者狀態
Firebase.crashlytics.apply {
setUserId("user_123")
setCustomKey("subscription_tier", "premium")
setCustomKey("feature_flags", "new_checkout:true")
}
Non-Fatal Logging
// 記錄非致命錯誤
try {
riskyOperation()
} catch (e: Exception) {
Firebase.crashlytics.recordException(e)
// 繼續正常流程
}
// 帶上下文的 Non-Fatal
Firebase.crashlytics.log("Starting payment flow")
try {
processPayment()
} catch (e: PaymentException) {
Firebase.crashlytics.apply {
setCustomKey("payment_amount", amount)
setCustomKey("payment_method", method)
recordException(e)
}
}
ANR Analysis
StrictMode (Debug)
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.penaltyDeath() // 強制 Crash
.build()
)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectLeakedClosableObjects()
.detectActivityLeaks()
.penaltyLog()
.build()
)
}
}
}
ANR Watchdog
class ANRWatchDog(private val timeoutMs: Long = 5000) : Thread() {
private val mainHandler = Handler(Looper.getMainLooper())
private var tick = 0
private var reported = false
override fun run() {
while (!isInterrupted) {
val currentTick = tick
mainHandler.post { tick++ }
Thread.sleep(timeoutMs)
if (currentTick == tick && !reported) {
reported = true
val stackTraces = Looper.getMainLooper().thread.stackTrace
Firebase.crashlytics.log("ANR Detected")
Firebase.crashlytics.recordException(ANRException(stackTraces))
}
}
}
}
Structured Logging
Timber Setup
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
} else {
Timber.plant(CrashlyticsTree())
}
}
}
class CrashlyticsTree : Timber.Tree() {
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
if (priority >= Log.INFO) {
Firebase.crashlytics.log("[$tag] $message")
}
t?.let {
Firebase.crashlytics.recordException(it)
}
}
}
Log Levels 使用規範
| Level | 使用場景 | 例子 | |-------|---------|------| | VERBOSE | Debug 專用細節 | API Response body | | DEBUG | 開發除錯 | ViewModel state changes | | INFO | 重要里程碑 | User login success | | WARN | 潛在問題 | Retry attempt | | ERROR | 可恢復錯誤 | Network timeout |
Dashboard & Alerting
Crashlytics Velocity Alerts
Firebase Console > Crashlytics > Settings
- Enable velocity alerts
- Set threshold: 1% of sessions
Custom Metrics
// 追蹤關鍵指標
Firebase.analytics.logEvent("checkout_started") {
param("cart_value", cartValue)
}
Firebase.analytics.logEvent("checkout_completed") {
param("payment_method", method)
param("time_to_complete_ms", duration)
}
Quick Checklist
- [ ] Crashlytics 整合完成
- [ ] Custom Keys 設定 (User tier, Feature flags)
- [ ] Non-Fatal 記錄重要異常
- [ ] StrictMode 在 Debug 啟用
- [ ] Timber 統一日誌
- [ ] Velocity Alerts 設定
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/crash-monitoring-mm5t8c7c/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/crash-monitoring-mm5t8c7c' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/crash-monitoring-mm5t8c7c/download' --output '.skill-downloads/crash-monitoring-mm5t8c7c/SKILL.md.part' && mv '.skill-downloads/crash-monitoring-mm5t8c7c/SKILL.md.part' '.skill-downloads/crash-monitoring-mm5t8c7c/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Le fichier ne fournit pas un en-tête name/description exploitable pour cette procédure native. Le téléchargement reste disponible pour lecture ; utilisez le mode manuel ci-dessous.
Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/crash-monitoring-mm5t8c7c/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.