承接上一篇《资源瘦身:shrinkResources 与图片压缩》讲完的资源线,这一篇进入代码线:R8 与 ProGuard 规则。R8 是 AGP 默认的收缩工具,职责有三项——移除未被引用的代码、方法内联与去虚拟化、名字混淆与优化。这三项都会改变运行时的行为边界,而改变的方式往往是间接的:代码被移除、字段被改名、调用被内联,于是"反射拿不到"、"序列化字段名变了"、"跨进程接口对不上"。混淆类事故的特点是低频、难复现、堆栈不可读,这决定了排查方式必须前置到规则设计阶段。
R8 做了哪三件事
把三件事分开讲,才能定位问题归属:
| 能力 | 做什么 | 典型副作用 |
|---|---|---|
| 收缩(shrinking) | 删除不可达的类与方法 | 反射/动态调用找不到类 |
| 优化(optimizing) | 内联、去虚拟化、常量传播、类合并 | 堆栈被折叠、方法名合并 |
| 混淆(obfuscation) | 类名/方法名/字段名替换为短名 | 序列化字段名变化、日志不可读 |
| (伴随)资源收缩 | 依据 R8 分析结果删资源 |