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í)際值
- 在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)了。
- 在美團(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
參考網(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