安卓渠道包功能,是指使用一个APK
文件快速生成不通商店投放渠道的APK, 方便后期进行广告投放跟踪.
下面我们介绍一种比较优雅的方式,无需重复打包,但是需要重签APP实现多渠道APK
另外一种方案: apk本质是一个zip,zip头部可以自由插入信息,实现
实现原理
直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:
![](https://img.haomeiwen.com/i2280423/6da41792dd60e478.jpeg)
如果在META-INF目录内添加一个空文件,来对不通的APK进行标记, 此方式在v1版本可以不用重新签名应用,但是v2需要重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
实现方式
1.构建出一个APK文件
2.给APK注入空的渠道文件, 渠道名前缀为mtchannel_
(举例: mtchannel_meituan
), 下面给出一个python代码的示例:
import zipfile
zipped = zipfile.ZipFile(your_apk, 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/mtchannel_{channel}".format(channel=your_channel)
zipped.write(your_empty_file, empty_channel_file)
添加完空渠道文件后的目录,META-INFO目录多了一个名为mtchannel_meituan的空文件:
![](https://img.haomeiwen.com/i2280423/a6130e935a30d259.jpeg)
3.APP内实现代码,在APP运行时读取渠道号
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();
if (entryName.startsWith("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 "";
}
}
经过上面的方式我们就能快速实现渠道包功能,借助这个思想,我们可以对App内注入任何想要注入的信息
3.App重新签名
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore your_keystore_path -storepass your_storepass -signedjar your_signed_apk, your_unsigned_apk, your_alias
网友评论