Android 升级 targetSDK 35 解决 namespace 问题

Android 升级 targetSDK 35 解决 namespace 问题

💡 原文中文,约4600字,阅读约需11分钟。
📝

内容提要

升级 Android targetSDK 至 35 和使用 Gradle 8.0+ 后,需在 build.gradle 中显式声明 namespace,因 AndroidManifest.xml 中的 package 属性已不再支持。解决方案包括自动设置 namespace、启用 buildConfig 特性及迁移配置,以确保第三方库符合新要求。

🎯

关键要点

  • 升级 Android targetSDK 至 35 和使用 Gradle 8.0+ 后,需在 build.gradle 中显式声明 namespace。
  • AndroidManifest.xml 中的 package 属性已不再支持,导致构建失败。
  • 解决方案包括自动设置 namespace、启用 buildConfig 特性及迁移配置。
  • 自动设置 namespace 使用 project.group 替代点号为下划线。
  • 在构建前自动执行修复,确保所有第三方库符合 Gradle 8.0+ 的要求。
  • 适用场景包括 React Native 和 Flutter 项目升级、使用 Detox 测试框架的项目等。
  • 此方案会自动修改第三方库的 build.gradle 和 AndroidManifest.xml 文件。
  • 建议在 CI/CD 中首次构建后检查修改是否正确。
  • 简化方案仅在内存中设置 namespace,不会修改任何文件。

延伸问答

为什么在升级 Android targetSDK 至 35 时会遇到 namespace 配置问题?

因为 Android Gradle Plugin 8.0+ 不再支持在 AndroidManifest.xml 中通过 package 属性设置 namespace,必须在 build.gradle 中显式声明。

如何在 build.gradle 中显式声明 namespace?

在项目根目录的 android/build.gradle 文件中添加代码,自动设置 namespace,启用 buildConfig 特性,并迁移配置。

适用哪些项目场景需要进行此升级?

适用场景包括 React Native 和 Flutter 项目升级、使用 Detox 测试框架的项目等。

此方案对第三方库的影响是什么?

此方案会自动修改第三方库的 build.gradle 和 AndroidManifest.xml 文件,但仅在 node_modules 中生效,不影响源码仓库。

如何验证修改是否正确?

建议在 CI/CD 中首次构建后检查修改是否正确,可以通过执行 'cd android && ./gradlew clean && ./gradlew assembleDebug' 来验证。

简化方案与完整方案有什么区别?

简化方案仅在内存中设置 namespace,不会修改任何文件,可能无法解决所有第三方库的问题,而完整方案会自动修改相关文件。

➡️

继续阅读