ProGuard → R8
老写法(Groovy --- ProGuard)
groovy
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
手动维护 proguard-rules.pro:
kotlin
-keep class com.example.model.** { *; }
-keep class com.google.gson.** { *; }
-dontwarn okhttp3.**
问题在哪里
ProGuard 是第三方工具,被 R8 替代。R8 是 Google 自己的实现,编译期做代码收缩(shrink)、优化(optimize)、混淆(obfuscate),比 ProGuard 更快,产生的 DEX 更小。
新写法(R8)
R8 从 AGP 3.4+ 开始就是默认的代码压缩器,不需要额外配置。proguardFiles 的规则 R8 兼容读取------绝大多数 ProGuard 规则不需要改。
需要检查的点:
groovy
// 确认 gradle.properties 里没有强制用 ProGuard
# android.enableR8=false ← 删掉这行
如果某些库的 ProGuard 规则不兼容 R8(极其罕见),可以在 proguard-rules.pro 里针对调整:
csharp
# R8 默认更激进,某些反射调用需要额外保留
-keep class com.oldlib.ReflectionHelper { *; }
一句话注意
R8 和 ProGuard 的 Keep 规则语法完全兼容,迁移时基本不需要改规则文件。R8 主要改进在内部------inline、class merging、dead code elimination 比 ProGuard 更彻底,同样的项目 R8 产出的 APK 平均小 5-10%。
如果开启了 isMinifyEnabled = true 但感觉没效果,检查有没有在 build 日志里看到 R8 运行信息。没有的话可能是 gradle.properties 里被某个配置禁用了。
Java Android 老项目迁移系列,持续更新中。