crash monitoring
4
总安装量
0
周安装量
#47779
全站排名
安装命令
npx skills add https://github.com/fwrite0920/android-skills --skill 'Crash Monitoring'
Skill 文档
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 设置