[Android] 开启R8优化下如何获得原始异常堆栈跟踪
# 什么是 R8
以下介绍来自 DeepSeek
R8 是 Android 平台上的代码优化和混淆工具,它是 ProGuard 的替代品,专门为 Kotlin 和 Java 代码设计。以下是关于 R8 优化的关键信息:
主要功能:
-
代码缩减 (Shrinking):
移除未使用的类、字段、方法和属性
减小应用体积 -
优化 (Optimization):
内联方法
移除死代码
简化类结构
优化控制流 -
混淆 (Obfuscation):
重命名类和成员为短名称
增加逆向工程难度 -
资源缩减:
与资源缩减工具配合移除未使用的资源
总而言之,就是能够缩减安装包体积,优化代码以及提高应用运行速度
但同样的,因为使用混淆,在捕捉异常时会受到混淆的影响导致无法定位到具体代码行
一般来说,开发时所编译的 debug 版不开启 R8,而用于发布的 release 版适合开启 R8。但当 release 版出现崩溃收集日志时就会受到 R8 的影响。
# 解决方案
在开启 R8 优化后编译 release 版时会生成一个 mapping 文件,该文件记录了混淆时所有对应的方法,使用该文件即可对记录的堆栈跟踪信息进行反混淆。
文件一般位于 app/build/outputs/mapping/release/mapping.txt
在 clean build 后会重新生成,建议按版本妥善保管
反混淆会使用到 retrace
工具,该工具为 Android sdk 自带工具,位于 $ANDROID_HOME%\cmdline-tools\latest\bin\retrace.bat
或者 $ANDROID_HOME%\tools\proguard\bin\retrace.bat
(旧版)
如果没有找到可能是没有安装该工具,进入 Android studio 设置
-> 语言和框架
-> Android SDK
,在 SDK Tool
标签下勾选 Android SDK Command-line Tools(latest)
进行安装。
然后进行反混淆,命令如下:
1 | retrace.bat -verbose mapping.txt crash_logs.txt > deobfuscated.txt |
反混淆完成后打开 deobfuscated.txt
即可看到正常的堆栈跟踪信息。
在 Android studio 内打开 分析堆栈跟踪或线程转储
对话框,将反混淆的内容粘贴进去即可让 Android studio 快速定位到代码行
# 后记
这下既可以享受 R8 的优化也不怕日志收集受到混淆的干扰了
Use this card to join MyBlog and participate in a pleasant discussion together .
Welcome to GoodBoyboy 's Blog,wish you a nice day .