ProGuard/R8 混淆配置
在 Gradle 中,R8 是默认的代码处理工具,负责代码压缩(Shrink)、混淆(Obfuscate)和优化。
1. 开启 R8 的标准配置
kotlin
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true // 开启混淆
isShrinkResources = true // 开启无用资源移除
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}2. 常用混淆指令规则
| 指令 | 描述 | 常见用途 |
|---|---|---|
-keep | 禁止混淆特定类或成员。 | 反射调用的类、JNI 方法。 |
-keepattributes | 保留特定的元数据属性。 | 保留泛型签名(Gson 解析必备)。 |
-dontwarn | 忽略特定包的警告。 | 忽略第三方库由于缺少依赖导致的假性报错。 |
3. 专家级排查:混淆映射 (Mapping)
当崩溃日志显示 a.b.c.d(Unknown Source) 时,你需要映射文件。
- 文件位置:
app/build/outputs/mapping/release/mapping.txt - ReTrace 工具: 使用
retrace.bat将混淆栈恢复为源码栈。
4. 自定义资源缩减 (keep.xml)
如果 isShrinkResources 误删了通过动态名加载的资源,需在 res/raw/keep.xml 中声明:
xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/dynamic_*"
tools:discard="@layout/unused_layout" />5. 组件化项目的混淆 (consumerProguardFiles)
如果你在开发一个 SDK (Library),必须使用这个属性,让依赖该 SDK 的 App 自动应用混淆规则。
kotlin
// library/build.gradle.kts
android {
defaultConfig {
consumerProguardFiles("consumer-rules.pro")
}
}