应用场景:工作中经常会遇到一个项目需要多种打包的情况。只改几个参数,或者替换几个图片,就需要重新打一个安装包。如果只是一处两处,一次两次还好,如果频繁有这样的需求,想想就脑壳子疼……
为了解决这个问题, 采用gradle自带的 productFlavors 工具来实现多渠道,多app打包方式进行。
直译过来是产品特色,作用也差不多,用同一套代码生成不同的特色的产品。
别的也没有必要去深究,简单来说,记住几点就好:
- 这是gradle自带的工具,在build.gradle里进行配置,主要用于多渠道打包;
- 能配置非常多的参数,applicationId、versionCode、versionName、签名、资源文件、常量、代码文件等等。
- 打包时选择配置。
如果只有几个常量需要修改,那么两步就行了:
第一步:模块build.gradle 中android下添加如下代码。
flavorDimensions "default"
productFlavors {
oneApk {
buildConfigField "String", "myString", '"第一个apk的文本"'
buildConfigField "int", "myint", '1'
buildConfigField "boolean", "myboolean", 'false'
}
twoApk {
buildConfigField "String", "myString", '"第二个apk的文本"'
buildConfigField "int", "myint", '2'
buildConfigField "boolean", "myboolean", 'true'
}
threeApk {
buildConfigField "String", "myString", '"第三个apk的文本"'
buildConfigField "int", "myint", '3'
buildConfigField "boolean", "myboolean", 'false'
}
}
第二步:clean之后重新编译,代码中直接就可以使用了
Log.e("mystring",BuildConfig.myString);
打包之前在Android Studio左侧底部找到Build Variants栏,选择对应的Build Variant打包。
在上面那段代码的基础上修改就行,每一个productFlavors 中进行相应的设置。
为了以后能直接复制粘贴用,那我现在复制一下吧!
flavorDimensions "default"
productFlavors {
oneApk {
applicationId "com.xx.xxone"
versionCode 1
versionName "1.1"
signingConfig signingConfigs.oneRelease
//....
}
twoApk {
applicationId "com.xx.xxtwo"
versionCode 2
versionName "1.2"
signingConfig signingConfigs.twoRelease
//....
}
threeApk {
applicationId "com.xx.xxthree"
versionCode 3
versionName "1.3"
signingConfig signingConfigs.threeRelease
//....
}
}
// 因为多了签名,所以还得多一个标签,如下:
signingConfigs {
oneRelease {
storeFile file("xx/xx/one.jks") // 签名文件路径
storePassword "123456"
keyAlias "one"
keyPassword "123456"
}
twoRelease {
storeFile file("xx/xx/two.jks")
storePassword "123456"
keyAlias "two"
keyPassword "123456"
}
threeRelease {
storeFile file("xx/xx/three.jks")
storePassword "123456"
keyAlias "three"
keyPassword "123456"
}
}
如果修改签名不成功,还是用了默认的签名,那么把buildTypes下 signingConfig设置为 null 即可。
buildTypes {
release {
signingConfig null
//... 省略其它
}
debug {
signingConfig null
//... 省略其它
}
}
渠道多了,打包的时候很容易乱,因此打包的时候区分一下apk的文件名。
buiild.gradle最外层标签添加时间方法
static def releaseTime() {
return new Date().format("yyyy-MM-dd-HH.mm", TimeZone.getTimeZone("GMT+8"))
}
android标签下:
applicationVariants.all {
variant ->
variant.outputs.all {
outputFileName = "${variant.productFlavors[0].name}-v${variant.productFlavors[0].versionName}-${releaseTime()}.apk"
}
}