前言
在新建一个项目时buildTypes
默认有release
、debug
两种,我们可以选择其中一种进行编译。
但是如果我们在build.gradle中再新增一种类型,例如qa
时,此时会报错如下:
预备知识
首先我们要知道buildTypes是干嘛的?
它能够为你提供多种编译选择,我们可以在buildTypes中定义变量、配置混淆文件、配置签名文件等。最后生成BuildConfig.java文件。 例如:
java
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
buildConfigField "String", "VALUE", "\"XXXXXX\""
}
}
其中buildConfigField 可以在最后生成的BuildConfig.java文件中生成一个静态变量。这是用处非常大的,就比如debug环境和release环境的请求地址可能不同,就可以通过这个进行定义,避免打包的时候忘记修改地址等问题。
在项目中每个moudle都有对应的build.gradle文件,所以每个moudle都可以生成一个BuildConfig.java
产生原因
当我们有多模块时,app模块选择了qa的type进行编译,此时依赖了moudle1,当它编译时,由于他没有声明qa这个buildTypes,编译器不知道如何生成对应的buildConfig文件。此时就会报错。
解决办法
方法一:
在moudel1的build.gradle文件下也加上qa的buildTypes,这样编译器就能找到如何生成文件了。但是当app依赖的模块过多的时候,就要一个模块一个模块的增加类型,这样比较麻烦。
方法二:
在app的build.gradle通过matchingFallbacks关键词,对该类型进行一个补充说明,意思是如果没有找到这个type,那么可以用配置的参数继续编译。举个例子就明白了
java
//app下的build.gradle
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
qa {
matchingFallbacks = ['release']
buildConfigField "String", "VALUE", "\"app buildTypes 类型为qa\""
}
}
//moudle1下的build.gradle
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
buildConfigField "String", "VALUE", "\"虽然app用的是qa,但是我moudle找不到,所以用release\""
}
}
这里的qa通过matchingFallbacks 定义了一个release类型,所以当我们moudle1在编译时,如果找不到声明的qa type,就会使用release
最后app下的BuildConfig.java如下:
moudle1下的BuildConfig.java如下