Android库混淆问题:编译App时未触发Library的ProGuard及AAR生成
这个问题我之前帮不少开发者排查过,Gradle Android插件3.0+引入的增量构建优化确实会带来这个困扰——为了加快构建速度,默认情况下app模块的构建不会触发依赖库的混淆任务,而是直接复用库的未混淆构建产物。不过我们完全可以通过配置强制让app构建时触发库的混淆及AAR生成,下面给你几个可行的方案:
方案1:让App依赖Library的混淆构建变体
最直接的方式是在Library中定义一个开启混淆的构建变体,然后让App明确依赖这个变体。
首先在Library的build.gradle(或build.gradle.kts)中配置混淆的构建类型:
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } // 可选:专门创建一个用于测试混淆的变体,避免影响正式release minifiedTest { initWith release minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
然后在App的build.gradle中修改依赖配置,指定依赖Library的混淆变体:
dependencies { // 依赖Library的minifiedTest变体,替换成你定义的混淆变体名称即可 implementation project(path: ':library', configuration: 'minifiedTest') }
这样执行./gradlew :app:assemble时,Gradle会自动触发Library的混淆任务并生成对应的AAR。
方案2:让App的构建任务显式依赖Library的混淆任务
如果不想修改依赖变体,可以直接在App的构建脚本中,让App的assemble任务依赖Library的混淆构建任务。
在App的build.gradle中添加以下配置:
// 让App的assembleRelease任务依赖Library的assembleMinifiedTest任务 tasks.named('assembleRelease').configure { dependsOn ':library:assembleMinifiedTest' } // 如果需要Debug构建也触发混淆,同理添加 tasks.named('assembleDebug').configure { dependsOn ':library:assembleMinifiedTest' }
这里的assembleMinifiedTest要对应你Library中开启混淆的构建变体的assemble任务(比如如果是release变体,就是:library:assembleRelease)。执行./gradlew :app:assembleRelease时,会先完成Library的混淆构建,再继续App的构建流程。
方案3:临时禁用Library的构建缓存(不推荐)
如果只是临时测试需要,可以禁用Library的构建缓存,强制Gradle重新执行所有任务(包括混淆)。在Library的build.gradle中添加:
android { buildCache { enabled false } }
注意:这个方案会显著降低构建速度,只适合临时排查问题,不建议长期使用。
额外注意事项
- 确保Library对应的构建变体已经开启
minifyEnabled true,并且配置了正确的ProGuard规则文件; - 如果你使用的是Android Gradle Plugin 7.0+,语法和旧版本略有差异,比如
tasks.named是推荐的任务配置方式,替代旧版的tasks.findByName; - 测试完成后,记得根据实际需求调整配置,避免不必要的混淆任务影响日常开发效率。
内容的提问来源于stack exchange,提问作者HotIceCream




