承接上文Android应用的自动化构建,我们已经通过ANT自动构建了应用,那接下来的问题是,如何自动构建渠道包,这里强烈推荐一篇文章美团Android自动化之旅—生成渠道包。
美团提到的第三种方式,截图如下:
本文主要以这种方式,来实现Android渠道包的自动生成。
Demo文件结构如下:
其中,empty是需要写入apk的空文件,channel文件为渠道列表,内容如下:
wandoujia
meituan
yingyongbao
最重要的是python脚本文件,实现如下:
import os
import os.path
import shutil
import zipfile
pkgPath = os.getcwd() + "/channelApk"
isPathExist = os.path.exists(pkgPath)
if isPathExist != True:
os.mkdir(pkgPath)
f = open('channel','r')
for line in f :
channelPath = pkgPath+"/ant-release_{temp}.apk".format(temp = line.strip('\n'))
shutil.copy("ant-release.apk", channelPath)
zipped = zipfile.ZipFile(channelPath, 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/mtchannel_{channel}".format(channel=line.strip('\n'))
zipped.write("empty", empty_channel_file)
python代码很容易理解,就是把原本的apk,重命名复制一份到指定的channelApk目录下,然后再向重命名后的apk里面写入空文件,生成渠道包。
执行脚本后文件目录如下:
可以看到,已经生成了渠道包:
我们解压其中一个渠道包可以看到,确实写入了该渠道路径的空文件:
通过简单的脚本文件,我们已经实现了渠道包的自动生成,最后附上识别渠道包的java代码:
public class ChannelTools {
public static String getChannel(Context context) {
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
String ret = "";
ZipFile zipfile = null;
try {
zipfile = new ZipFile(sourceDir);
Enumeration<?> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
Log.i("ANTDEMO", "entryName : " + entryName);
if (entryName.startsWith("META-INF/mtchannel")) {
ret = entryName;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String[] split = ret.split("_");
if (split != null && split.length >= 2) {
return ret.substring(split[0].length() + 1);
} else {
return "";
}
}
}