多渠道打包方式:
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,配置渠道信息,一个渠道一行(切记)
如下:
新建一个脚本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
这样你配置了几个渠道就会打几个渠道的包