Skip to content

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")
    }
}