2、R8的安装与配置:在Gradle中启用R8,混淆规则文件的引入,minifyEnabled与proguardFiles配置
这一章聊的是最基础的环节——怎么让R8跑起来。很多人刚接触时,以为把minifyEnabled设成true就完事了。嗯,没那么简单。我自己第一次配置时,顺手写错了proguardFiles的路径,结果编译通过但运行直接崩溃,查了大半天才发现规则文件根本没生效。今天就把这块掰开揉碎讲清楚。
2.1 在Gradle中启用R8
从Android Gradle Plugin 3.4.0开始,R8就已经是默认的代码缩减和混淆工具了。你不用再手动指定useProguard,因为Google已经把它彻底替换掉了ProGuard。说白了,只要你在build.gradle里配好开关,R8就会自动接管。
打开你的app/build.gradle,找到release构建类型,像下面这样写:
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
}
关键点:
minifyEnabled true——开启代码缩减(去掉没用到的代码)和混淆(把类名、方法名改成短字母)。proguardFiles——引入混淆规则文件。第一个参数是Android SDK自带的默认规则,第二个是你的自定义规则。
我跟你说个坑:如果你用了多模块项目,别忘了每个模块也要加proguardFiles。我之前一个项目,子模块没配规则,R8把子模块的接口全混淆了,运行直接报ClassNotFoundException。排查了整整一下午。
2.2 minifyEnabled 与 proguardFiles 配置详解
| 配置项 | 作用 | 注意事项 |
|---|---|---|
minifyEnabled true |
启用代码压缩(去掉无用代码) + 混淆(重命名类/方法/字段) + 优化(内联、合并) |
仅用于release构建。 debug环境下建议设为 false,否则调试困难 |
proguardFiles |
指定规则文件列表 | 可以写多个文件,用逗号或换行分隔。 顺序重要:后面的文件会覆盖前面的相同规则 |
getDefaultProguardFile('proguard-android-optimize.txt') |
加载Android SDK里的默认混淆规则 | 路径在<SDK>/tools/proguard/下。有 proguard-android.txt(不优化)和proguard-android-optimize.txt(启用优化)两个版本 |
proguard-rules.pro |
你自己写的规则文件(通常放在模块根目录) | 文件名可以任意,但约定俗称用proguard-rules.pro |
我个人的习惯:会在debug构建类型里也开启minifyEnabled false但加上proguardFiles(只是不执行),这样IDE里能看到规则文件是否被正确引用。调试时我只需把minifyEnabled临时改成true即可验证问题。
2.3 混淆规则文件的引入方式
除了直接在build.gradle里写proguardFiles,还有几种常见用法,我列一下:
- 直接文件路径:
'proguard-rules.pro'——放模块根目录最稳妥。 - 从外部库引入:一些第三方SDK会自带混淆规则,通过
consumerProguardFiles自动合并到主项目(后面章节会细讲)。 - 多规则文件:你可以把规则拆成多个文件,比如
keep-rules.pro、model-rules.pro,然后全都列在proguardFiles后面:
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro',
'keep-rules.pro',
'model-rules.pro'
我曾经碰上过这样一个问题:两个规则文件里对同一个类写了冲突的-keep和-dontwarn,结果R8完全没报错,但反射调用那个类时一直失败。排查到最后发现是第二个规则文件覆盖了第一个的-keep。所以,建议把“保留”类的规则单独放一个文件,尽量别在不同文件里重复定义同一规则。
2.4 验证R8是否真的启用了
配置完别急着跑,先检查一下。最简单的方法:执行./gradlew assembleRelease,然后在build/outputs/mapping/release/下看看有没有生成以下文件:
mapping.txt—— 混淆映射表(原始类名→混淆后类名)seeds.txt—— 被保留未混淆的类和方法usage.txt—— 被移除的代码
如果看不到这些文件,说明R8没跑起来。常见原因:
minifyEnabled忘了设为true- 构建类型选成了
debug(默认debug不混淆) - AGP版本太老(低于3.4.0),需要手动
useProguard false才能启用R8
2.5 本章知识结构图
下面这张图把所有配置要素串联起来了,你一看就明白:
简单总结一下:你只需要在 release 构建类型里把minifyEnabled设为true,再把proguardFiles指向正确的规则文件,R8就会自动干活。唯一要留意的是,proguard-android-optimize.txt一定要写对路径,我见过有人直接手敲文件名但忘了调用getDefaultProguardFile方法,结果编译报错说找不到文件——这种低级错误其实很容易避免。