启用R8配置后AAB的res目录资源混淆未生效问题求助
Android App Bundle(AAB)资源名称混淆问题解决方法
问题原因
APK构建时会直接对资源名称进行混淆打包,但AAB为适配Google Play动态交付的默认逻辑,默认保留原始资源名称——即使开启isShrinkResources = true,也不会自动触发资源名混淆。
解决步骤
- 添加AAPT资源混淆配置
在模块级build.gradle的android块中新增aaptOptions配置,强制开启资源名称混淆:
android { // 其他原有配置... aaptOptions { cruncherEnabled = false // 可选,关闭资源压缩以避免干扰混淆逻辑 // 指定资源混淆规则文件,与R8规则复用即可 resourceProguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } buildTypes { release { isMinifyEnabled = true isShrinkResources = true isDebuggable = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = signingConfigs.getByName("release") resValue("string", "app_name", "${project.extra["appName"]}") } } }
- 清理ProGuard规则中的资源保留项
检查proguard-rules.pro文件,确保没有添加强制保留资源名称的规则:
- 避免
-keep class com.yourpackage.** { *; }这类可能间接保留资源引用的规则 - 如果需要保留特定资源(如
app_name),可通过-keepresourcefiles strings/app_name.xml精准配置,不要全局保留资源
- 正确验证AAB的资源混淆结果
构建AAB后,不要直接解压查看根目录的res文件夹(AAB原始结构会保留未混淆的资源文件用于编译),需通过Android Studio的Build > Analyze APK/AAB工具打开生成的AAB,查看base/resources.arsc中的资源名称是否已被混淆。
注意事项
开启AAB资源混淆后,不会影响Google Play的动态交付功能,混淆后的资源仍能正常被Play商店拆分和分发。
内容的提问来源于stack exchange,提问作者qi fan
相关产品推荐
相关产品推荐

