多渠道打包方式:
1、像友盟的在andridmanifest.xml配置mete-data,获取相应的值
2、像美团的在包体插入一个空文件,利用文件名当做渠道标识

这里介绍的是自己利用脚本实现美团的多渠道打包方式

android 7.0后引入了v2签名,这种签名能够使包体安装的更快,更加安全,如果想往包体里面插入内容,而又不损坏签名,在7.0以下是可以的,
但是如果在7.0以后那就不能了,会在安装时提示签名无效,而v1签名则不会,所以我们需要用的是v1签名,不能使用v2签名

那么如果往一个打包好的apk里插入文件而又不损坏签名呢?其实在v1签名中往META-INF文件夹中插入一个空文件时不会改变签名的,具体需要了解v1的签名方式,这样我们就可以通过脚本往里面插入一个空文件,然后通过读取这个文件名来获取渠道标识

例如给这个文件起名为: channel_baidu

下面我们通过代码来读取这个渠道号:

private String getChannel(Context context) {
        ApplicationInfo appinfo = context.getApplicationInfo();
        String sourceDir = appinfo.sourceDir;
        String channel="";
        String ret=null;
        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("META-INF/channel")) {
                    ret = entryName;
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (zipfile != null) {
                try {
                    zipfile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        if(ret!=null){
        String[] split = ret.split("_");
        if (split != null && split.length >= 2) {
            channel = ret.substring(split[0].length() + 1);
            Log.e("渠道号", channel);
        }
        return channel;
    }

渠道获取到了,那就是如何使用脚本来打包了,脚本如下(python脚本):
新建一个文件referer.py,把下面内容复制进去

#!/usr/bin/env python
#-*- encoding:utf-8 -*-

import os
import sys
import os.path
import shutil
import zipfile

filename = sys.argv[1]
pack = sys.argv[2]
referer = sys.argv[3]

shutil.copy(filename, pack)
zip = zipfile.ZipFile(pack, 'a', zipfile.ZIP_DEFLATED)
ref_file = "META-INF/channel_{channel}".format(channel=referer)
zip.write("./test.txt", ref_file)
zip.close()

命令:
python referer.py app.apk app_referer.apk baidu
参数解释:app.apk 源apk, app_referer.apk 打包后的apk,baidu 渠道号

zip.write(“./test.txt”, ref_file) 中的./test.txt 为当前打包目录下的一个空文件

运行命令就可以打出渠道号为baidu的包了

那么如何实现一次n个渠道呢?继续往下看

新建一个一个文件qudao.txt,配置渠道信息,一个渠道一行(切记)

如下:

yarn 打包脚本 脚本怎么打包apk_渠道

新建一个脚本test.py

#!/usr/bin/env python
#-*- encoding:utf-8 -*-

import os
import sys
import os.path
import shutil
import zipfile
#执行pytho命令
import commands
#修改文件编码
import codecs
#修改文件内容
import re

filename = sys.argv[1]

with codecs.open("qudao.txt","r") as red:
     ls=red.readlines()
     for strs in ls:
        referer=strs.strip()
        pack="app_"+referer+".apk"
        shutil.copy(filename, pack)
        zip = zipfile.ZipFile(pack, 'a', zipfile.ZIP_DEFLATED)
        ref_file = "META-INF/channel_{channel}".format(channel=referer)
        zip.write("./test.txt", ref_file)
        zip.close()

zip.write(“./test.txt”, ref_file) 中的./test.txt 为当前打包目录下的一个空文件
python有严格的格式要求,直接复制进去,不要做格式修改
命令: python test.py app.apk

app.apk为源apk

这样你配置了几个渠道就会打几个渠道的包