这是我参与更文挑战的第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"
}
}
}
}
注:如果高低版本的库,再对应使用方都有不同的实现方法,则不能强制指定使用,需更改对应库的实现