问题背景
我们在做日常的项目开发时经常会需要对接三方SDK或者使用一些三方依赖库已完成项目的需求,但是有时候会在拉入依赖库后报错库文件冲突。
例如今天编译的时候遇到的:
[com.android.support:animated-vector-drawable:28.0.0] C:\Users\code\.gradle\caches\transforms-4\4eb05916f8dcbe9e7330b5deb1cf4b0a\transformed\animated-vector-drawable-28.0.0\AndroidManifest.xml Warning: Namespace 'android.support.graphics.drawable' is used in multiple modules and/or libraries: com.android.support:animated-vector-drawable:28.0.0, com.android.support:support-vector-drawable:28.0.0. Please ensure that all modules and libraries have a unique namespace.
上面只是一个很普通的例子;
报错原因
由于你的项目中同时使用了 AndroidX 库和旧的 Android 支持库 (android.support
) 之间的冲突。这些库中有相同的类和属性,因此在编译时会产生冲突。
解决方案
1.迁移到 AndroidX
确保你的项目完全迁移到 AndroidX。旧的 android.support
库和 AndroidX 库不能共存,所以你需要将所有的 android.support
依赖项替换为相应的 AndroidX 依赖项。
在 gradle.properties
文件中添加以下行,确保项目迁移到 AndroidX:
android.useAndroidX=true
android.enableJetifier=true
2.tools:replace
手动处理冲突
如果不能完全迁移到 AndroidX 或者你的项目中有第三方库依赖旧的 android.support
,咱们可以尝试以下方式手动处理冲突
在 AndroidManifest.xml
中添加 tools:replace
以覆盖冲突的属性。例如:
<application
android:allowBackup="true"
tools:replace="android:appComponentFactory"//这一行
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
</application>
tips:这玩意儿有时候治标不治本,会导致其他问题
3.排除冲突的依赖项
可以尝试在 build.gradle
文件中排除冲突的依赖项。
这是我常用的一个方法,因为之前Glide有个版本的库比较老,但是里面有个图片处理的功能,我经常用到,就会使用下面的方法把support库给干掉
build.gradle文件(app下的)
implementation('ai.advance.mobile-sdk.android:liveness-detection-ui:1.1.1') {
exclude group: 'com.android.support'
}
implementation('ai.advance.mobile-sdk.android:liveness-detection:1.1.1') {
exclude group: 'com.android.support'
}
4.联系第三方库支持
如果这个问题持续存在,可以联系第三方库的支持团队,询问是否有专门的 AndroidX 版本或者推荐的解决方案。
5.更改依赖的方式
我们平时使用一些三方库,一般都是直接在build.gradle直接引用,然后自己调用人家的API就行了,但仔细想想,我们还可以使用AAR依赖和module依赖。
我们可以直接去github把他代码拿过来,进行二开,以module的形式引入项目进行依赖,哪儿不对就改改,还可以定制化开发。