背景
最近在 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.xml 的 package 属性。
不同版本 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 版本号来决定是否配置,并在必要时提供一个开关来增强可控性。