AndroidMultiChannelBuildTool
安卓多渠道打包工具。
实现思路讲解: Android 批量打包提速 - GavinCT
使用本工具,Android 程序员仅需将 ChannelUtil.java 放入到工程里使用,以后打包的事情就不用自己动手了。
安装个 Python 环境,运行一下 MultiChannelBuildTool.py,谁都可以打包了!
写在最前面
本工具不支持 v2 签名,如有需要,请使用Meituan-Dianping/walle
具体使用步骤
将想要批量打包的 apk 文件拷贝到 PythonTool 目录下(与 py 同级),运行 py 脚本即可打包完成。(生成的渠道 apk 包在 output_** 目录下)
目录介绍及使用注意
PythonTool
Python2 与 Python3 都能正常使用
info 目录下的 channel 用来存放渠道,多个渠道之间用换行隔开。
注意:
fork 后通过 Github clone,这个 channel 文件在 Windows 端是正常的,以换行隔开(\r\n)。
直接点击右侧的 download 下载 zip,可能你在 windows 端看到的就不是以换行隔开的(\n)。
这是 Github 造成的。但不会影响程序最后的运行效果。
你可以粘贴下面的渠道到 channel.txt 中保持它在 windows 端的可读性。samsungapps hiapk anzhi 360cn xiaomi myapp 91com gfan appchina nduoa 3gcn mumayi 10086com wostore 189store lenovomm hicloud meizu baidu googleplay wandou也可以自己来写入自己需要的市场,并以换行隔开
- MultiChannelBuildTool.py 是多渠道打包的脚本。
JavaUtil
ChannelUtil.java 用来解析渠道,直接拷贝到 Android 工程中使用即可。
ChannelUtil 中的 getChannel 方法可以方便的获取渠道。
常见问题答疑
这部分问题是由美团大神丁志虎在微博上答复的,摘录如下:
- 这个方案没法解决不同渠道使用渠道自己 SDK 的问题,友盟的 SDK 提供了在代码中设置渠道的方式,所以再获取到渠道号后再调用 SDK 相关设置渠道的方法就可以了
- apk 用的是 java 那一套签名,放在 META-INF 文件夹里的文件原则上是不参与签名的。如果 Google 修改了 apk 的签名规则,这一套可能就不适用了。
注意
问:同样一个版本号的 2 个渠道包,比如先装了 360,那么 SharedPreferences 存的就是 360 了。这时再用 xiaomi 渠道的去覆盖安装,那么读出来的渠道号还是 360 的。不知道博主对这个问题怎么看,还是去掉 sp 缓存,就保留内存和包中读取?
答:
看你个人的使用场景吧 一般来说 渠道使用无非是统计升级渠道、根据相应渠道变化样式、上报崩溃信息携带渠道。
- 针对 1:统计不怎么需要特别情况,你说的这种情况我们也考虑过,但一般用户大多不会这么折腾,也就 QA 这么玩。
- 针对 2:使用 flavor 来解决了。而不是判断渠道。早期适配魅族手机也是不管渠道,只看是不是魅族手机
- 针对 3:这个印象也不大,如果是某渠道包崩溃,少这几个也不会影响。
综上,我们选择不再读取。 当然,如果你有其他使用场景,考量之后觉得要精确,可以每次读包,缓存到内存中。当时我是感觉没有太大必要,才写成这样。
License
Copyright 2014 GavinCT
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
