Android App 多语言切换失效问题的解决方案

发布到 google play 后应用多语言切换失效,仅保留英文,根本原因是 android app bundle(aab)默认按设备语言启用语言资源分包,导致非系统语言的字符串资源被动态移除。

在使用 Android App Bundle(.aab)发布应用至 Google Play 时,Google Play 会根据用户设备的系统语言自动下发对应语言资源,同时剥离其他未匹配的语言资源文件(如 strings.xml 的德语、库尔德语等)。这意味着:即使你的应用完整支持 4 种语言,若用户设备系统语言为 English,Play Store 下发的安装包中将只包含 values/(默认)和 values-en/ 资源,而 values-de/、values-ku/ 等目录会被完全剔除——导致运行时调用 Configuration.setLocale() 切换语言后,因缺少对应 strings.xml 文件而回退至默认英文。

✅ 正确解决方案:禁用 AAB 的语言分包功能
在模块级 build.gradle(通常为 app/build.gradle)中添加以下配置,强制将所有语言资源打包进最终 AAB:

android {
    // ... 其他配置(compileSdk、defaultConfig 等)

    bundle {
        language {
            enableSplit = false  // ? 关键:关闭语言资源分包
        }
    }

}

⚠️ 注意事项:

  • 此配置仅影响语言资源(res/values-xx/),不影响 APK/AAB 的其他优化(如 ABI、DENSITY 分包仍可保留);
  • 修改后需彻底清理并重建项目(./gradlew clean && ./gradlew bundleRelease),确保新 AAB 包含全部语言资源;
  • 在 strings.xml 中务必为每种语言提供完整键值对(缺失 key 将 fallback 到默认 values/strings.xml);
  • 若使用 AppCompatDelegate.setApplicationLocales()(AndroidX 1.6.0+)或手动 Resources.updateConfiguration(),请确保切换逻辑无误,但本问题根源在于资源缺失,而非代码逻辑错误。

? 补充建议:

  • 可通过 aapt2 dump resources app-release.aab 或解压 AAB 的 base/resources.pb 验证语言资源是否已全部打包;
  • 如需兼顾包体积与多语言灵活性,可考虑将非主流语言资源以远程方式动态加载(如 Play Asset Delivery + 自定义本地化框架),但会显著增加复杂度;对中小规模多语言应用,禁用 enableSplit 是最直接、可靠且兼容性最佳的方案。