1、基础使用
首先在AndroidMainfest中加入渠道信息:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_VALUE}" />
然后配置app中的gradle:
android {
...
productFlavors{
wandoujia {}
qihu360 {}
baidu {}
}
productFlavors.all{
flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
}
然后就可以批量打包了:

但是呢,一般多渠道的时候会有一个渠道id,这个也想批量打包的时候加进去,步骤如下:
首先在AndroidMainfest中加入渠道信息和渠道id:
<meta-data
android:name="UMENG_CHANNEL"
android:value="$(CHANNEL_VALUE)" />
<meta-data
android:name="CHANNEL_ID"
android:value="${CHANNEL_ID}" />
然后配置app中的gradle:
productFlavors {
wandoujia {
manifestPlaceholders=[CHANNEL_VALUE: 'wandoujia',CHANNEL_ID:100]
}
qihu360 {
manifestPlaceholders=[CHANNEL_VALUE: '360',CHANNEL_ID:101]
}
baidu {
manifestPlaceholders=[CHANNEL_VALUE: 'baidu',CHANNEL_ID:102]
}
}
注意:这个地方是没有:
productFlavors.all{
flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
这段代码的,其实也能够看出来,这段代码是用来循环的。
二、打包签名配置
打包签名的配置分为两种情况,一种是AS打包,直接输入密码等信息。另外一种是命令行进行打包操作,这时候需要在gradle中配置相关信息,如:
android {
...
signingConfigs {
debug {
}
release {
storeFile '打包签名路径'
storePassword 'XXX'
keyAlias 'XXX'
keyPassword 'XXX'
}
}
}
这样的话提交代码后大家都知道,但是相对不是很安全,还有一种方式是建立signing.properties文件:

配置好一些信息,提交代码的时候不用提交上去即可:

然后再gradle中配置:
android {
...
signingConfigs {
debug {
}
release {
storeFile
storePassword
keyAlias
keyPassword
}
}
buildTypes {
release {
signingConfig signingConfigs.release //设置签名信息
}
}
}
//读取文件中的信息来配置打包签名
File propFile = file('signing.properties');
if (propFile.exists()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
if (props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
} else {
android.buildTypes.release.signingConfig = null
}
} else {
android.buildTypes.release.signingConfig = null
}
....
三、修改生成apk包名
示例:
apply plugin: 'com.android.application'
//获取产品的名字
def getProductName() {
return "clock"
}
//获取当前系统的时间
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
android {
...
signingConfigs {
...
}
buildTypes {
...
}
//修改生成的apk名字,格式为 app名_版本号_打包时间_渠道名_release.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def oldFile = output.outputFile
if (variant.buildType.name.equals('release')) {
def releaseApkName = getProductName() + "_v${defaultConfig.versionName}_${releaseTime()}_" + variant.productFlavors[0].name + '_release.apk'
output.outputFile = new File(oldFile.parent, releaseApkName)
}
}
}
}
四、其它
打包的时候还有另外一些配置问题,如:配置混淆规则,配置混淆优化,移除无用的资源文件,压缩对齐apk包,突破65535个方法限制等等。后续会再进行学习。
网友评论