我们知道,如果apk需要发布到多个平台,并且每个需要发布到每个平台上面的apk名称及其applicationid不一样的话,那么就需要运用到多渠道打包了!
多渠道打包 实际上也是打的正式渠道的包!所以这时必须产生正式签名的包!
今天说一种在build.gradle文件中隐藏签名参数的做法:
直接上图吧:
/*正式apk签名*/
signingConfigs{
config{
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
}
buildTypes {
release {
signingConfig signingConfigs.config
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
则其所对应的文件路径及其密码都在gradle.properties文件下,如图所示:
KEY_PATH=../weather.jks
KEY_PASS=123456
ALIAS_NAME=suixingweather
ALIAS_PASS=123456
这样就能隐藏密码了,签名的gradle.properties文件就可以忽略掉!
其第一种多渠道打包就是:
第一步:在build.gradle下添加如下信息:
其中:qihu和baidu代表渠道名(自己定义),applicationid
代表分发出去的apk唯一标示码
/*多渠道打包*/
productFlavors{
qihu{
applicationId "com.android.qihu"
}
baidu{
applicationId "com.android.baidu"
}
}
第二步:在目录中新建与渠道号相对应的目录 并在该目录下新建java目录和res目录 ,如果你希望打出来的apk某个类和图标及应用名称不一样等等,都可以修改的
如下:
第三步:点击as工具旁边的gradler生产不同渠道的包和安装,也可以一键生成所有的apk
如下:
其中assembleRelease为一键生成所有的apk。
第二种:多渠道打包的方式
第一步,也是配置多渠道信息:如下(和第一种方式配置信息一致)
其中buildConfigField也可以写在release和debug下 根据需要来写,通过buildConfigField 来配置不同环境和不同渠道的配置信息都是ok的
productFlavors {
baidu{
// 每个环境包名不同
applicationId "com.android.changeData.baidu"
// 动态添加 string.xml 字段;
// 注意,这里是添加,在 string.xml文件下不能有app_name这个字段,会重名!!!其对应的渠道号下面就不能有string文件了,,但是其获取的应用名的key要保持一致
resValue "string", "app_name", "百度"
// 动态修改 常量 字段
buildConfigField "String", "FIRST_CHANGE_TEXT", '"我是百度首页"'
}
qq{
applicationId "com.android.changeData..qq"
resValue "string", "app_name", "腾讯"
buildConfigField "String", "FIRST_CHANGE_TEXT", '"我是腾讯首页"'
}
}
第二步:和第一种方式的第二步是一样的,就不多说了,直接看图
第三步:是根据第二步图来的(图中apk 的命名比较特殊 有渠道号 版本名称 日期)
其在build.gradle配置如下:可以放在release或者debug下
// 批量打包
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//输出apk名称为:渠道名_版本名_时间.apk
def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
以及 releaseTime()方法的读取:
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
第四步,动态读取配置的FIRST_CHANGE_TEXT的值(类文件中)
String ENVIRONMENT = BuildConfig.FIRST_CHANGE_TEXT;
以上: