AGPBI: {"kind":"error","text":"Program type already present: com.***.***.classA","sources":[{}],"tool":"D8"}的解决经验
我们在使用Android Studio整合代码框架、导入第三方库的时候,会遇见各种各样的编译报错问题,根据我个人的经验,大多数错误的原因是因为重复导入依赖包导致的,重复的可以是资源,也可以是类。重复导入报错的一般提示就是如本文标题中所写的“Program type already present”,冒号后面跟的是重复的类,如何解决这种问题呢?
第一步、先查找这些类是在哪几个依赖包中重复出现的,方法很简单,双击shift键,会出现如下图所示的弹窗:
在这个弹窗的输入框里面输入报错的类名,输入框下面就会列出该类所有的出处,其中展示的信息里面就有引入该类的aar的名字,既然报重复的错误,一般都会出现两个或者两个以上该类的重复定义;
第二步、根据第一步的搜索结果,删掉重复的依赖,保留一个即可,可顺利解决。这里需要进一步说明的是,有些依赖包不是我们直接依赖的,比如我们依赖了A包,而A包依赖了B包,而B包中的类导致了类重复定义的问题,在第一步的搜索结果中,只会列出B包,而不会出现A包。我们此时知道了是因为B包产生的问题,但是工程的直接依赖里面没有B包,我们需要知道是哪个包间接依赖了B包,即我们要在事先不知情的情况下,找到A包,这时候就需要另一个gradle技巧---查看依赖树。查看依赖树可在Android Studio界面下面的Terminal里面输入下面的命令:
gradlew :app:dependencies --configuration debugCompileClasspath
把app换成我们想要查看的module的名字即可。通过查看依赖树可找到是哪个包依赖了B包。定位到A包之后,有两种解决办法:(1)可能的话,不依赖A包了,当然理想很美好,现实很骨感,一般是去不掉的;(2)利用exclude语句,导入A包的时候屏蔽掉B包的导入,如下面栗子所示:
implementation('com.allenliu.versionchecklib:library:2.0.0') {
exclude group: 'org.greenrobot', module: 'eventbus'
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
}