每种 build 变体都代表您可以构建的一个不同的应用版本。例如,您可能希望为应用构建两个版本,一个是内容有限的免费版本,另一个是包含更多内容的付费版本。那这里就模拟写一个SDK来做一个功能,利用构建变体来打出免费版和专业(付费版)的两个变体给客户端接入。
构建类型
构建类型 = productFlavors + buildTypes
构建类型的数量为productFlavors和buildTypes笛卡尔的乘积
配置 build 类型
当您创建新模块时,Android Studio 会自动创建“debug”build 类型和“release”build 类型。那这里我们再自建一个other类型,就要来点不一样的。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
other {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
配置产品变种
创建产品变种与创建 build 类型相似。将产品变种添加到 build 配置中的 productFlavors
代码块,并添加所需设置。 产品变种支持与 defaultConfig
相同的属性,这是因为,defaultConfig
实际上属于 ProductFlavor
类。
所有变种都必须属于一个指定的变种维度,即一个产品变种组。您必须将所有变种分配给某个变种维度。
如下示例,配置了维度"activate",配置了2个变体free和pro,代表免费版与专业版,
flavorDimensions "activate"
productFlavors{
free {
dimension "activate"
//会在应用的包名后面追加.free
versionNameSuffix "-free"
buildConfigField 'boolean', 'IS_FREE_TRIAL', 'true'
}
pro {
dimension "activate"
//会在应用的包名后面追加.pro
versionNameSuffix "-pro"
buildConfigField 'boolean', 'IS_FREE_TRIAL', 'false'
}
}
同步完成后,Gradle 会根据 build 类型和产品变种自动创建 build 变体,并按照 <product-flavor><Build-Type> 为其命名。最后的构建类型为上面三种类型的笛卡尔积
这里就可以直接打出各个不同的变体来:
若要选择要构建并运行的 build 变体,请依次前往 Build > Select Build Variant,然后从菜单中选择一个 build 变体。
Build之后,buildConfig类下就会多出FLAVOR变量来
但是此时Sdk还不能被app客户端依赖,因为客户端需要加一个属性定义才行。
配置missingDimensionStrategy:
defaultConfig {
//使用missingDimensionStrategy指定lib module中的两个flavor,"activate"为lib module中定义的dimension
//不然,app module将无法sync成功和找到lib module中的类
missingDimensionStrategy "activate", "free", "free"
}
大概意思是:告诉编译插件缺少“activate”维度的free或pro两个flavor。
此时依赖能正常编译,lib中的类也都能被app module中找到和使用了。
到这里就可以引用库里面的代码了,可以选择直接引用project,可以打出aar包引用,也可以上传仓库引用。
开发测试
在sdk中编写类:
object FlavorType {
/**
* 获取当前sdk功能版本是否为免费版
*/
fun isCurVersionFree(): String {
return BuildConfig.FLAVOR
}
}
在app模块下调用测试:
findViewById<TextView>(R.id.tv_flavor).apply {
text = "当前SDK的版本是" + FlavorType.isCurVersionFree()
}
测试结果:
成功读取到sdk中变体的配置值。
参考:
https://developer.android.com/studio/build/build-variants?hl=zh-cn
https://blog.csdn.net/qq_29951983/article/details/112850442
https://blog.csdn.net/u012149399/article/details/88124473
网友评论