Android 打包那些事儿
一、渠道包
1、什么是渠道包?
渠道包是 针对不同应用市场添加不同 标识的 apk文件,用于上传不同应用市场,一般是在清单文件中的meta-data标签下配置不同的value来区分不同的渠道
2、渠道包的作用
a、用于观察不同应用市场的下载量、用户数等
b、查看app 在每个渠道的统计数据
c、通过下载量、渠道统计等统计数据,可以进行运营推广
二、友盟多渠道打包介绍(Android Gradle Plugin)
步骤:
a、清单文件中添加友盟的基本配置(必须)
b、在build文件中添加默认渠道配置(非必须)
c、添加签名文件配置(必须)
d、多渠道脚本支持(必须)
e、通过命令gradlew assembleRelease 或者Generate signed apk 打包
1、清单文件中添加友盟的基本配置
UMENG_CHANNEL 对应value添加channel 点位符,用于动态替换,关于友盟SDK 的集成,请参照友盟官网
<!-- 友盟appkey -->
<meta-data
android:name="UMENG_APPKEY"
android:value="242342342424242424" />
<!-- 渠道标示*必须以UMENG_CHANNEL为key -->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
2、在build文件中添加默认渠道配置 (manifestPlaceholders )
如果未设置渠道,会走默认配置,下列代码添加的默认渠道配置为 main
andrid{
defaultConfig {
applicationId "xxx.xxx.xxx"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
flavorDimensions "1.0"
// Enabling multidex support.
multiDexEnabled true
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "main"]
}
}
3、添加签名文件配置
切记signingConfigs 必须放到buildTypes 前面,否则会报如下错误
Could not get unknown property 'release' for SigningConfig
android{
signingConfigs {
debug {
keyAlias 'debug'
keyPassword '11111111'
storeFile file('C:/keystore/debug.jks')
storePassword '11111111'
}
release {
keyAlias 'release'
keyPassword '11111111'
storeFile file('C:/keystore/release.jks')
storePassword '11111111'
}
}
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{
minifyEnabled false
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
4、多渠道脚本支持
//定义的所有渠道
productFlavors {
main { //主站
// manifestPlaceholders =[UMENG_CHANNEL_VALUE: "main"]
}
tencent { //腾讯应用包
// manifestPlaceholders =[UMENG_CHANNEL_VALUE: "tencent"]
}
}
//遍历替换清单文件中的渠道名称
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
// gradle 3.0及之后用如下配置更改渠道文件名
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.productFlavors[0].name}_test.apk"
}
}
// gradle 3.0之前用如下配置更改渠道文件名
// applicationVariants.all { variant ->
// variant.outputs.each { output ->
// def outputFile = output.outputFile
// if (outputFile != null && outputFile.name.endsWith('.apk')) {
// def fileName = "${variant.productFlavors[0].name}_test.apk"
//// def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
// output.outputFile = new File(outputFile.parent, fileName)
// }
// }
// }
5、通过命令gradlew assembleRelease 或者Generate signed apk 打包
打好包后,可以在 以渠道名为文件夹里找到,提供一个简单的 demo
三、其它多渠道打包介绍
Android Gradle Plugin 打包方式是google 提供的,当打多个渠道包,例如20个,往往要花费数个小时才能打完所有渠道包,主要有以下缺点:
a、每次打包都要走一遍构建流程,效率非常低,只适合较少渠道场景
b、Gradle会为每个渠道包生成一个不同的BuildConfig.java类,记录渠道信息,导致每个渠道包的DEX的CRC值都不同,一般情况下,这是没有影响的。但是如果你使用了微信的Tinker热补丁方案,那么就需要为不同的渠道包打不同的补丁,这完全是不可以接受的。所以我们得保证每个包的DEX和CRC 完全一致才行,这样我们就只需要生成一个补丁即可
目前市场上提供比较好用的多渠道打包工具有腾讯的 VasDolly
(v1和v2都支持)、美团的 walle(支持v2签名)
和 packer-ng-plugin(v1和v2都支持),基本原理一致,只是某些技术细节略有差异
四、多渠道打包原理介绍
看了美团和腾讯多渠道打包的方案原理,针对v2签名基本原理是一致的具体请参考
关于v1和v2的介绍,请参照 连接