AGP 7.3.1清单合并失败求助:namespace与applicationId配置冲突
为什么会出现这个冲突?
AGP 7.0+ 开始,namespace 参数会自动注入到所有 AndroidManifest.xml 的 <manifest> 标签的 package 属性中,用来替代原来 Manifest 里的 package 承担资源命名空间、R 类包名的作用。你遇到的冲突本质是:
- AGP 自动给所有 Manifest 注入了
package="org.sample.packageid"(来自你配置的namespace) - 但某个 Manifest 文件(或构建缓存)中还存在旧的
package="org.sample.appid"(对应你的applicationId)
两者无法合并,因为 Manifest 的<manifest>属性不支持合并逻辑,必须保持一致。
你说已经移除了所有 Manifest 的 package 属性,但冲突依然存在,大概率是构建缓存残留或者某个 Manifest 文件没清理彻底(比如 debug 清单的分支文件、被忽略的变体清单)。
解决步骤
彻底检查所有 Manifest 文件
遍历src/main/、src/debug/、src/release/以及所有 product flavor 对应的 Manifest,确保没有任何<manifest>标签带有package属性。可以用 Android Studio 的全局搜索功能(Ctrl+Shift+F)搜索manifest@package或package=排查残留。清理构建缓存
在项目根目录执行命令:# Windows gradlew clean # Mac/Linux ./gradlew clean清除所有旧的构建产物和缓存,避免 AGP 使用之前缓存的 Manifest 内容。
Invalidate Caches 并重启 Android Studio
点击顶部菜单File > Invalidate Caches...,勾选Invalidate and Restart,彻底清除 IDE 缓存。确认变体配置无冲突
检查build.gradle.kts中是否为 debug 变体单独设置了namespace,比如:android { buildTypes { debug { // 不要在这里设置与全局不一致的 namespace // namespace = "..." applicationIdSuffix ".debug" // 此配置允许,不会影响 package 属性 } } }确保所有变体的
namespace与全局配置一致,applicationId可通过后缀修改,但不会影响 Manifest 的 package 属性。
补充:namespace 和 applicationId 的区别
namespace:决定资源的命名空间、R 类的包名,是代码和资源的逻辑包名,必须与所有 Manifest 中自动注入的 package 属性一致。applicationId:是应用在 Android 系统中的唯一标识,用于安装、推送、权限等,与 namespace 可以不同,但不会影响 Manifest 的 package 属性。
内容的提问来源于stack exchange,提问作者don11995

