Gradle多版本多渠道指定名字打包
Gradle多版本打包
前言: 在开发当中,往往有多种网络配置环境,例如内网,外网,预发布,那么就需要打不同的包,每次手动去改,一是麻烦,二是有风险
定义多种打包类型
buildTypes { release { manifestPlaceholders = [appName: "正式发布版"] proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //签名 signingConfig signingConfigs.key //混淆文件开启 minifyEnabled true //资源,类 去重复。 shrinkResources true //APK包 优化 zipAlignEnabled true } debug { manifestPlaceholders = [appName: "Debug版"] minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } prerelease { manifestPlaceholders = [appName: "预发布版"] minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
这里就定义了三种打包类型 release debug prerelease
在具体的代码中获取类型,匹配不同的url
switch (BuildConfig.BUILD_TYPE){ case "debug": url = "debug"; break; case "release": url = "release"; break; case "prerelease": url = "prerelease"; break; }
release 是要签名的
//自动签名打包,定义一个签名的方法 signingConfigs { key { keyAlias 'keywang' keyPassword '123456' storeFile file('../wang.jks') storePassword '123456' } }
上文的realease中我已经加入了signingConfig signingConfigs.key,打包签名
指定文件名输出
android studio的自动命名不是很全,没有在名字后面加上版本号,这个就需要我们自己去加
//gradle 多版本打包命名 applicationVariants.all { variant -> variant.outputs.each { output -> def oldFile = output.outputFile def newName = ''; if (variant.buildType.name == 'release') { //这一句要根据后文的多渠道打包联系起来 newName = 'release_' + variant.getVersionName() +'_' +variant.productFlavors.get(0).getName()+ '-signed.apk' output.outputFile = new File(oldFile.parent, newName) } if (variant.buildType.name == 'debug') { newName = 'debug_' + variant.getVersionName() + '.apk' output.outputFile = new File(oldFile.parent, newName) } if (variant.buildType.name == 'prerelease') { newName = 'prerelease_' + variant.getVersionName() + '.apk' output.outputFile = new File(oldFile.parent, newName) } } }
这样打出来的包就会自动命名的
执行assemble命令是打各种不同的包
执行其他子命令是打一个包
多渠道打包
- Gradle配置
//开始定义多渠道打包的方法
productFlavors {
yingyongbao {
// applicationId 'com.wang.agradle1' 此处可以指定包名
manifestPlaceholders = [ CHANNEL_NAME:"YINGYONGBAO"]
}
umeng {
manifestPlaceholders = [ CHANNEL_NAME:"UMENG" ]
}
wandoujia {
manifestPlaceholders = [ CHANNEL_NAME:"WANDOUJIA" ]
}
}
//定义渠道变量名
productFlavors.all {
//定义了CHANNEL_NAME 是变量名
flavor -> flavor.manifestPlaceholders = [CHANNEL_NAME: name]
}
2. AndroidManifest配置
```xml
<!-- 渠道号设置 -->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_NAME}" />
```
配合上文的自动命名就可以打出各种版本的包,并且自动命名
其他小细节
自动命名安装后的名称
AndroidManifest配置
android:label="${appName}"
Gradel配置
manifestPlaceholders = [appName: "Debug版"]
这样安装debug 安装后app名字就是Debug版
其他以后在补充