Suggestion: use tools:overrideLibrary=”” to force usage

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包,androidTestFlavor1androidTestFlavor2,并且配置了minSdkVersion有冲突的依赖,而androidTest包没有有效代码所以被删掉了。这时候即使按照前面的解决方案给androidTestFlavor1androidTestFlavor2对应的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的话应该也没有更好的办法能解决了。