混淆与代码优化 (R8)
在 Gradle 中,R8 是默认的代码处理工具,负责代码压缩(Shrink)、混淆(Obfuscate)和优化。
开启 R8 构建
kotlin
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true // 开启混淆
isShrinkResources = true // 开启无用资源移除
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}常用混淆规则指令
| 指令 | 描述 | 常见用途 |
|---|---|---|
-keep | 禁止混淆特定类或成员。 | 反射调用的类、JNI 方法。 |
-keepattributes | 保留特定的元数据属性。 | 保留泛型签名(Gson 解析必备)。 |
-dontwarn | 忽略特定包的警告。 | 忽略第三方库由于缺少依赖导致的假性报错。 |
混淆映射与堆栈恢复
当崩溃日志显示 a.b.c.d(Unknown Source) 时,你需要映射文件。
- 文件位置:
app/build/outputs/mapping/release/mapping.txt - ReTrace 工具: 使用
retrace.bat将混淆栈恢复为源码栈。
自定义资源缩减规则
如果 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" />组件化 Library 混淆
如果你在开发一个 SDK (Library),必须使用这个属性,让依赖该 SDK 的 App 自动应用混淆规则。
kotlin
// library/build.gradle.kts
android {
defaultConfig {
consumerProguardFiles("consumer-rules.pro")
}
}