總結友盟的多渠道打包方式之前,先總結下多渠道打包的概念。
多渠道打包
1.什麼是多渠道包?
渠道包就是要在安裝包中添加渠道信息,也就是channel,對應不同的渠道,例如:小米市場、360市場、應用寶市場等
2.爲什麼要提供多渠道包?
我們要在安裝包中添加不同的標識,應用在請求網絡的時候攜帶渠道信息,方便後臺做運營統計(這就是添加渠道信息的用處)。
3.實現多渠道打包的原理:
一般來講,這個渠道的標識會放在AndroidManifest.xml的Application的一個Metadata中。然後就可以在java中通過API獲取對應的數據了。
4.如何實現?
現在android渠道多種多樣,其實渠道不僅僅侷限於應用市場,一種推廣方式也可以看做一個渠道,比如:通過人拉人的方式去推廣,官網上推廣,百度推廣等。所以說渠道成千上萬,爲了推廣,有時候一次也會打成千的安裝包,那你半天或者一天啥都別幹了,所以介紹幾個大公司高效的打包方式,借鑑一下。
友盟
第一種:友盟就提供了多渠道打包的方式,可用於渠道統計等。
現在Android的構建工具換成了gradle,通過gradle,簡單配置後就可以實現自動打所有渠道包。
1.按照umeng的要求,manifest文件中需要有
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
這段配置,value那裏就是wandoujia,360之類的渠道名稱,但是我們在這裏不會去寫渠道名,寫的是一個佔位符,後面gradle編譯的時候會動態的替換掉它。
2.在module(一般也就是app)的build.gradle的android{}中添加如下內容:
productFlavors{
wandoujia{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
xiaomi{
manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
}
}
productFlavors是android節點的一個自節點。你需要打什麼渠道的包,就在這裏按umeng的要求用渠道名給UMENG_CHANNEL_VALUE賦值。
3.優化1:上面只是兩個渠道,如果有幾十個渠道,都這樣寫,重複的東西太多,觀察到每個渠道就是flavor的名稱,所以修改如下:
productFlavors{
wandoujia{
//manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
xiaomi{
//manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
3.優化2:上面經過簽名打包後生成的apk的名稱是有默認命名規則的,如:xxx-xiaomi-release.apk 但是我們想包含版本信息如:xxx-xiaomi-release-1.0.apk,所以最終打包腳本如下:
productFlavors{
wandoujia{
//manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
xiaomi{
//manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
4.獲取渠道
在代碼中我們可以通過讀取mate-data信息來獲取渠道,然後添加到請求參數中,獲取方法如下:
private String getChannel() {
try {
PackageManager pm = getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("UMENG_CHANNEL");
} catch (PackageManager.NameNotFoundException ignored) {
}
return "";
}
5.執行簽名打包:
選中Flavors中的wandoujia \ xioami,點擊Finish就可以在app/build/outputs/apk中就能看到自動打好的兩個渠道包了。
缺點
這樣的打包方式效率比較低下,如果是幾十個包還可以應付,打一個包快的話需要十幾秒,慢的話需要幾分鐘不等,跟機器性能很有關係。