多动态模块依赖MLKit时Manifest合并失败问题求助
问题概述
我有两个Android动态模块:
- 条码扫描模块:依赖
com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0 - 人脸检测模块:依赖
com.google.android.gms:play-services-mlkit-face-detection:17.1.0
最初遇到com.google.mlkit:vision-common重复依赖的问题,于是将公共依赖提取到独立项目生成mlkitcommon.aar,并以此作为依赖引入。但现在出现Manifest合并失败:
Manifest merger failed : Attribute meta-data#com.google.mlkit.vision.DEPENDENCIES@value value=(android:value) from AndroidManifest.xml:24:13-42
is also present at [:facedetector] AndroidManifest.xml:25:13-33 value=(face).
建议:在AndroidManifest.xml:23:9-27:15的元素中添加'tools:replace="android:value"'以覆盖。
模块依赖关系:
+------------------+ +-------------------+ | App Module | | mlkitcommon.aar | +---------+--------+ +---------+---------+ | | +-----------+------------+ | | v +------------+-------------+ | | v v +--------+---------+ +----------+--------+ | Dynamic Module 1 | | Dynamic Module 2 | | - Depends on App | | - Depends on App | | Module and | | Module and | | mlkitcommon.aar| | mlkitcommon.aar | +------------------+ +-------------------+
解决方案
1. 按提示添加tools:replace属性
先在主App模块的AndroidManifest.xml根标签声明tools命名空间:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="your.package.name">
然后在<application>标签或目标<meta-data>元素上添加tools:replace="android:value",强制覆盖冲突属性:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" tools:replace="android:value">
如果只想针对特定meta-data处理,也可以直接在该元素上配置,同时合并两个模块的value值:
<meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="barcode,face" tools:replace="android:value" />
2. 清理公共aar中的冗余Manifest配置
检查mlkitcommon.aar的Manifest文件,若其中包含com.google.mlkit.vision.DEPENDENCIES的meta-data,直接删除这条配置。让各个动态模块自行保留对应meta-data,从根源上避免合并冲突。
3. 调整依赖结构避免重复引入
在动态模块的build.gradle中,直接依赖对应ML Kit库,并排除公共aar中的重复依赖:
// 条码扫描模块示例 implementation(project(':mlkitcommon')) { exclude group: 'com.google.mlkit', module: 'vision-common' } implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0'
人脸检测模块做类似配置,确保每个模块只引入自身所需的ML Kit库,消除依赖传递带来的冲突。
总结
优先选择方案1或2解决问题:方案1快速直接,按系统提示修改即可;方案2更彻底,避免后续扩展模块时再次出现同类问题。
内容的提问来源于stack exchange,提问作者Harish Gyanani

