[英]Deobfuscate production Android errors via uploading proguard rules mapping file to google play console
突然,我發布的應用程序在從 Play-store 安裝應用程序后打開時崩潰了。 但問題是,當我在調試模式下運行 Android Studio 中的代碼時,應用程序不會崩潰。
當我在 google play 控制台上查找崩潰錯誤時,我看到了一些難以猜測錯誤來自哪里的混淆代碼。
java.lang.NullPointerException:
at com.wl.model.a.b (Unknown Source)
at com.wl.model.a.a (Unknown Source)
at com.wl.model.a$1.a (Unknown Source)
at b.w$a.b (Unknown Source)
at b.a.b.run (Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:588)
at java.lang.Thread.run (Thread.java:818)
從錯誤中我知道有一些空指針異常,但無法追蹤其來源。
谷歌播放控制台說上傳去混淆文件來去混淆錯誤代碼。
現在我的問題是我無法在我的項目源文件夾中找到去混淆文件。
我嘗試上傳 pro-guard 規則文件,但谷歌播放控制台拒絕它。
請提供我可以查找去混淆文件的路徑或位置(通常存在的位置)。
給像我這樣的初學者一些詳細的解答和解釋——
要反混淆的映射文件的位置:
ProGuard 將文件保存在應用程序app/build/outputs/mapping/FLAVOR/release/mapping.txt 中。
或者
/app/build/outputs/mapping/release/
感謝@chrjs 的回答。
一些陷阱:
每次使用 ProGuard 創建發布版本時, mapping.txt文件都會被覆蓋,因此請先備份該文件,然后再創建新版本。 這將有助於從您的應用程序的舊版本中混淆堆棧跟蹤。
除此之外,還有兩種混淆代碼的方法:
1. 將您的 mapping.txt 文件上傳到 Google Play 控制台:
在 Google Play 上發布您的應用時,您可以為每個版本的 APK 上傳mapping.txt文件。 然后,Google Play 將對來自用戶報告的問題的傳入堆棧跟蹤進行去混淆處理,以便您可以在 Google Play 控制台中查看它們。
2.使用本地sdk工具retrace.sh/retrace.bat:
有時您想運行應用程序的發布版本(通過將構建變體更改為發布並運行它)以交叉檢查並修復錯誤,以便它不會在生產中發生(發布到游戲商店時)。
要自己將混淆的堆棧跟蹤轉換為可讀的,請使用回溯腳本(Windows 上的retrace.bat ;Mac/Linux 上的retrace.sh )。
它位於<sdk-root>/tools/proguard/bin/
目錄中。
<sdk-root>
是安裝所有 android 庫和 sdk 的地方。
該腳本采用mapping.txt文件和您的堆棧跟蹤,生成一個新的、可讀的堆棧跟蹤。
命令語法:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
我更喜歡本地版本的混淆,因為它可以很方便地預先檢查生產錯誤。
組裝發布 apk 后,文件在這里:
./gradlew clean assembleFLAVORRelease
app/build/outputs/mapping/FLAVOR/release/mapping.txt
請記住,您可能應該檢查您的 proguard 規則:
-keepattributes SourceFile,LineNumberTable
如果沒有此屬性,您將不會在播放控制台中看到行和源文件名。
它位於build/outputs/proguard/release/mapping.txt
確保您的 ProGuard 的 mapping.txt 來自與您的編譯版本相同的版本。 每次導出 APK 時,Mapping.txt 都會被替換和更改
要自動包含調試符號,請添加到app/build.gradle文件的最后一行:
android.buildTypes.release.ndk.debugSymbolLevel = 'FULL'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.