突然,我发布的应用程序在从Play商店安装应用程序后打开时崩溃了。 但问题是,当我在Android Studio中以调试模式运行代码时,app不会崩溃。
当我在谷歌播放控制台上查找崩溃错误时,我看到一些混淆的代码不容易猜到错误发生的地方。
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控制台说上传去混淆文件以对代码进行反模糊处理。
现在我的问题是我无法在项目源文件夹中找到去混淆文件。
我尝试上传专业版规则文件,但google play console拒绝了它。
请向我提供我可以查找去混淆文件的路径或位置(通常存在的位置)。
答案 0 :(得分:2)
组装完发布后,apk文件在这里:
./gradlew clean assembleFLAVORRelease
app/build/outputs/mapping/FLAVOR/release/mapping.txt
请记住,您可能应该检查您的计划规则:
-keepattributes SourceFile,LineNumberTable
如果没有此属性,您将无法在播放控制台中看到行和源文件名。
答案 1 :(得分:1)
它在build/outputs/proguard/release/mapping.txt
确保您的ProGuard的mapping.txt来自您编译版本的相同版本。每次导出APK时,Mapping.txt都会被替换并更改
答案 2 :(得分:1)
对像我这样的初学者的一些详细解答和解释 -
映射文件到反混淆的位置:
ProGuard将文件保存在应用程序中 应用/建造/输出/映射/ FLAVOR /释放/的mapping.txt 强>
或
/应用程序/生成/输出/映射/释放/
感谢@ answering的@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 ; retrace.sh 在Mac / Linux上。)
它位于<sdk-root>/tools/proguard/bin/
目录中。
<sdk-root>
是安装所有android库和sdks的地方。
该脚本采用 mapping.txt 文件和堆栈跟踪,生成新的 可读堆栈跟踪 。
命令语法:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
我更喜欢本地版本的混淆,因为预先检查生产错误非常方便。