更便捷的Android多渠道打包方式

本文先回顧了以往流行的多渠道打包方式,隨後引入的mcxiaoke的packer-ng-plugin項目,介紹該項目在實際應用(配合友盟統計)中如何解決更方便的Android多渠道打包問題html

  • 多渠道打包方案解析
  • 實際應用集成

多渠道打包方案解析

android應用市場多種多樣,應用寶、小米市場、豌豆莢...爲了監督每一個市場咱們的應用下載和推廣狀況,對發佈在每一個市場上的apk打上烙印是必須的一步,這就是多渠道apk的問題,「渠道」就是給apk打上的烙印。
同時友盟統計能夠幫咱們統計渠道數據(Channel),方便產品經理對數據分析後作下一步產品決策。java

目前多渠道打包方式大體有:python

  1. gradle自帶的productFlavor方式,見我以前的博客
  2. apktool重簽名重打包
  3. 在apk文件中的META-INF文件夾中寫入以渠道號命名的空文件方式(美團)

第三種是比較快的方式,聽說900多個渠道不到一分鐘就能打完,參考。可是缺點也是有的,你須要維護一個python腳本,爲每一種渠道寫入一個以渠道名命名的空文件。android

本文將介紹的packer-ng-plugin的思路實際上是有點相似的,因爲apk就是一個zip文件,zip文件尾部有一個部分能夠做爲zip文件的註釋,正確修改這一部分不會對ZIP文件形成破壞,利用這個字段,咱們能夠添加一些自定義的數據,PackerNg項目就是在這裏添加和讀取渠道信息。同時提供了讀取渠道信息的接口。git

實際應用集成

修改項目gradle,加入github

buildscript {
    ......
    dependencies{
    // add packer-ng
        classpath 'com.mcxiaoke.gradle:packer-ng:1.0.5'
    }
}

修改moudle級別gradle,加入shell

apply plugin: 'packer' 

dependencies {
    // add packer-helper
    compile 'com.mcxiaoke.gradle:packer-helper:1.0.5'
}

注意:packer-ng 和 packer-helper 的版本號須要保持一致windows

在你的項目根目錄中加入渠道列表文件,好比文件名是market.txt,內容是app

YingYongBao
XiaoMi
WanDouJia
Baidu
Qihoo
GooglePlay
...

就是每一行即一個渠道號gradle

再在你的項目根目錄加入一個bat腳本(windows),好比叫作build.bat,內容寫上(即一個命令)

gradle -Pmarket=markets.txt clean apkRelease

大功告成,之後每次打渠道包,只要進入你的根目錄,雙擊這bat腳本,packer-ng-plugin就開始自動幫你根據market.txt構建每個渠道包;或者直接在android studio的Terminal中執行build.bat亦可。

觀察控制檯的輸出,packer-ng最終是爲每個渠道包的打製造成了一個個的gradle task:

...
:app:apkRelease processed apk for XiaoMi (4)
:app:apkRelease processed apk for WanDouJia (5)
:app:apkRelease processed apk for Baidu (6)
:app:apkRelease processed apk for Qihoo (7)
:app:apkRelease processed apk for GooglePlay (8)
:app:apkRelease all 8 apks saved to D:\workspace\shine\build\archives
:app:apkRelease PackerNg: Market Packaging Successful!
BUILD SUCCESSFUL
Total time: 1 mins 23.269 secs

根據這個輸出,他一共生成了8個渠道包,全部的apk輸出在了項目根目錄的build/archives文件夾中

packer-ng-plugin也提供了一些自定義配置,好比輸入的apk的命名方式,具體參考插件配置說明,同時提供了java和python的命令行腳本,供集成到持續集成環境中,具體參考命令行打包腳本

最後須要提的一點就是如何讓友盟統計知道目前的apk是哪一個渠道。首先你須要刪除以前的productFlavor或者manifest的佔位符的方式的代碼,刪除AndroidManifest中友盟的渠道Channel的META-Data的配置。
而後在app入口(Application)的onCreate中加入下列代碼:

final String market = PackerNg.getMarket(this,"defaul_channel);
AnalyticsConfig.setChannel(market); //AnalyticsConfig是友盟的代碼方式設置渠道類
相關文章
相關標籤/搜索