Android Studio构建失败:Program type already present: okhttp3.Call$Factory求助
解决「Program type already present: okhttp3.Call$Factory」构建错误
这个错误我之前帮好几个开发者排查过,本质就是依赖冲突——你的项目里有两个不同来源的依赖包都包含了okhttp3.Call$Factory这个类,D8编译器在合并字节码的时候发现重复定义,直接抛出了这个晦涩的错误。下面给你一步步的解决办法:
第一步:找出重复依赖的来源
先搞清楚到底是哪两个依赖在抢着引入okhttp:
- 打开Android Studio底部的Terminal,执行命令(Windows用户把
./gradlew换成gradlew.bat):./gradlew app:dependencies - 在输出的依赖树里搜索
okhttp,你会看到哪些依赖直接/间接引入了它——比如可能是你自己加的okhttp依赖,和某个第三方SDK自带的旧版okhttp撞了,或者两个不同的第三方库都带了okhttp。
第二步:根据情况解决冲突
方法1:排除重复的间接依赖
如果发现某个第三方库(比如com.xxx.xxx:sdk:1.0.0)偷偷引入了okhttp,就在它的依赖声明里把okhttp排除掉,让它用你项目里统一的版本:
implementation('com.xxx.xxx:sdk:1.0.0') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' }
方法2:统一okhttp版本
如果你的build.gradle里没有直接声明okhttp依赖,建议直接加一个明确的稳定版本,强制所有间接依赖都使用这个版本:
implementation 'com.squareup.okhttp3:okhttp:4.11.0' // 可以换成你需要的最新稳定版
Gradle会自动用这个版本覆盖所有间接引入的旧版本,避免冲突。
方法3:检查libs目录下的jar包
你的依赖配置里有implementation fileTree(include: ['*.jar'], dir: 'libs'),去项目的libs文件夹看看有没有okhttp相关的jar包。如果有,同时gradle依赖里又加了okhttp,就会导致重复——要么删掉libs里的jar包,要么删掉gradle里的okhttp依赖,二选一即可。
最后一步:清缓存重启
修改完依赖后,记得点击Android Studio顶部的File -> Invalidate Caches... -> Invalidate and Restart,清理一下缓存再重新构建,很多时候冲突解决后缓存还会残留旧的字节码,导致问题反复。
内容的提问来源于stack exchange,提问作者Sebastien
相关产品推荐
相关产品推荐

