友盟的多渠道打包


一.步驟:

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.執行簽名打包:

這時候你去app/build/outputs/apk中就能看到自動打好的渠道包了。
 

二.缺點:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM