上个博客介绍了一个传统的打包方式,但是这种打包方式只适用于渠道包较少的情况,而渠道包一旦多起来的时候,这种方法就不太适用了,打包的过程中耗费了太多的时间,真可谓费力不讨好,今天,给大家介绍一种新的多渠道快速打包的方式:美团自动化打包之旅,为广大安卓技术开发者提供新的打包方式
打包方案
实现原理
传统的打包方案是,在每次打包的时候,都会重新执行一次构建的过程,而这个过程非常的耗费时间,如果一次打包需要3分钟,那么30个渠道包就需要90分钟的时间(然而现实开发中打包时间比这个更长),而美团团队所提供的打包方案却能完美解决这个问题,一分钟900个渠道包不是梦,他的实现原理是,通过解压Apk文件,并在META-INF文件夹里面添加一个由渠道号命名的空文件,以此来标识不同的渠道版本,使用这种方法,只需要打出一个正式包就可以了,后续的其他包只是在这个正式包里面修改空文件的文件名就可以了,是不是很神奇呢,下面我们就一起来看看吧!
步骤一
下面的python代码用来给apk添加空的渠道文件,渠道名的前缀为mtchannel_:
import zipfile
zipped = zipfile.ZipFile(your_apk, 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/mtchannel_{channel}".format(channel=your_channel)
zipped.write(your_empty_file, empty_channel_file)
步骤二
添加完空渠道文件后的目录,META-INFO目录多了一个名为mtchannel_meituan的空文件:
步骤三
接下来就可以在Java代码中读取空渠道文件名了:
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();
if (entryName.startsWith("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 "";
}
}
这样,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可。这种打包方式速度非常快,900多个渠道不到一分钟就能打完。