Android集成SDK依赖冲突场景分析及解决

392 阅读2分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

一、Duplicate class类型错误1

错误内容:

Duplicate class xxx1 found in modules xxx2(com.demo.a:1.0.0) and xxx3(com.demo.b:1.0.0)

错误原因:

相同路径的类出现在不同的aar或者jar(com.demo.a和com.demo.b)包中

错误定位:

在com.demo.a和com.demo.b中去查找xxx1,可以发现相同的路径的类分别存在这两个aar里面

解决方式:

排除其中一个包中的文件,但如果该类在一个aar的jar包中,则无法进行排除

1:可以在指定的引用了该aar下排除

implementation(rootProject.ext.dependencies["xxx"]) {
    exclude group: 'com.demo.a', module: 'xxx'
}
2:全局排除(如果很多个aar中依赖了serialport的话,用这个方式)

configurations {
  all*.exclude group: 'com.demo.a', module: 'xxx'
}

注:这种情况需查看两者中的类试下是否一致,因为最终只会使用到未排除掉的类

二、Duplicate class类型错误2

错误内容:

Duplicate class xxx1 found in modules xxx2(xxx.jar) and xxx3(com.demo.a:1.0.0)

错误原因:

相同的路径的类存在jar包和aar中

错误定位:

在xxx.jar和com.demo.a:1.0.0中搜索xxx1,可以发现xxx1分别存在jar包和aar中

解决方式:

这里存在一种场景,com.demo.a:1.0.0这个aar可能在项目中并没有直接依赖,此时需要找到com.demo.a:1.0.0的父依赖。可以在命令行执行 ./gradlew app:dependencies,可以看到所有依赖树,然后把内容拷贝出来,在里面搜索com.demo.a:1.0.0查看其父依赖是什么,确定了父依赖后,可以对齐进行排除

 implementation(rootProject.ext.dependencies["xxx"]) {
        exclude group: 'com.demo.a', module: 'xxx'
 }

三、java.lang.NoSuchMethodError: No virtual method xxx 类型错误

错误内容(运行时报错):

java.lang.NoSuchMethodError: No virtual method init (Lcom/com/demo/a/http)

错误原因:

运行时报错,提示SDK中某个方法不存在。出现这个情况的主要原因是sdk中与我们项目中引用到了相同的库,但是版本不同,项目打包出来默认会使用高版本的aar,而高版本的aar中不存在该方法导致

出错分析:

可以在Android Studio的依赖列表中找到相同该aar依赖最高版本,并在报错内容中定位到报错位置查看,可以发现在高版本aar依赖中不存在指定的方法

解决方式:

强制指定使用指定版本的库

configurations.all {
    resolutionStrategy.eachDependency {
        DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == "com.demo.a") {
                if (requested.name == "xxx") {
                    details.useVersion "1.0.x"
                }
            }
    }
}
注:如果高低版本的库,再对应使用方都有不同的实现方法,则不能强制指定使用,需更改对应库的实现