通过将 proguard 规则映射文件上传到 google play 控制台去混淆生产 Android 错误
Posted
技术标签:
【中文标题】通过将 proguard 规则映射文件上传到 google play 控制台去混淆生产 Android 错误【英文标题】:Deobfuscate production Android errors via uploading proguard rules mapping file to google play console 【发布时间】:2018-03-24 02:31:03 【问题描述】:我发布的应用程序在从 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)
从错误中我知道有一些空指针异常但无法追踪其来源。
Google play 控制台说上传去混淆文件来去混淆错误代码。
现在我的问题是我无法在我的项目源文件夹中找到去混淆文件。
我尝试上传 pro-guard 规则文件,但 google play 控制台拒绝。
请提供我可以查找去混淆文件的路径或位置(通常存在的位置)。
【问题讨论】:
【参考方案1】:给像我这样的初学者一些详细的解答和解释-
要反混淆的映射文件的位置:
ProGuard 将文件保存在应用程序中 app/build/outputs/mapping/FLAVOR/release/mapping.txt。
或
/app/build/outputs/mapping/release/
感谢@chrjs 提供answering。
一些陷阱:
mapping.txt 文件会在您每次使用 ProGuard 创建发布版本时被覆盖,因此请先备份该文件,然后再创建新版本。 这将有助于从您的应用程序的旧版本中混淆堆栈跟踪。
除此之外,还有两种混淆代码的方法:
1.将您的 mapping.txt 文件上传到 Google Play 控制台:
在 Google Play 上发布您的应用时,您可以为每个版本的 APK 上传 mapping.txt 文件。然后,Google Play 将对来自用户报告的问题的传入堆栈跟踪进行去混淆处理,以便您可以在 Google Play 控制台中查看它们。
2。使用本地sdk工具retrace.sh/retrace.bat:
有时您希望运行应用的发布版本(通过将构建变体更改为发布并运行它)来交叉检查和修复错误,以便它不会在生产中发生(发布到 Play-store 时)。
要自行将混淆的堆栈跟踪转换为可读的,请使用 retrace 脚本(在 Windows 上为 retrace.bat;retrace.sh 在 Mac/Linux 上)。
它位于<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
我更喜欢本地版本的混淆,因为它可以很方便地预先检查生产错误。
【讨论】:
这应该是公认的答案。好总结! :) @chrjs 您在回答中指出了正确的方向。谢谢【参考方案2】:组装发布 apk 后,文件就在这里:
./gradlew clean assembleFLAVORRelease
app/build/outputs/mapping/FLAVOR/release/mapping.txt
请记住,您可能应该检查您的 proguard 规则:
-keepattributes SourceFile,LineNumberTable
没有此属性,您将不会在播放控制台中看到行和源文件名。
【讨论】:
我会试试这个。【参考方案3】:在build/outputs/proguard/release/mapping.txt
确保您的 ProGuard 的 mapping.txt 来自与您的编译版本相同的版本。每次导出 APK 时,Mapping.txt 都会被替换和更改
【讨论】:
以上是关于通过将 proguard 规则映射文件上传到 google play 控制台去混淆生产 Android 错误的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Firebase 上上传 proguard 映射文件
无法创建任务以上传 Proguard 映射 File.java.lang.IllegalStateException:解析配置“androidTestAnnotationProcessor”