通过将 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。

一些陷阱:

ma​​pping.txt 文件会在您每次使用 ProGuard 创建发布版本时被覆盖,因此请先备份该文件,然后再创建新版本。 这将有助于从您的应用程序的旧版本中混淆堆栈跟踪。

除此之外,还有两种混淆代码的方法:

1.将您的 mapping.txt 文件上传到 Google Play 控制台:

在 Google Play 上发布您的应用时,您可以为每个版本的 APK 上传 ma​​pping.txt 文件。然后,Google Play 将对来自用户报告的问题的传入堆栈跟踪进行去混淆处理,以便您可以在 Google Play 控制台中查看它们。

2。使用本地sdk工具retrace.sh/retrace.bat:

有时您希望运行应用的发布版本(通过将构建变体更改为发布并运行它)来交叉检查和修复错误,以便它不会在生产中发生(发布到 Play-store 时)。

要自行将混淆的堆栈跟踪转换为可读的,请使用 retrace 脚本(在 Windows 上为 retrace.batretrace.sh 在 Mac/Linux 上)。

它位于<sdk-root>/tools/proguard/bin/ 目录中。

<sdk-root> 是您安装所有 android 库和 sdk 的地方。

脚本获取 ma​​pping.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”

如何提取合并的proguard规则

通过Go写一个简易版的上传文件到OSS的工具

Android Studio - Proguard“保留”规则被忽略?

在 Android Studio 中分析 Proguard 优化构建的最佳方式?