多渠道打包的概念:
打包是指使用證書文件對app簽名生成一個apk文件。
多渠道打包指的就是我們的app在開發完成之后需要投放到不同的市場,比如說Google市場、百度市場等,為了統計應用在各個市場的用戶下載量、新增用戶量等數據,需要把他們打包成不同的包投放到不同的市場,每種包都包含了各自市場的信息。
多渠道打包的實現:
目前多渠道打包主要有兩種實現方式:一種就是gradle變量動態替換,第二種就是第三方公司推出的批量打包方案。
gradle動態變量替換:
首先,將manifest文件中的meta-data標簽的value值用占位符替換。即${channel}
<meta-data android:name="UMENG_CHANNEL" android:value="${channel}" />
然后,在build.gradle文件中,添加productFlavors節點,配置變量的所有取值集合。
//渠道配置,通過產品微調的功能來配置 productFlavors { //添加一個產品配置項,名稱是WanDouJiaChannel WanDouJiaChannel { //表示清單文件中有一個占位符channel,編譯的時候會將它的值替換為wandoujia manifestPlaceholders = [channel:"wandoujia"] } //再添加一個小米AppStore渠道 XiaoMiChannel { manifestPlaceholders = [channel:"xiaomi"] } //再添加一個應用寶渠道 YingYongBaoChannel { manifestPlaceholders = [channel:"yingyongbao"] } //...為所有渠道添加配置 }
最后,通過打包生成全部的apk文件。
美團自動化打包:
原理:先准備一個簽過名的apk文件,然后復制多個apk文件,再向每個apk文件的META-INF目錄中寫入空文件,而這個文件的名稱正好命名為渠道名。這樣下來,每個apk文件的META-INF目錄下都有一個標識了渠道名稱的空文件。然后我們在app代碼中,動態讀取META-INF目錄下的那個空文件,就獲取到了渠道名,然后傳遞給友盟SDK。
具體做法如下:
在美團提供的工具中,channel.txt文件是所有的取到信息,如果需要新的,則在下面繼續添加。包內有一個MultiChannelBuildTool.py文件這個文件是用python寫的腳本程序,作用是讀取channel中的渠道信息,然后賦值很多個apk文件,再將讀取的取到信息一次寫入每個apk文件的META-INF目錄下,就是那個空文件。在app代碼中,我們使用美團提供的ChannelUtil工具類,讀取出META-INF目錄下的空文件,得到當前app的渠道信息,因此原來manifest文件中的meta-data的取到標簽要去掉了,原來gradle的那些渠道信息配置也都要刪除。代碼如下:
//獲取META-INF目錄下的渠道信息 String channel = ChannelUtil.getChannel(this); //將渠道信息設置給UmengSDK String appKey = "58b7fe1aae1bf82ad4001a1d"; MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(this,appKey,channel); MobclickAgent.startWithConfigure(config);
代碼編寫完成之后,導出一個簽名的apk文件,然后放到PythonTool目錄下,該apk文件目前沒有任何渠道信息,只是功python腳本來復制用的。
最后,雙擊執行MultiChannelBuildTool.py文件,當然前提是安裝python運行環境。此時會復制出所有apk文件,並且每個apk文件的META-INF目錄下都會出現新的空文件,文件名就是渠道名。
個人總結:app多渠道打包主要有這么兩種方式,一種是gradle替換動態變量的方式,主要實現是首先在清單文件的applcation節點下添加meta-data條目,並且將其value值設置為占位符(${channel}),然后去build.gradle文件中添加productFlovars節點,在該節點下添加各個渠道的信息,最后打包即可。還有一種是通過第三方的工具來實現。用的多的就是美團的自動打包工具。它的實現原理主要是:我們的apk文件一旦被修改就需要重新簽名,而當我們在apk文件的META-INF目錄下添加一個空文件的時候卻不需要重新簽名。美團打包工具就是利用了這個特性來實現打包,節省打包時間。主要實現是通過一個python的腳本工具。
首先在app中添加代碼,獲取META-INF目錄下空文件的文件名,這個文件名就是對應的渠道信息。然后將一個沒有取到信息的安裝包使用腳本工具生成多個安裝包。