Android Gradle Plugin 不同版本下 namespace 适配方案总结

386 阅读1分钟

背景

最近在 Android Gradle Plugin(AGP)升级的过程中,有客户反馈针对一些较老的 SDK 在 AGP 8.0 的环境下会出现找不到 namespace 的问题。

Namespace not specified. Specify a namespace in the module's build file.

这是因为从 AGP 7.3 开始,namespace 成为了 强制配置。而在此之前的版本里,项目并没有 namespace 这个 DSL 字段,包名默认取自 AndroidManifest.xmlpackage 属性。

不同版本 AGP 对 namespace 的要求

  • AGP < 7.0

    • 没有 namespace 概念
    • 包名取自 AndroidManifest.xml 中的 package
  • AGP 7.0 ~ 7.2

    • namespace 字段存在
    • 可以不配置,继续沿用 Manifest 中的 package
  • AGP ≥ 7.3

    • namespace 成为必填字段
    • 如果缺失会直接编译报错

可行的解决方案

AGP 内部有 com.android.Version 可以获取插件版本号。 解析版本号后,可以决定是否需要强制写入 namespace

import com.android.Version
def agpVersion = Version.ANDROID_GRADLE_PLUGIN_VERSION
def needNamespace = agpVersion.tokenize('.')[0].toInteger() >= 7 &&
        agpVersion.tokenize('.')[1].toInteger() >= 3
println ">>> Current AGP Version: $agpVersion"

android {
    if (needNamespace) {
        namespace "com.example.mylibrary"
    }
	
	...
}

总结

AGP 对 namespace 的要求是随着版本演进而改变的:

  • 老版本靠 Manifest.package
  • 新版本必须写 namespace

如果你需要跨版本兼容,最推荐的方式是 解析 AGP 版本号来决定是否配置,并在必要时提供一个开关来增强可控性。