手头的项目有个需求,需要生成两个apk,实现部分不同的功能,本想拉个分支,项目组长说可以了解下差异化打包,于是学习了一下~
一、在app -> build.gradle的android标签中配置productFlavors
productFlavors{
project1{
}
project2{
}
}
这里还可以配置不同的包名,应用名,图标,参数:
productFlavors{
project1{
applicationId "com.demo.project1"
manifestPlaceholders = [APP_NAME: "project1" ,ICON: "@mipmap/ic_launcher_project1"]
buildConfigField "boolean" , "IS_PROJECT1","true"
}
project2{
applicationId "com.demo.project2"
manifestPlaceholders = [APP_NAME: "project2" ,ICON: "@mipmap/ic_launcher_project2"]
buildConfigField "boolean" , "IS_PROJECT2","false"
}
}
如果设置了manifestPlaceholders,需要在AndroidManifese.xml的application标签下配置
android:label="${APP_NAME}" android:icon="${ICON}"。
另外,我在同步gradle的时候遇到了一个error:
Error:All flavors must now belong to a named flavor dimension。
在网上找到了一个解决方法,在defaultConfig种加一句flavorDimensions "versionCode":
defaultConfig {
applicationId "com.xxx.xxxx"
minSdkVersion xx
targetSdkVersion xx
versionCode xx
versionName xxxxxxx
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了
flavorDimensions "versionCode"
}
二、代码的差异化:
// 根据编译的包来实现不同功能
if (BuildConfig.FLAVOR.equals("project1")) {
//your code
} else {
//your code
}
三、修改apk的名字
applicationVariants.all { variant ->
variant.outputs.each { output ->
def type = ""
if (output.name == 'debug') {
type = "_debug"
}
def fileName = "project_V${defaultConfig.versionName}${type}_${productFlavors[0].name}.apk"
output.outputFileName = fileName
}
}
这样就可以打包出不同的apk啦。
网友评论