美团多渠道快速打包

上个博客介绍了一个传统的打包方式,但是这种打包方式只适用于渠道包较少的情况,而渠道包一旦多起来的时候,这种方法就不太适用了,打包的过程中耗费了太多的时间,真可谓费力不讨好,今天,给大家介绍一种新的多渠道快速打包的方式:美团自动化打包之旅,为广大安卓技术开发者提供新的打包方式

打包方案

实现原理

传统的打包方案是,在每次打包的时候,都会重新执行一次构建的过程,而这个过程非常的耗费时间,如果一次打包需要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的空文件:
美团多渠道快速打包_第1张图片

步骤三

接下来就可以在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多个渠道不到一分钟就能打完。

你可能感兴趣的:(android)