Android多模块打包中的构建变体(buildTypes 和
建议读本文之前先阅读构建变体和Android 源集sourceSet两篇文章,对构建变体有一个基本认知,如果有可以直接跳过。
本文主要探讨一个Android工程中有多个模块(就是setting.gradle定义了多个模块),不同模块之间具有依赖关系下,各个模块的构建变体如何配置的问题。
为了方便讲解,我们把问题简化为该工程有两个模块—子模块B和主工程模块A,A依赖B,B定义了不同的buildTypes 和产品风味productFlavors,A的构建变体该如何定义的问题。
子模块定义如下
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "brand"
productFlavors {
xiaomi {
dimension "brand"
}
huawei {
dimension "brand"
}
vivo {
dimension "brand"
}
}
}
经过各种试错,得出主模块应该如下定义
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "brand","deviceType"
productFlavors {
xiaomi {
dimension "brand"
}
huawei {
dimension "brand"
}
vivo {
dimension "brand"
}
pad {
dimension "deviceType"
}
phone {
dimension "deviceType"
}
}
}
首先是buildTypes:
Android会默认给每个模块生成debug 和release buildType,所以就算每个模块不配置buildTypes 也至少有一个debug和release包;每个模块打debug包时候,对应依赖的就是子模块的debug包,release包也是对应依赖子模块release包,如果子模块定义了新的buildType,比如pre,主模块想使用,那就要定义对应名称的buildType
其次是flavorDimensions:
Android工程默认没有定义产品风味,所以当子模块定义了产品风味,主工程模块必须定义相应的风味维度(比如brand)并且使用子模块这个风味维度下至少一个风味;
这是因为主模块打包的时候依赖的子模块是唯一的,如果主模块不定义对应的风味,那么打包时候就因为不知道选择哪一个子模块的风味而报错。 所以子模块有的风味维度,主模块一定得有,而且风味中至少包含子模块其中一个。
除此之外,主模块还可以定义更多得风味维度,比如deviceType
结论
1. 上层构建变体的维度数目需要大于等于下层模块的维度;
2. 本模块的构建脚本中能获取的构建变体只有本模块的;
3. 主模块每个构建变体打包时候,都会根据每个它的****buildType和****flavor去子模块寻找对应名称的****buildType和flavor的构建变体,如果找不到就会报错。
原则和思考
主模块打包的时候每个构建变体依赖子模块的构建变体必须是唯一确定的;