Android开发在build的时候有时会报如下错误:
1 | Error:Execution failed for task ‘:app:processProductDebugManifest’. Manifest merger failed : uses-sdk : minSdkVersion 14 cannot be smaller than version 18 declared in library...... Suggestion: use tools:overrideLibrary=”xx.xxx.xx” to force usage |
错误原因是当前的Build Variant(即错误提示中的ProductDebug)的minSdkVersion
小于它所依赖的包的minSdkVersion
,所以报了这个错。解决方案就像Suggestion告诉的,在对应的AndroidManifest.xml
文件里添加一个<uses-sdk tools:overrideLibrary="xxx.xxx.xxx"/>
的标签,中间填上报错的依赖库的包名,如果有多个这样的依赖库的话就填多个包名,用逗号分开。
前面是遇到这个问题常用的解决方法,但是在有些情况下得注意这个标签是否填对了地方。比如在项目有多个variant时,会针对不同的variant有不同的包,不同的包的依赖也是不同的,那么就应该针对某个包写一个单独的AndroidManifest.xml
来解决前面那种问题。一般情况下这样解决了之后就不会有问题了。
但是还有特殊情况。比如针对不同的flavor做了两个针对的test包,androidTestFlavor1
和androidTestFlavor2
,并且配置了minSdkVersion
有冲突的依赖,而androidTest
包没有有效代码所以被删掉了。这时候即使按照前面的解决方案给androidTestFlavor1
和androidTestFlavor2
对应的AndroidManifest.xml
配置了tools:overrideLibrary
,在Build的时候还是会报如下错:
1 | Error:Execution failed for task ‘:app:processProductDebugAndroidTestManifest’. |
也就是说明明原有的androidTest
包里已经被删掉了,但是gradle还是会跑其对应的taskapp:processProductDebugAndroidTestManifest
,这时候我们只需要重新把androidTest
包找回来,里面什么都没有只放一个AndroidManifest.xml
,并配置对应的tools:overrideLibrary
,就可以Build成功了。
然后对比了几个不同的项目Build的message,无论有没有androidTest
,都会跑对应当前variant的这个task,只要存在前面的minSdkVersion
的冲突问题并且没有在androidTest
对应的AndroidManifest.xml
里解决,都会报错。
研究了半天对这个问题并没有找到比较好的解决方案,能解决的方法一种是如果存在以上问题就保留androidTest
这个包和对应的AndroidManifest.xml
;另一种是如果这个flavor就是专门为测试用的话,可以在build.gradle文件里给对应的flavor设置不同于其他flavor的minSdkVersion
,如下:
productFlavors {
flavor1 {
......
}
flavor2 {
......
}
testflavor {
minSdkVersion xx
}
}
如果项目里遇到类似的问题基本就是这个情况。这两个方法只能算是妥协,但是如果项目的build是默认必须跑这个task的话应该也没有更好的办法能解决了。