Android动态功能模块重复库引入问题的解决方案咨询
Android动态功能模块重复库引入构建错误解决方案探索
问题场景
开发包含动态功能模块的Android项目时,遇到重复库引入导致的构建失败。具体依赖情况:
- 人脸检测模块依赖:
com.google.android.gms:play-services-mlkit-face-detection:17.1.0 - 条码扫描模块依赖:
com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0
构建错误信息:
Execution failed for task ':app:checkDebugLibraries'. [:dynamicfeature2, :facedetector] all package the same library [androidx.exifinterface:exifinterface;Capability: group='androidx.exifinterface', name='exifinterface']. [:dynamicfeature2, :facedetector] all package the same library [com.google.android.odml:image;Capability: group='com.google.android.odml', name='image']. [:dynamicfeature2, :facedetector] all package the same library [com.google.mlkit:vision-common;Capability: group='com.google.mlkit', name='vision-common']. [:dynamicfeature2, :facedetector] all package the same library [com.google.mlkit:vision-interfaces;Capability: group='com.google.mlkit', name='vision-interfaces'].
已排除的解决方案
- 不考虑创建基础模块:仅拥有其中一个模块的所有权,且尝试相关方案后仍存在其他问题
- 不考虑将公共库放入app模块:会导致基础APK体积显著增大,不符合需求
可行解决方案尝试
1. 强制统一公共依赖版本
在项目根目录的settings.gradle中通过版本目录统一声明冲突库的版本,确保所有模块使用相同版本的依赖:
dependencyResolutionManagement { repositories { google() mavenCentral() } versionCatalogs { libs { version('exifinterface', '1.3.6') version('odml-image', '1.0.0') version('mlkit-vision-common', '16.3.0') version('mlkit-vision-interfaces', '16.0.0') } } }
也可以在模块的build.gradle中排除冲突的传递依赖,再手动引入统一版本:
// 条码扫描模块中排除冲突依赖 implementation('com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0') { exclude group: 'androidx.exifinterface', module: 'exifinterface' exclude group: 'com.google.android.odml', module: 'image' exclude group: 'com.google.mlkit', module: 'vision-common' exclude group: 'com.google.mlkit', module: 'vision-interfaces' } // 手动引入与人脸检测模块一致的版本 implementation 'androidx.exifinterface:exifinterface:1.3.6' implementation 'com.google.android.odml:image:1.0.0' implementation 'com.google.mlkit:vision-common:16.3.0' implementation 'com.google.mlkit:vision-interfaces:16.0.0'
2. 使用依赖解析策略强制对齐版本
在项目根目录的build.gradle中配置全局依赖解析策略,强制所有模块使用指定版本的冲突库:
allprojects { repositories { google() mavenCentral() } configurations.all { resolutionStrategy { force 'androidx.exifinterface:exifinterface:1.3.6' force 'com.google.android.odml:image:1.0.0' force 'com.google.mlkit:vision-common:16.3.0' force 'com.google.mlkit:vision-interfaces:16.0.0' } } }
3. 调整动态模块依赖方式
若有权限修改的模块为其中一个动态功能模块,可将该模块的公共依赖声明为api,另一个模块通过依赖该模块来共享公共库,避免重复打包:
// 人脸检测模块中使用api声明依赖 api 'com.google.android.gms:play-services-mlkit-face-detection:17.1.0' // 条码扫描模块中依赖人脸检测模块,而非直接引入MLKit条码扫描依赖 implementation project(':facedetector') implementation('com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0') { // 排除已通过人脸检测模块引入的公共依赖 exclude group: 'androidx.exifinterface', module: 'exifinterface' exclude group: 'com.google.android.odml', module: 'image' exclude group: 'com.google.mlkit', module: 'vision-common' exclude group: 'com.google.mlkit', module: 'vision-interfaces' }
内容的提问来源于stack exchange,提问作者Harish Gyanani
相关产品推荐
相关产品推荐

