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下面重复的库。