问题描述
打包过程爆出DexArchiveMergerException。
option模块依赖option-common模块
独立的App依赖option模块
option-common模块的引用:
注意//注释的几行,这个地方可能是引起问题的关键
1 | dependencies { |
opion模块的引用:
1 | dependencies { |
细节错误信息:
Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat
Message{kind=ERROR, text=Program type already present:
android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat,
sources=[Unknown source file], tool name=Optional.of(D8)}
option和option-common都是放在maven仓库的,option-common在3月12日做了提交到maven之后,3月15日把common的那几行注释了。一直没有上传。
同时在option的build中添加
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support:cardview-v7:27.0.2'
然后某一天,心血来潮把option-common上传了,同时option的gradle文件中加上(可能是本地依赖,没上传到maven)
implementation 'com.android.support:design:27.0.2'
依赖option仓库的app工程就出现如上下报错。
再把option打包上传到maven仓库,依赖option仓库的app构建还是报错。
(详情查看git的3.15和3.28的weOption-SDK的提交记录)
错误:
Program type already present: android.support.design.widget.CoordinatorLayout$Behavior
Message{kind=ERROR, text=Program type already present:
android.support.design.widget.CoordinatorLayout$Behavior,
sources=[Unknown source file], tool name=Optional.of(D8)}
把design改成27.1.1版本,好像冲突的问题解决了。
原因分析:
应该还是包冲突的问题
在option和option-common所在的共同工程里,可以看到引用的包,recycleview-v7-23.4.0等
注释依赖不会引起包重复报错,上面的操作不管是注释还是option和option-common的包位置对调,都不会引起包重复。
包对调指的是(appcompat-v7:27.0.2和cardview-v7:27.0.2从common移到option或者反向移动)
关键点在于3.28的某次更改,添加了能引起包重复的包才出现问题,不要被其他的表象混淆视听,抓住错误的关键点,才能清晰的分析错误的根本原因。
关键引起错误的包可能就是(design:27.0.2),另外注意版本的对应关系,很容易引起包冲突。
也有可能是在上传maven过程中传了错误版本的包,这个也会很大程度的影响逻辑的判断,鉴于当时的情况不可清楚的还原场景,只看最终结论即可。
build报错信息:(记录下以方便之后再出现同样问题的核对)
1 | org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'. |
涉及到的问题解决方面结论:
一个是jar包重复到问题,在AS中使用gradel命令查看依赖树./gradlew -q :app:dependencies,另外要学会exclue去除不需要的包。
另一个问题是api依赖和implementation依赖到理解,api会传递依赖自己的父依赖到子(引用ta的)module,但是implementation只对子module(引用ta的module)暴露本身。
最后需要对各版本的补充库、兼容库等有个大概等了解认识。