1. 使用方式
1.1 按照正常流程打包APK
1.2 修改渠道文件channels.txt
文件內(nèi)的每一行一個渠道號
例子:
360
xiaomi
baidu
91
guanwang
offline
tencent
wandoujia
1.3 批量打包Python腳本
機(jī)器上一定要安裝python,建議安裝2.7.*版本
1.4 執(zhí)行python腳本
python package.py APK文件名 輸出文件夾名
例子:
python package.py test-2015-05-19.apk out
2 原理
如果能直接修改apk的渠道號,而不需要再重新簽名能節(jié)省不少打包的時(shí)間菱皆。幸運(yùn)的是我們找到了這種方法拍鲤。直接解壓apk龙助,解壓后的根目錄會有一個META-INF目錄
如果在META-INF目錄內(nèi)添加空文件,可以不用重新簽名應(yīng)用星虹。因此菩佑,通過為不同渠道的應(yīng)用添加不同的空文件,可以唯一標(biāo)識一個渠道地回。
下面的python代碼用來給apk添加空的渠道文件,渠道名的前綴為laowang_:
import zipfile
import shutil
import sys
import os
apk_path = sys.argv[1]
out_path = sys.argv[2]
if not os.path.exists(out_path):
os.makedirs(out_path)
name = os.path.basename(apk_path)
channels_file = open('channels.txt')
origin_apk_name = os.path.splitext(name)[0]
for channel in channels_file:
channel_apk_name = "{}_{}.apk".format(origin_apk_name, channel.strip())
channel_apk_path = os.path.join(out_path, channel_apk_name)
shutil.copy2(apk_path, channel_apk_path)
zipped = zipfile.ZipFile(channel_apk_path, 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/laowang_{}".format(channel.strip())
zipped.writestr(empty_channel_file, '')
zipped.close()
- 執(zhí)行Python命令,將會輸出所有指定渠道號的APK文件
python package.py test-2015-05-19-2.apk out
- 在Android中得到渠道號
public static String getMetaInfChannel(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();
//如果想修改此標(biāo)示,直接編輯pack.py即可
if (entryName.startsWith("META-INF/hengeasy")) {
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 "";
}
}