3

突然,我发布的应用程序在从 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 规则文件,但谷歌播放控制台拒绝它。

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

4

3 回答 3

7

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

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

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

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

于 2017-10-12T10:47:52.977 回答
5

组装发布 apk 后,文件在这里:

./gradlew clean assembleFLAVORRelease

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

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

-keepattributes SourceFile,LineNumberTable

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

于 2017-10-12T08:47:02.540 回答
2

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

于 2017-10-12T08:31:56.560 回答