Android使用美團(tuán)多渠道打包方案詳解
Andorid渠道市場(chǎng)有多分散呢?分散到比Android碎片化還嚴(yán)重,你還在為多渠道打包而頭疼嗎?美團(tuán)提供了速度快到白駒過隙的多渠道打包方案。說的有點(diǎn)夸張,對(duì),雖然夸張,但是確實(shí)很快,不夸張不足以形容其快。廢話不多說,先講原理,再講實(shí)踐方法。
新舊打包方法原理對(duì)比講解
傳統(tǒng)方式
在AndroidManifest定義渠道的年代,多渠道打包無非以下兩種方案:
- 方案一:完全的重新編譯,即在代碼重新編譯打包之前,在AndroidManifest中修改渠道標(biāo)示;
- 方案二:通過ApkTool進(jìn)行解包,然后修改AndroidManifest中修改渠道標(biāo)示,最后再通過ApkTool進(jìn)行打包、簽名。
這兩種打包方式,不管是哪種,效率都很低,方案一毫無效率可言,而且打包的渠道規(guī)模非常小,第二種方案效率稍微高些,打包的渠道規(guī)模也還可以,但是這兩種方案速度慢的驚人,如果你打個(gè)上百的渠道包試試,估計(jì)你的電腦能卡一下午。慢,當(dāng)然也有好處,你可以不用工作了,喝著咖啡,玩著手機(jī)慢慢等也很愜意是不?哈哈……
美團(tuán)高效的多渠道打包方案
美團(tuán)高效的多渠道打包方案是把一個(gè)Android應(yīng)用程序包當(dāng)作一個(gè)zip文件包進(jìn)行解壓,然后發(fā)現(xiàn)在簽名生成的目錄下添加一個(gè)空文件,空文件用渠道名來命名,而且不需要重新簽名。這種方式不需要重新簽名,編譯等步驟,使得這種方法非常高效。
第一步:解壓apk文件
我們直接解壓apk,解壓后的根目錄會(huì)有一個(gè)META-INF目錄
如果在META-INF目錄內(nèi)添加空文件,可以不用重新簽名應(yīng)用。因此,通過為不同渠道的應(yīng)用添加不同的空文件,可以唯一標(biāo)識(shí)一個(gè)渠道。
第二步:用python腳本向apk文件中添加空渠道文件
我們用python代碼來給apk添加空的渠道文件,渠道名的前綴為mtchannel_:
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目錄多了一個(gè)名為mtchannel_meituan的空文件
第三步:用java代碼讀取渠道名,并動(dòng)態(tài)設(shè)置渠道名
我們用腳本生成了文件之后,文件的名字是用渠道名來命名的,所以我們?cè)趩?dòng)程序的時(shí)候,可以用java代碼動(dòng)態(tài)讀取渠道名,并動(dòng)態(tài)的去設(shè)置。
java代碼讀取渠道名的方法:
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 ""; } }
讀取到了渠道名,我們就可以動(dòng)態(tài)的設(shè)置了,比如友盟渠道的動(dòng)態(tài)設(shè)置方法是:AnalyticsConfig.setChannel(getChannel(Context context) );這樣就好了。這種方式每打一個(gè)渠道包只需復(fù)制一個(gè)apk,在META-INF中添加一個(gè)使用渠道號(hào)命名的空文件即可。這種打包方式速度非??欤瑩?jù)說900多個(gè)渠道不到一分鐘就能打完。我親測(cè)的是我用了10秒鐘打了32個(gè)渠道包,是不是很快。
實(shí)踐使用
你可能會(huì)說,我看不懂上面的python代碼,那個(gè)腳本里的內(nèi)容看不明白,這個(gè)沒關(guān)系。你仔細(xì)明白了原理即可,因?yàn)橛腥私o你造輪子,我們直接騎就可以了。
實(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/
第二步:設(shè)置python腳本并把封裝好的類放到工程里
好心人已經(jīng)把運(yùn)行的打包腳本寫好了,并且也封裝了讀取渠道號(hào)的實(shí)體工具類。大家只需要去github上下載即可。
地址:https://github.com/GavinCT/AndroidMultiChannelBuildTool
當(dāng)然在github上也有相關(guān)的使用介紹,非常簡(jiǎn)單,一看就懂。這里簡(jiǎn)單說下,下載下來有個(gè)ChannelUtil.java類,里面封裝好了獲取渠道號(hào)的方法,你只需要在啟動(dòng)應(yīng)用程序的地方調(diào)用友盟的設(shè)置代碼即可,比如:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this))。
第三步:配置渠道列表
我們?cè)趃ithub上把輪子下載下來之后,你解壓文件,在PythonTool/Info/channel.txt中編輯渠道列表,沒寫一個(gè)渠道名,換行即可。
第四步:復(fù)制簽好名的包,運(yùn)行腳本
你把你已經(jīng)簽名打包好的apk文件,復(fù)制到PythonTool目錄下和MultiChannelBuildTool.py這個(gè)腳本同級(jí),直接雙擊點(diǎn)擊MultiChannelBuildTool.py即可完成打包。
ok,到這里基本就講完了,講了講原理,又講了講實(shí)踐方式,鑒于別人都給你造好輪子了,所以使用起來非常簡(jiǎn)單,趕緊去試一試吧。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android Gradle多渠道打包的實(shí)現(xiàn)方法
- Android Studio中一套代碼多渠道打包的實(shí)現(xiàn)方法
- Android 多渠道(友盟)打包教程分享
- Android多渠道打包時(shí)獲取當(dāng)前渠道的方法
- Android幾種多渠道打包的步驟詳解
- Android Studio多渠道打包的配置方法
- Android多渠道打包總結(jié)(推薦)
- 使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包
- Android Studio多渠道打包、自定義打包APK名稱
- Android Studio多渠道打包套路
- Android使用Walle實(shí)現(xiàn)多渠道打包功能的實(shí)現(xiàn)示例
相關(guān)文章
Android開發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能,涉及Android權(quán)限控制及屏幕亮度相關(guān)屬性操作技巧,需要的朋友可以參考下2018-03-03Android多點(diǎn)觸控實(shí)現(xiàn)對(duì)圖片放大縮小平移,慣性滑動(dòng)等功能
這篇文章主要介紹了Android多點(diǎn)觸控實(shí)現(xiàn)對(duì)圖片放大縮小平移,慣性滑動(dòng)等功能的相關(guān)資料,需要的朋友可以參考下2016-02-02Android實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Android 基于RecyclerView實(shí)現(xiàn)的歌詞滾動(dòng)自定義控件
這篇文章主要介紹了Android 基于RecyclerView實(shí)現(xiàn)的歌詞滾動(dòng)自定義控件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03