【Android 進階】友盟的多渠道打包方式

總結友盟的多渠道打包方式之前,先總結下多渠道打包的概念。

多渠道打包

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中就能看到自動打好的兩個渠道包了。

缺點

這樣的打包方式效率比較低下,如果是幾十個包還可以應付,打一個包快的話需要十幾秒,慢的話需要幾分鐘不等,跟機器性能很有關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章