Android库编译API21报错:duplicate entry: okio/AsyncTimeout$1.class
首先,你碰到的是依赖版本冲突导致的打包错误——虽然你排除了okhttp3,但问题根源在okio这个库上:Picasso本身依赖okio,而你的主项目或者其他依赖(比如ExoPlayer)大概率也引入了不同版本的okio,当编译低版本API(比如21)时,Gradle的依赖合并逻辑会把不同版本的okio类打包到一起,就出现了重复类的报错。
下面是具体的解决步骤:
1. 先定位冲突的okio来源
先执行Gradle命令查看所有依赖树,找出所有引入okio的地方:
# 如果是库项目,把app换成你的库模块名称 ./gradlew your-library-module:dependencies
在输出里搜索okio,你会看到不同模块依赖的okio版本,比如可能Picasso用了okio:1.x,而ExoPlayer或者主项目的其他库用了okio:2.x,这就是冲突的根源。
2. 统一okio版本(最直接的解决方法)
强制所有模块使用同一个稳定版本的okio,这样就能避免版本差异导致的类重复。在你的库项目或者主项目的build.gradle中添加:
configurations.all { // 选择一个兼容所有依赖的okio版本,比如1.17.5是Picasso常用的稳定版,或者根据依赖树选合适的版本 resolutionStrategy.force 'com.squareup.okio:okio:1.17.5' }
注意:如果你的其他依赖(比如ExoPlayer)需要更高版本的okio,就选对应的兼容版本,比如2.10.0,但要确认Picasso能兼容这个版本(Picasso 2.71828+是兼容okio 2.x的)。
3. 针对性排除冲突的okio依赖
如果不想强制统一版本,也可以找到引入冲突okio的那个库,排除它的okio依赖。比如假设是ExoPlayer引入了另一个版本的okio,就在ExoPlayer的依赖声明里排除:
implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X' { exclude group: 'com.squareup.okio', module: 'okio' }
这样就只会保留Picasso依赖的okio版本,避免重复。
4. 检查主项目的依赖是否重复
有时候主项目的其他依赖也会引入okio,比如如果你主项目里单独加了okio的依赖,或者其他第三方库(比如Retrofit、OkHttp)也带了okio,这时候也要确保这些地方的版本和Picasso的一致,或者排除重复的引入。
另外,你提到移除Picasso就正常,说明冲突肯定和Picasso的依赖链有关,上面的方法应该能解决问题。
内容的提问来源于stack exchange,提问作者HyperX

