Android Program type already present问题解决
最近遇到一个很神奇的问题,一个带有网络框架的项目加入开源聊天的界面报错了。刚开始一直怀疑是appcompat-v7和AndroidX冲突,排查的一番又不是。
1、报错的错误如下
> Task :app:transformDexArchiveWithExternalLibsDexMergerForDebug FAILED
AGPBI: {"kind":"error","text":"Program type already present: io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable","sources":[{}],"tool":"D8"}
Program type already present: io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable
Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: C:\SVN\caring\app\build\intermediates\transforms\dexBuilder\debug\211.jar
Program type already present: io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable
重点就是这句 Program type already present: io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable
其实就是库重复冲突了。不是其他原因。找到重复的库就能解决
2、解决办法
提示是ScheduledRunnable这个类重复。那么复制ScheduledRunnable,使用快捷键double shift键,复制查询一下,就能看到冲突的库。从下面截图可以发现rxAndroid和rxJava有重复冲突的库。分别有两个版本。所以去掉一个就行,我是删掉本地libs里面重复。
删除下面红色框的两个库,再进行编译。如果提示还有别的库,那么再进行删除本地。
我删除掉了本地rxjava-2.2.8.jar 和 rxandroid-2.0.2.aar。删除之后编译又发现有一个重复,又使用同样的方法检查,找到删除本地的库。最终删除了3个库。
3、总结
其实产生这种根本原因是本地libs文件夹存在相同库一个版本。由于新加库本来包含libs某个库,所以要找出来去掉其中一个。如果其他是打包在一起,那么优先去掉libs下面重复的库。