Android自动化之多渠道打包

概述

每当发新版本的时候,Android客户端会分发到各大市场,比如:豌豆荚,91,小米等。为了统计这些市场的效果(活跃度,下载量等),需要有一种方法唯一标识它们。
每次发版本,产品部都会提供一个渠道列表,Android开发者会根据这些渠道相应地生成渠道包,随着渠道越来越多,客户端如果都是机械手动去打的话,会累死,程序猿都是聪明而懒惰的,客户端打渠道包的方法一直在演进和提高。
从美团技术博客上有一篇介绍自动打包的博文,结合我自己的项目,我就对META-INF自动化打包作一下描述。
我们首先需要用工具(IDE、maven、ant等等)打一个签名包,这个包作为母包,用来打各个渠道包用。这个包我们用解压缩工具打开,发现根目录会有一个META-INF目录,如下图所示
image

添加空文件

如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
首先建立一个空目录(这边命名位packages), 将上面生成好的签名包拷贝至packages
在packages目录下新建一个渠道包配置文件(命名为channel_cfg),每个渠道id为一行,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
360
wandoujia
xiaomi
91
```
## Python脚本编写
新建一个python脚本,用来给apk添加空的渠道文件,渠道名的前缀为mchannel_,如下是我的python脚本:

```
#!/usr/bin/env python
import zipfile
import shutil
import os
f = open('channel_cfg', 'r');
while True:
line = f.readline().strip('\n')
if len(line) == 0:
break
else:
shutil.copy2({your_apk}, 'target' + line + '.apk')
zipped = zipfile.ZipFile('target' + line + '.apk', 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/mchannel_{channel}".format(channel=line)
fp = open(line, 'w')
zipped.write(os.path.basename(line), empty_channel_file)
fp.close
os.remove(line)
f.close()