升级AGP 8.3.0后Manifest合并冲突,求AdMob非抑制类解决方案
问题描述
Manifest merger failed : Attribute property#android.adservices.AD_SERVICES_CONFIG@resource
value=(@xml/ga_ad_services_config) from [com.google.android.gms:play-services-measurement-api:21.5.1]
AndroidManifest.xml:32:13-58 is also present at [com.google.android.gms:play-services-ads-lite:22.6.0]
AndroidManifest.xml:92:13-59 value=(@xml/gma_ad_services_config).
系统建议用tools:replace="android:resource"覆盖,但不想采用这种抑制方法,以下是AdMob相关的根源解决方案:
解决方案
1. 统一Google Play服务依赖版本
冲突源于不同依赖库的AD_SERVICES_CONFIG资源不一致,强制所有Google Play服务相关依赖使用同一版本:
在项目根目录的build.gradle(或build.gradle.kts)中添加版本约束:
// Groovy语法 allprojects { configurations.all { resolutionStrategy { force 'com.google.android.gms:play-services-measurement-api:22.6.0' force 'com.google.android.gms:play-services-ads-lite:22.6.0' // 其他Google Play服务相关依赖也统一到该版本 } } }
// Kotlin语法 allprojects { configurations.all { resolutionStrategy { force("com.google.android.gms:play-services-measurement-api:22.6.0") force("com.google.android.gms:play-services-ads-lite:22.6.0") } } }
选择22.6.0是为了和play-services-ads-lite版本对齐,确保广告相关依赖版本一致,消除资源冲突。
2. 移除冗余的Measurement依赖
如果项目没有直接使用Firebase Analytics或Measurement功能,可以排除play-services-measurement-api依赖:
在App模块的build.gradle中修改AdMob依赖:
// Groovy语法 implementation('com.google.android.gms:play-services-ads-lite:22.6.0') { exclude group: 'com.google.android.gms', module: 'play-services-measurement-api' }
// Kotlin语法 implementation("com.google.android.gms:play-services-ads-lite:22.6.0") { exclude(group = "com.google.android.gms", module = "play-services-measurement-api") }
注意:如果项目依赖Firebase Analytics,此方法不适用,需采用第一种方案统一版本。
3. 手动配置统一的AD_SERVICES_CONFIG资源
创建统一的ad_services_config.xml文件放在res/xml目录下,合并ga_ad_services_config和gma_ad_services_config的配置内容,然后在App的AndroidManifest.xml中显式声明:
<property android:name="android.adservices.AD_SERVICES_CONFIG" android:resource="@xml/ad_services_config" />
这种方法需要确保合并后的配置同时满足Measurement和AdMob的需求,适合有自定义配置需求的场景。
内容的提问来源于stack exchange,提问作者Sohaib Ahmed

