前言
公司开发的app要在android市场上线,为了统计每个渠道的数据,需要进行多渠道打包。
但是,国内市场众多。要是一个一个手动打包,还不累个半死。所以,要使用多渠道打包。
1、区分渠道
使用第三方统计的SDK时,他们都会再XML中给出配置渠道的属性,只需要改变这个属性就ok。
我用TalkingData统计。如下:
<meta-data
android:name="TD_CHANNEL_ID"
android:value="${TD_CHANNEL_VALUE}" />
只需要把 value的值变成相应的渠道,然后打包就ok了。
现在多渠道打包就是怎么实现手动赋值。
2、build.gradle中配置
build.gradle的配置
def releaseTime() {
//获取当前的时间
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
useLibrary 'org.apache.http.legacy'
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
applicationId 'com.vbo.seller'
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "0.1" // 版本号
manifestPlaceholders = [TD_CHANNEL_VALUE: "DEFA"]
}
lintOptions {
abortOnError false
}
buildTypes {
debug {
}
}
signingConfigs {
debug {
// No debug config
}
release {
storeFile file("密钥路径")
storePassword "密钥密码"
keyAlias "alias"
keyPassword "alias密码"
}
}
buildTypes {
def BOOLEAN = "boolean" // 定义的常量,方便再配置中引用
def STRING = "String"
def TRUE = "true"
def FALSE = "false"
def BUG = "BUG"
def URL_API = "URL_API"
debug {
buildConfigField BOOLEAN, BUG, TRUE // 定义一个boolean变量,并赋值true,这个字段再java代码中可以引用。
buildConfigField STRING, URL_API, "\"http://xx.xx.xx.xx:8080\"" // 定义一个String 类型变量
versionNameSuffix ".debug" // debug的签名中,将版本名字后面添加.debug标识
// applicationIdSuffix ".debug" // 将 应用id后面添加debug标识
signingConfig signingConfigs.debug
}
release {
buildConfigField BOOLEAN, BUG, FALSE
buildConfigField STRING, URL_API, "\"http://xx.xx.xx.xx:12000\""
minifyEnabled true
zipAlignEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "应用名称_v${defaultConfig.versionName}_${variant.productFlavors[0].name}_${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
productFlavors {
baidu {}
wandoujia {} .....// 将要打包的渠道都放在这里
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [TD_CHANNEL_VALUE: name]
}
}
3、引用再build中定义的值
在xml中引用时,用 ${ } 的形式。例如:
<meta-data
android:name="TD_CHANNEL_ID"
android:value="${TD_CHANNEL_VALUE}" />
<category android:name="${applicationId}" />
在java中引用,使用BuildConfig.xxx 就可以引用这个值。
再配置文件中的这句话:
buildConfigField boolean, BUG, true //定义一个变量,名称:BUG,类型为:boolean类型,赋值true
使用一下格式引用:(注意:如果不将项目编译一遍,这个属性值无法自动提示出来)
public static boolean isDebug = BuildConfig.BUG; // true 调试。false:上线
public static final String URL = BuildConfig.URL_API; // 服务器地址
4、使用命令进行打包
使用的命令为:gradlew assemble
其中,第一次运行 gradlew 会下载一些文件。(国内速度有点慢)
(引用别人的一张图片,样子就是下面这样。)
下载完了以后,可以直接执行gradlew assemble进行打包。这样,他会将各个渠道的debug和release包都打出来。
也可以使用:gradlew assembleDebug 这样会将各个渠道的debug包打出来
gradlew assembleRelease 这样会将各个渠道的Release包打出来
如果只想打包某一个渠道,可以使用命令:
gradlew assembleWandoujia 将wandoujia的dubug和Release包打出来
gradlew assembleWandoujiaDebug 将wandoujia的dubug包打出来(Release同理)