啟用 minifyEnabled true 後,發布包崩潰堆棧丟失行號、文件名,極大增加線上問題定位難度。原因是 ProGuard 默認移除類文件中的調試屬性(SourceFile、LineNumberTable)。
proguard-rules.pro 添加保留規則-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile:將所有類的 SourceFile 屬性統一重命名為「SourceFile」(可自定義字符串),防止混淆後文件名信息丟失,同時減小體積(不保留原文件名)。-keepattributes SourceFile,LineNumberTable:強制保留源文件名屬性與行號表屬性,**這是崩潰日誌顯示行號的關鍵**。./gradlew assembleRelease。jadx 或 apktool 反編譯 classes.dex,檢查類文件是否包含 LineNumberTable 屬性。throw new RuntimeException()),上傳至崩潰收集平台(Firebase Crashlytics、Bugly、Sentry),確認堆棧包含行號。混淆後會生成 mapping.txt(app/build/outputs/mapping/release/),**務必妥善備份每個版本的 mapping 文件**,配合崩潰平台自動反混淆還原原始類名、方法名、行號。若使用 R8(默認),規則同上兼容。
-dontobfuscate 僅優化不混淆,仍需保留此兩屬性以獲取行號。