首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 混淆後崩潰日誌無行號:ProGuard 保留 SourceFile 與 LineNumberTable 屬性

     編輯:程式設計綜合問答

啟用 minifyEnabled true 後,發布包崩潰堆棧丟失行號、文件名,極大增加線上問題定位難度。原因是 ProGuard 默認移除類文件中的調試屬性(SourceFile、LineNumberTable)。

解決方案:在 proguard-rules.pro 添加保留規則

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

規則解析

  • -renamesourcefileattribute SourceFile:將所有類的 SourceFile 屬性統一重命名為「SourceFile」(可自定義字符串),防止混淆後文件名信息丟失,同時減小體積(不保留原文件名)。
  • -keepattributes SourceFile,LineNumberTable:強制保留源文件名屬性與行號表屬性,**這是崩潰日誌顯示行號的關鍵**。

驗證方法

  1. 構建 Release 包:./gradlew assembleRelease。
  2. 解壓 APK,用 jadx 或 apktool 反編譯 classes.dex,檢查類文件是否包含 LineNumberTable 屬性。
  3. 故意製造崩潰(如 throw new RuntimeException()),上傳至崩潰收集平台(Firebase Crashlytics、Bugly、Sentry),確認堆棧包含行號。

進階:映射文件

混淆後會生成 mapping.txt(app/build/outputs/mapping/release/),**務必妥善備份每個版本的 mapping 文件**,配合崩潰平台自動反混淆還原原始類名、方法名、行號。若使用 R8(默認),規則同上兼容。

注意事項

  • 保留行號會增加 DEX 體積(約 5-15%),接受度內。
  • 若使用 -dontobfuscate 僅優化不混淆,仍需保留此兩屬性以獲取行號。
  • Kotlin 代碼同樣適用,R8 會處理 Kotlin 元數據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved