Android多渠道打包

Android多渠道打包
概述

每當(dāng)發(fā)新版本時(shí)栏豺,Android客戶端會(huì)被分發(fā)到各個(gè)應(yīng)用市場(chǎng)彬碱,比如豌豆莢,360手機(jī)助手等奥洼。為了統(tǒng)計(jì)這些市場(chǎng)的效果(活躍數(shù)四苇,下單數(shù)等)粒梦,需要有一種方法來唯一標(biāo)識(shí)它們。客戶端通過渠道號(hào)來區(qū)分不同的市場(chǎng)财喳,比如,豌豆莢市場(chǎng)中美團(tuán)應(yīng)用的渠道號(hào)是wandoujia揍庄,360手機(jī)助手中美團(tuán)應(yīng)用的渠道號(hào)為qihu360脖旱。客戶端訪問API時(shí)會(huì)在請(qǐng)求參數(shù)中帶上渠道號(hào)尉尾,以便后臺(tái)接下來計(jì)算不同渠道的效果爆阶。
如果渠道越來越多的話,手動(dòng)打包就顯得效率太低了沙咏,多渠道打包這種高效率打包的方式就顯得尤為重要了辨图。
多渠道打包看著挺高大上的,但是其本質(zhì)就是在APP中動(dòng)態(tài)改變渠道這個(gè)參數(shù)肢藐,就這么簡(jiǎn)單~
下面我來介紹幾種比較常用的多渠道打包方式故河。

(一)動(dòng)態(tài)資源配置的方式實(shí)現(xiàn)多渠道打包
  • 在main的同級(jí)目錄下,有幾個(gè)渠道就新建幾個(gè)渠道的文件夾吆豹,文件夾下分別新建一個(gè)assets目錄鱼的,并把每個(gè)渠道對(duì)應(yīng)的asserts目錄下放置不用的渠道資源配置文件(LeSportsConfig.json
    A4D6461C-E16E-4EDB-95D2-9FDEDD5099E6.png

    目前我們有LETV理盆,TCL,WASU三個(gè)渠道凑阶,并在每個(gè)渠道中放置了不同的配置文件
    注意:main文件夾下的asserts目錄就不用放置LeSportsConfig.json文件
  • 在build.gradle中添加productFlavors中添加三個(gè)渠道
    如下圖所示:


    FCB930A5-4EFA-4604-A266-36419A730201.png

    LeSportsConfig.json

  • 使用gradle命令進(jìn)行打包

(1) ./gradlew -v 版本號(hào)
(2) ./gradlew clean 清除/app目錄下的build文件夾
(3)./gradlew build 檢查依賴并編譯并把debug和release環(huán)境的包都打出來
(4) ./gradlew assembleDebug 編譯并打Debug包
(5) ./gradlew assembleRelease 編譯并打Release的包
(6) ./gradlew installRelease Release模式打包并安裝
(7)./gradlew uninstallRelease 卸載Release模式包

  • 當(dāng)渠道打包完成后猿规,不同的渠道包會(huì)讀取不同的資源文件
    7E17C076-BE2D-4E81-8909-4DA4B199A63D.png

    這種打包的方式比較簡(jiǎn)單,缺點(diǎn)也很明顯宙橱,渠道號(hào)少的話還比較好姨俩,但是渠道號(hào)一多的話,就顯得太乏力了师郑,如果有500個(gè)渠道的話哼勇,你要新建500個(gè)對(duì)應(yīng)的不同資源文件。

(二) 在Mainifest.xml配置文件中添加meta-data參數(shù)來實(shí)現(xiàn)

  • 先在Mainfest.xml中添加名稱為PUB_CHANNEL字段呕乎,value值為(${PUB_CHANNEL_VALUE}的meta-data屬性积担。

<meta-data android:name="PUB_CHANNEL"android:value="${PUB_CHANNEL_VALUE}" />

  • 在build.gradle文件中配置多個(gè)渠道號(hào),并寫好每個(gè)渠道的實(shí)際值
ED0D0405-6119-48E6-A166-7E40530FDCC1.png
  • 在app中獲取這個(gè)渠道號(hào)的值猬仁,代碼如下:
PackageManager.GET_META_DATA);   
Stringmsg=info.metaData.getString("PUB_CHANNEL");   System.out.println("PUB_CHANNEL:"+msg);

這種打包方式和第一種方式一樣效率太低帝璧,由于需要配置多個(gè)渠道參數(shù),如果渠道包太多湿刽,配置的參數(shù)比較多不說的烁,還需要打包多次,自然比較耗時(shí)~ 該打包方式適合渠道較少的應(yīng)用

(三) 使用apktool進(jìn)行多渠道打包

根據(jù)第二種打包方式可知诈闺,我們可以在Mainifest文件中配置MATE-DATA屬性渴庆,然后在應(yīng)用內(nèi)部獲取該參數(shù)的方式實(shí)現(xiàn)渠道號(hào)的配置。那么如果我們通過改變這個(gè)參數(shù)雅镊,也是可以實(shí)現(xiàn)多渠道打包的襟雷?使用apktool進(jìn)行打包的方式就出現(xiàn)了~
該打包方式的具體思路如下:

  • 先事先準(zhǔn)備一個(gè)未打包的apk,使用apktool命令對(duì)其進(jìn)行解壓
  • 對(duì)于AndroidManifest.xml文件中定義的<meta-data>屬性仁烹,使用python腳本或者java代碼耸弄,對(duì)渠道的value值進(jìn)行修改。
  • 修改完畢后卓缰,再重新簽名打包

上面就是使用apktool打包的方法计呈,通過使用腳本可以批量地生成渠道包。該方法只需構(gòu)建一次征唬,大大節(jié)省了時(shí)間捌显。但是沒有第四種方式快~(900百個(gè)渠道包需要3個(gè)小時(shí))
具體參考:
使用apktool進(jìn)行多渠道打包地址
美團(tuán)多渠道打包

(4)美團(tuán)渠道打包方式

實(shí)現(xiàn)原理:先打好一個(gè)已經(jīng)簽名的apk包,在apk文件中META-INF目錄总寒,通過Python腳本在該文件夾下新建一個(gè)帶有渠道參數(shù)的空文件扶歪,最后通過在應(yīng)用內(nèi)部獲取該渠道號(hào)。這樣只需要打包一次就可以實(shí)現(xiàn)多渠道打包了偿乖,效率非常高~

  • 下載安裝python環(huán)境 Python下載地址
  • 下載python腳本 AndroidMultiChannelBuildTool
  • 將ChannelUtil.java代碼集成到工程里面击罪,在app啟動(dòng)時(shí)獲取渠道號(hào)傳送給后臺(tái)(如友盟:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this))哲嘲;
  • 下載開源項(xiàng)目AndroidMultiChannelBuildTool
    項(xiàng)目結(jié)構(gòu)如下:
    32A98D56-73B3-46A8-90D3-76475FE51372.png
  • 先打包一個(gè)apk文件贪薪,然后放在PythonTool文件夾下
  • 在channel.txt文件夾中把所有的渠道號(hào)分行添加進(jìn)去
  • 執(zhí)行MultiChannelBuildTool.py腳本媳禁,之后所有的渠道包就生成了,并會(huì)保存在xxx_build/文件夾下画切。
  • 最后通過ChannelUtil在應(yīng)用內(nèi)部獲取渠道號(hào)即完成整個(gè)打包流程了竣稽。
    這種方式打多個(gè)的時(shí)候不需要構(gòu)建多次,也不需要新建多個(gè)資源文件霍弹,只需要對(duì)apk文件進(jìn)行解壓并新建一個(gè)文件夾即可實(shí)現(xiàn)多渠道打包~
(5) 自制多參數(shù)配置渠道打包

由于項(xiàng)目具有多個(gè)渠道包參數(shù)需要配置毫别,而不局限于一個(gè)渠道名稱參數(shù),美團(tuán)渠道打包的方式是通過python腳本在META-INF目錄下
新建一個(gè)帶有渠道號(hào)的空文件夾實(shí)現(xiàn)的典格,那么能不能我們把事先準(zhǔn)備好的渠道參數(shù)配置文件LeSportsConfig.json復(fù)制到META-INF目錄下呢岛宦?每個(gè)渠道包下面都有一份對(duì)應(yīng)的渠道參數(shù)配置,然后當(dāng)應(yīng)用啟動(dòng)的時(shí)候耍缴,再去讀取里面的參數(shù)配置砾肺。通過一天的努力終于實(shí)現(xiàn)了。


81C50D82-0221-4D2D-9121-EA7507AF946D.png
  • 在美團(tuán)渠道打包的基礎(chǔ)上防嗡,我新建了一個(gè)config文件夾变汪,里面?zhèn)浞萘嗣總€(gè)渠道對(duì)應(yīng)的渠道參數(shù)配置文件(LeSportsConfig.json)
  • channel.txt文件中依然保持著對(duì)應(yīng)的渠道號(hào)
  • 新的python腳本是multi-channel-build-tool.py
    具體流程如下:
  • 首先遍歷channel.txt文件中的渠道號(hào),會(huì)在config文件夾下尋找對(duì)應(yīng)的渠道參數(shù)配置文件(LeSportsConfig.json)
  • 然后腳本回去尋找已經(jīng)打包好的APK蚁趁,并新建一個(gè)output xxx/
    的文件夾裙盾,這個(gè)文件夾用來放最終打好的渠道包的。
  • 接著腳本會(huì)把已經(jīng)找到的LeSportsConfig.json文件復(fù)制到META-INF文件夾下他嫡。
    這樣所有的渠道包就這樣打好了番官,
    下面來看看效果,但是執(zhí)行腳本有點(diǎn)麻煩:
  • 打開終端并進(jìn)入到PythonTool目錄下
  • 執(zhí)行命令:
    python /Users/liuyu/Deskto/demo/AndroidMultiChannelBuildTool/PythonTool/multi-channel-lesports-build-tool.py
D08342E8-6B68-484A-8A6C-0A94FCFF3478.png

參考網(wǎng)址:
(1) 美團(tuán)多渠道打包
(2) https://github.com/GavinCT/AndroidMultiChannelBuildTool
(3) https://github.com/AlexSmille
(4) http://blog.csdn.net/u013766103/article/details/52454585

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钢属,一起剝皮案震驚了整個(gè)濱河市鲤拿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌署咽,老刑警劉巖近顷,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宁否,居然都是意外死亡窒升,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門慕匠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饱须,“玉大人,你說我怎么就攤上這事台谊∪叵保” “怎么了譬挚?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酪呻。 經(jīng)常有香客問我减宣,道長(zhǎng),這世上最難降的妖魔是什么玩荠? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任漆腌,我火速辦了婚禮,結(jié)果婚禮上阶冈,老公的妹妹穿的比我還像新娘闷尿。我一直安慰自己,他們只是感情好女坑,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布填具。 她就那樣靜靜地躺著,像睡著了一般匆骗。 火紅的嫁衣襯著肌膚如雪劳景。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天绰筛,我揣著相機(jī)與錄音枢泰,去河邊找鬼。 笑死铝噩,一個(gè)胖子當(dāng)著我的面吹牛衡蚂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骏庸,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼毛甲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了具被?” 一聲冷哼從身側(cè)響起玻募,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎一姿,沒想到半個(gè)月后七咧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叮叹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年艾栋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉顽。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝗砾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悼粮,我是刑警寧澤闲勺,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站扣猫,受9級(jí)特大地震影響菜循,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苞笨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一债朵、第九天 我趴在偏房一處隱蔽的房頂上張望子眶。 院中可真熱鬧瀑凝,春花似錦、人聲如沸臭杰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴杆。三九已至寥枝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磁奖,已是汗流浹背囊拜。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留比搭,地道東北人冠跷。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像身诺,于是被迫代替她去往敵國和親蜜托。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 目錄一霉赡、Python打包及優(yōu)化(美團(tuán)多渠道打包)二橄务、Gradle打包三、其他打包方案:修改Zip文件的commen...
    守望君閱讀 5,696評(píng)論 4 17
  • 我們做Android用戶級(jí)應(yīng)用開發(fā)的時(shí)候都要考慮這樣的問題穴亏,目前的應(yīng)用市場(chǎng)有很多蜂挪,我們的安裝包是通過哪個(gè)渠道進(jìn)入用...
    尹star閱讀 8,769評(píng)論 11 26
  • 按照渠道識(shí)別型分類: META-INF渠道識(shí)別型:網(wǎng)頁版、Python版嗓化、BAT腳本棠涮、Jar版、Manifest渠...
    比薩u閱讀 1,995評(píng)論 9 18
  • 面試的時(shí)候蟆湖,如果面試官突然問到:你們渠道包是怎么打的故爵?如果你說是用gradle一個(gè)一個(gè)編譯的,然后他很鄙視的說這個(gè)...
    lovejjfg閱讀 2,284評(píng)論 10 14
  • 以前項(xiàng)目一直使用Python腳本進(jìn)行打包,自打Android7.0出來之后發(fā)現(xiàn)Python腳本打出來的包诬垂,不能以a...
    青青河邊踩閱讀 1,854評(píng)論 0 2