如何在Android App Bundle(AAB)中实现资源文件混淆?
AAB格式下资源文件混淆实现方案
minifyEnabled = true触发的原生资源混淆仅对APK构建生效,AAB的构建流程与分发逻辑和APK不同,原生AGP默认不会在AAB本地构建阶段应用资源混淆规则,因此原配置不生效。
实现方案
方案一:使用AndResGuard实现本地AAB资源混淆
这是目前兼容性最好、可控性最高的方案,步骤如下:
- 第一步:在项目根目录
build.gradle中添加插件依赖
buildscript { dependencies { // 替换为最新稳定版本即可 classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21' } }
- 第二步:在App模块
build.gradle开头引入插件
apply plugin: 'AndResGuard'
- 第三步:在App模块
build.gradle中添加混淆配置,核心是开启AAB支持
andResGuard { use7zip = true useSign = true // 开启AAB资源混淆的核心开关 enableAab = true // 配置资源白名单:所有通过字符串动态拼接引用的资源都需要加入此处,避免运行时找不到资源 whiteList = [ "R.mipmap.ic_launcher*", "R.drawable.notification_icon", // 按需添加其他需要保留原名的资源 ] }
- 第四步:构建时执行
resguardReleaseGradle任务,输出的AAB默认路径为app/build/outputs/apk/release/AndResGuard_${appName}/,已经完成全量资源混淆。
方案二:AGP 7.0+ 原生AAB资源混淆
如果你的项目AGP版本在7.0及以上,可以用官方原生配置:
- 在App模块
build.gradle的release构建类型中添加如下配置:
android { buildTypes { release { minifyEnabled true shrinkResources true androidResources { // 开启资源名混淆 enableResourceObfuscation = true } } } }
注意:该方案的资源混淆不会在本地构建的AAB中直接生效,Google Play在收到AAB后,为不同设备生成拆分APK时才会应用混淆规则,因此本地解压AAB仍然会看到原始资源名,属于正常逻辑。
通用注意事项
- 所有通过
getIdentifier()等动态方法引用的资源,必须加入混淆白名单,否则会出现运行时资源找不到的崩溃。 - 资源混淆生成的mapping文件需要单独存档,后续排查线上问题时可以通过映射文件还原原始资源名。
内容的提问来源于stack exchange,提问作者CohenKosherStore
相关产品推荐
相关产品推荐

