# 什么是 R8

以下介绍来自 DeepSeek

R8 是 Android 平台上的代码优化和混淆工具,它是 ProGuard 的替代品,专门为 Kotlin 和 Java 代码设计。以下是关于 R8 优化的关键信息:

主要功能:

  1. 代码缩减 (Shrinking):
    移除未使用的类、字段、方法和属性
    减小应用体积

  2. 优化 (Optimization):
    内联方法
    移除死代码
    简化类结构
    优化控制流

  3. 混淆 (Obfuscation):
    重命名类和成员为短名称
    增加逆向工程难度

  4. 资源缩减:
    与资源缩减工具配合移除未使用的资源

总而言之,就是能够缩减安装包体积,优化代码以及提高应用运行速度

但同样的,因为使用混淆,在捕捉异常时会受到混淆的影响导致无法定位到具体代码行

一般来说,开发时所编译的 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 的优化也不怕日志收集受到混淆的干扰了