傳統(tǒng)打包方法原理
- 傳統(tǒng)的打包方法都是在AndroidManifest添加渠道標(biāo)示痢掠,每打一次包修改一次標(biāo)示的名稱(chēng)。效率特別的低砖瞧,一個(gè)稍微大一點(diǎn)的項(xiàng)目打上幾十個(gè)渠道包可能需要幾個(gè)小時(shí)半天的時(shí)間息堂。
美團(tuán)打包方法原理
- 由于傳統(tǒng)的打包方式每次修改渠道都需要重新的構(gòu)建項(xiàng)目,時(shí)間都浪費(fèi)構(gòu)建上面了块促,美團(tuán)提供了一種新的打包方案荣堰,將APK直接當(dāng)做zip解壓目錄里會(huì)有一個(gè)META-INF目錄而此目錄是不參與簽名校驗(yàn)的。因此在META-INF目錄內(nèi)添加不同的空文件竭翠,可以唯一標(biāo)識(shí)一個(gè)渠道振坚。采用這種方式,每打一個(gè)渠道包只需復(fù)制一個(gè)apk斋扰,在META-INF中添加一個(gè)使用渠道號(hào)命名的空文件即可渡八。
實(shí)現(xiàn)
- 所以打包可以分成兩大步啃洋。 第一步在META-INF目錄內(nèi)添加不同的空文件,用于標(biāo)識(shí)渠道屎鳍。(不會(huì)寫(xiě)宏娄? 不用擔(dān)心, 已經(jīng)有大神給我們寫(xiě)好了逮壁。: https://github.com/GavinCT/AndroidMultiChannelBuildTool 下載即可孵坚。Python 寫(xiě)的)
- 第二步: 如何在代碼中獲取到META-INF目錄中的渠道文件名稱(chēng)
/**
* 從apk中獲取版本信息
* @param context
* @param channelKey
* @return
*/
private static String getChannelFromApk(Context context, String channelKey) {
//從apk包中獲取
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
//注意這里:默認(rèn)放在meta-inf/里, 所以需要再拼接一下
String key = "META-INF/" + channelKey;
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(key)) {
ret = entryName;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String[] split = ret.split("_");
String channel = "";
if (split != null && split.length >= 2) {
channel = ret.substring(split[0].length() + 1);
}
return channel;
}
實(shí)踐使用
第一步:配置python環(huán)境:
我們既然需要使用腳本打包窥淆,那么相應(yīng)的電腦上必須有可以運(yùn)行python腳本的運(yùn)行環(huán)境卖宠。所以我們第一步是要配置python運(yùn)行環(huán)境。 自己去官網(wǎng)下載安裝即可祖乳,非常簡(jiǎn)單逗堵。官網(wǎng)地址:https://www.python.org/第二步:編寫(xiě)python腳本:
好心人已經(jīng)把運(yùn)行的打包腳本寫(xiě)好了秉氧,并且也封裝了讀取渠道號(hào)的實(shí)體工具類(lèi)眷昆。大家只需要去github上下載即可。 AndroidMultiChannelBuildTool 當(dāng)然在github上也有相關(guān)的使用介紹汁咏,非常簡(jiǎn)單亚斋,一看就懂。這里簡(jiǎn)單說(shuō)下攘滩,下載下來(lái)有個(gè)ChannelUtil.java類(lèi)帅刊,里面封裝好了獲取渠道號(hào)的方法,只需要在啟動(dòng)應(yīng)用程序的地方調(diào)用友盟的設(shè)置代碼即可漂问,比如:
AnalyticsConfig.setChannel(ChannelUtil.getChannel(this))赖瞒。
第三步:配置渠道列表
我們?cè)趃ithub上把python腳本下載下來(lái)之后,解壓文件蚤假,在PythonTool/Info/channel.txt中編輯渠道列表栏饮,沒(méi)寫(xiě)一個(gè)渠道名,換行即可磷仰。第四步:運(yùn)行腳本
把已經(jīng)簽名打包好的apk文件袍嬉,復(fù)制到PythonTool目錄下和MultiChannelBuildTool.py這個(gè)腳本同級(jí),直接雙擊點(diǎn)擊MultiChannelBuildTool.py 即可完成打包灶平。
最后伺通,喜歡的同學(xué)可以關(guān)注我的微信公眾號(hào),我會(huì)不定期的寫(xiě)一些相關(guān)的文章逢享,吹一些牛逼罐监、砍一些大山、來(lái)一些心靈雞湯瞒爬、搞一些不為人知的故事
↑↑↑↑↑識(shí)別他弓柱、關(guān)注他↑↑↑↑↑