Android Packaging
国内市场因为 android 的发布渠道比较多,所以一般我们会想要追踪一下用户使用的包是从哪里下载安装的。
Android 打包支持 buildTypes ,一般这个会用来区分不同的环境,比如 dev,beta,prod 等,不同环境可能会有一些不同的设置,比如 dev 会打开更多的日志输出什么的。
1 android{
2 buildTypes {
3 debug {
4 ...
5 }
6 release {
7 ...
8 }
9 beta {
10 ...
11 }
12 }
13 }
还有一个支持是 productFlavors,一般用这个来区分不同的渠道,不同渠道也可以有一些不同的设置,类似上面的 buildTypes。
1 android {
2 productFlavors {
3 xiaomi {}
4 baidu {}
5 wandoujia {}
6 x360 {}
7 }
8
9 productFlavors.all {
10 flavor -> flavor.manifestPlaceholders = [CHANNEL_ID: name]
11 }
12 }
配合 AndroidManifext.xml
文件的配置
1 <meta-data android:name="CHANNEL_ID" android:value="${CHANNEL_ID}" />
在代码里面取到这个,然后设置渠道。
这样就可以打渠道包了 ./gradlew assembleWandoujiaRelease
编译 wandoujia
这个渠道的 releases
包。这个方式有一个问题是,每一个渠道包都需要从头编译一次,一个渠道 10 分钟,那所有渠道下来,就可能需要一个小时了,关键是很多无用功。
受不了这个,然后发现了美团的思路。有一个民间的方案 https://github.com/GavinCT/AndroidMultiChannelBuildTool 。
这个方案的主要思路是 apk 只编译一次,编译好之后,通过在 apk 里面增加不同名字的文件的方式来区分不同的渠道。app 运行的时候,读这个文件名字,然后设置对应的渠道。
对于 v1 签名的 apk,在 META-INF 下面增加空文件不需要重新签名,所以只需要再次 zip 压缩就可以。
对于 v2 签名的 apk,需要重新签名,可以使用 apksigner
这个程序,这个是 android sdk 带的。我的 mac 系统路径是 ~/Library/Android/sdk/build-tools/*/apksigner
,因为会安装多个 build-tools 版本,所以会有多个,用哪个都可以。
1 cmd = [apksigner, "sign", "--ks", "your_key_store_path", "--ks-pass", "pass:your_pass", "--ks-key-alias", "your_alias", apk]
2 check_call(cmd)
这样就可以了。
我看美团似乎弄了一个新的版本 https://github.com/Meituan-Dianping/walle 看着挺复杂的,没研究过。