Android自动生成渠道包

作者: stefanli | 来源:发表于2016-03-15 16:32 被阅读845次

承接上文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 "";
        }
    }
}

相关文章

网友评论

    本文标题:Android自动生成渠道包

    本文链接:https://www.haomeiwen.com/subject/vmhqlttx.html