开启R8优化下如何获得原始异常堆栈跟踪

作者: GoodBoyboy
链接: https://blog.goodboyboy.top/posts/895802776.html
来源: GoodBoyboy 's Blog|惬意小屋-点滴记忆
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

什么是 R8

以下介绍来自 DeepSeek

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

主要功能:

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

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

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

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

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

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

一般来说,开发时所编译的 debug 版不开启 R8,而用于发布的 release 版适合开启 R8。但当 release 版出现崩溃收集日志时就会受到 R8 的影响。

解决方案

在开启 R8 优化后编译 release 版时会生成一个 mapping 文件,该文件记录了混淆时所有对应的方法,使用该文件即可对记录的堆栈跟踪信息进行反混淆。

文章作者: GoodBoyboy
文章链接: https://blog.goodboyboy.top/posts/895802776.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 GoodBoyboy 's Blog|惬意小屋-点滴记忆!

R8 是由 Google 开发的**代码压缩和混淆工具**,用于优化 Android 应用的代码体积和性能。它是 **ProGuard 的替代工具**,在 Android Gradle 插件 3.4 及以上版本中默认启用。 --- ### ✅ R8 的主要功能 R8 主要完成以下几项关键优化任务: #### 1. **代码压缩(Code Shrinking)** - 自动移除应用中未使用的类、方法、字段等。 - 通过分析应用的调用链,确定哪些代码不会被执行。 - 支持资源压缩(配合 `shrinkResources true` 使用)。 ```gradle buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } ``` #### 2. **代码混淆(Obfuscation)** - 将类名、方法名、字段名替换为简短无意义的名称(如 a、b、c)。 - 提高反编译难度,增强应用安全性。 - 可通过 `proguard-rules.pro` 配置保留特定类或方法不被混淆。 #### 3. **代码优化(Optimization)** - 对 Java 字节码进行优化,如: - 内联常量 - 删除无用的异常处理代码 - 合并重复的类和方法 - 优化控制流和数据流 - 优化后的代码执行效率更高,占用内存更少。 #### 4. **Dex 合并(Desugaring 支持)** - R8 支持将 Java 8+ 的语言特性(如 lambda、default interface methods)转换为 Android 可兼容的字节码。 - 合并多个 `classes.dex` 文件为一个或多个 dex 文件,适配 Dalvik 和 ART 虚拟机。 --- ### ✅ R8 与 ProGuard 的区别 | 特性 | R8 | ProGuard | |------|----|----------| | 性能 | 更快,使用 Java 编写 | 较慢,使用 Java 编写 | | 输出代码 | 更小,优化更彻底 | 优化有限 | | 支持 Desugaring | ✅ 支持 | ❌ 不支持 | | 默认启用 | Android Gradle 插件 3.4+ 默认使用 | 需手动启用 | | 混淆规则兼容性 | ✅ 完全兼容 ProGuard 规则 | N/A | --- ### ✅ R8 的工作流程 1. **Java/Kotlin 编译成 `.class` 文件** 2. **Desugaring 转换 Java 8+ 特性** 3. **R8 进行代码压缩、混淆、优化** 4. **转换为 `.dex` 文件** 5. **打包成 APK 或 AAB** --- ### ✅ R8 优化的典型效果 | 优化前 | 优化后 | |--------|--------| | APK 体积:30MB | APK 体积:18MB | | 方法数:45,000 | 方法数:25,000 | | 启动时间:1.2s | 启动时间:1.0s | --- ### ✅ R8 优化配置(proguard-rules.pro) ```proguard # 保留 Application 类 -keep public class * extends android.app.Application # 保留 Fragment、Activity 等组件 -keep public class * extends android.app.Activity -keep public class * extends android.app.Fragment # 保留 Gson 等库的模型类 -keep class com.example.model.** { *; } # 保留枚举类 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } ``` --- ### ✅ 查看优化结果 在构建完成后,可以在以下路径查看优化日志和映射文件: - `app/build/outputs/mapping/release/mapping.txt`:混淆类名与原始类名的对应关系。 - `app/build/outputs/logs/r8-xxx.txt`:R8 构建过程中的日志信息。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值