通过将 proguard 规则映射文件上传到 google 播放控制台来反混淆生产 Android 错误

Deobfuscate production Android errors via uploading proguard rules mapping file to google play console

刚从 Play 商店安装应用程序后,我发布的应用程序在打开时突然崩溃了。 但问题是,当我 运行 时,Android Studio 中处于调试模式的应用程序代码不会崩溃。

当我在 google 游戏控制台上查找崩溃错误时,我看到了一些混淆代码,不容易从错误中猜测出来。

java.lang.NullPointerException: 
  at com.wl.model.a.b (Unknown Source)
  at com.wl.model.a.a (Unknown Source)
  at com.wl.model.a.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 console 说上传去混淆文件去混淆错误代码。

现在我的问题是我无法在我的项目源文件夹中找到反混淆文件。

我尝试上传 pro-guard 规则文件,但 google 游戏机拒绝它。

请提供我可以查找去混淆文件(通常存在的地方)的路径或位置。

build/outputs/proguard/release/mapping.txt
确保你的 ProGuard 的 mapping.txt 与你的编译版本相同。 Mapping.txt 每次导出 APK 时都会被替换和更改

组装发布 apk 后,文件位于此处:

./gradlew clean assembleFLAVORRelease

app/build/outputs/mapping/FLAVOR/release/mapping.txt

请记住,您可能应该检查您的 proguard 规则:

-keepattributes SourceFile,LineNumberTable

如果没有此属性,您将不会在播放控制台中看到行和源文件名。

对像我这样的初学者的一些详细解答和解释-

要反混淆的映射文件的位置:

ProGuard saves the file in the app app/build/outputs/mapping/FLAVOR/release/mapping.txt.

/app/build/outputs/mapping/release/

感谢@chrjs 它。

一些陷阱:

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

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

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

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

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

有时您想 运行 应用程序的发布版本(通过将构建变体更改为发布并 运行ning 它)来交叉检查并修复错误,这样它就不会发生生产中(发布到游戏商店时)。

要自己将混淆的堆栈跟踪转换为可读的堆栈跟踪,请使用 retrace 脚本retrace.bat on Windows; 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

我更喜欢本地版本的混淆,因为它可以很方便地预先检查生产错误。