解压apk,解压后的根目录会有一个META-INF目录。如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
下面代码可以实现往apk中的META-INF目录下添加一个空文件zipped = zipfile.ZipFile([apk绝对路径], 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/[CHANNEL_PREFIX]{channel}".format(channel=[渠道名])
zipped.write([源空文件], empty_channel_file)
zipped.close()
下面代码为Java获取渠道号代码public static String getChannel() {
ApplicationInfo appinfo = StudyApplication.getContext().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();
int index = entryName.lastIndexOf(BuildConfig.CHANNEL_PREFIX);
if (index > 0) {
return entryName.substring(index + BuildConfig.CHANNEL_PREFIX.length());
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}
这样,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可。这种打包方式速度非常快,900多个渠道不到一分钟就能打完。