Android快速批量多渠道包的「蛋生」

對於安卓程序猿朋友來講,每當發佈新版本的APP,均會分發到各大應用市場,好比騰訊應用寶,豌豆莢和360手機助手等。爲了讓程序猿同志們更好的區分不一樣的應用市場,掌握各市場APP發展情況,爲了更多體現世界對程序猿的關愛,咱們的多渠道包誕生啦。
                                                                         java

1、Android多渠道打包機制

       Android多渠道打包機制的原理爲:向分發到不一樣市場的APP中打入對應的市場標識,APP運行時獲取到該標識信息,並將信息發送到指定的統計服務器,用於跟蹤記錄各個市場中APP的發展狀況。
      經過製做多渠道包,程序猿朋友們能夠掌握第一手應用市場動態,隨時向老闆彙報,制定相應的需求策略,出任總經理,擔任CEO,贏取白富美,今後走上人生巔峯。
                                                       
 python

二.多渠道包的DIY方式  
   

      Android中添加渠道信息,比較經常使用的有三種,分別爲:android

  • AndroidManifest.xml中添加渠道信息服務器

  • META-INF目錄下添加渠道信息app

  • APK文件的註釋字段中添加渠道信息


       例如,對於渠道Goapk_Market,三種渠道信息的添加方式以下:
1.  AndroidManifest.xml中添加渠道信息。
        渠道信息將被添加到application結點下的子結點meta-data中,以下:   工具

 <application
          android:icon="@7F03000A"
          android:label="@7F060014"
          android:theme="@7F090083">
      <meta-data
            android:name="Goapk_Market"
            android:value="Goapk">
      </meta-data>測試

       該種方式是目前應用最廣的一種,好比友盟統計sdk,騰訊統計sdk等。其中name和value能夠自由定義,比較靈活。APP能夠利用系統API,方便的獲取渠道信息,示例代碼以下:gradle

 ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
    String channel = appInfo.metaData.getString("Goapk_Market");ui

2.  META-INF目錄下添加渠道信息。
        渠道信息將被添加到APP的META-INF目錄下,以下:
        
       該種方式也是較經常使用的方式之一,利用了META-INF目錄的優點,能夠在APP簽名後,再添加渠道信息。相對第一種方式,如何獲取渠道信息相對麻煩些,示例代碼以下:this

  public static String getChannel(Context context) {
        ApplicationInfo appinfo = context.getApplicationInfo();
        String sourceDir = appinfo.sourceDir;
        System.out.println("channel="+ sourceDir);
        String ret = "";
        ZipFile zipfile = null;
        try {
            zipfile = new ZipFile(sourceDir);
            Enumeration<?> entries = zipfile.entries();
            while (entries.hasMoreElements()) {
                 ZipEntry entry = ((ZipEntry) entries.nextElement());
                 String entryName = entry.getName();
                 if (entryName.startsWith("META-INF") && entryName.contains("渠道名稱_")) {
                    ret = entryName;
                    break;
                 }
            }
         } catch (IOException e) {
            e.printStackTrace();
         } finally {
            if (zipfile != null) {
                try {
                    zipfile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        String[] split = ret.split("_");
        if (split != null && split.length >= 2) {
            returnsplit[split.length-1];
        } else {
            return "";
        }
    }
 

3.  APP文件的註釋字段中添加渠道信息。
        該種方式利用了APK自己是一種zip包的特色,在zip的註釋字段中添加渠道信息,並提供了gradle插件。其中數據格式定義以下:   
        
        而添加的渠道信息以下所示:
      
        該種方式較前兩種方式實現相對麻煩些,特別是渠道信息的獲取須要讀取整個APK,解析註解,獲取渠道信息,另外就是兼容性不是很好。
 

3、快速批量多渠道打包工具的實現

      目前,前兩種渠道包製做方式應用較廣。咱們的程序猿大兄弟考慮羣衆需求,爲你們介紹基於前兩種打包方式的快速批量多渠道打包工具實現 .

一、利用Gradle Flavor實現快速批量打包
        該方案充分利用了gradle的特性,具體爲根據需求在build.gradle文件中配置productFlavor,並添加必要的代碼和資源文件,實現快速多渠道打包,比較靈活,可是有必定的侷限性,徹底依賴於gradle,不太適合自動化的構建過程。
        該方案的具體過程爲:
    a、在AndroidManifest.xml裏設置動態渠道變量。

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}">

    b、在build.gradle設置productFlavors。

android {  
            productFlavors {
                qh360 {}
                baidu {}
                wandoujia {}
            }  
 
            productFlavors.all {
                flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
            }
        }
   

       經過上面的配置,能夠達到一次編譯就能產生多個具備本身特性配置的版本。


二、利用python腳本實現快速批量打包
      該方案主要應用在第二種渠道包製做方式中,經過向簽名後APP的META-INF目錄下寫入渠道文件,實現打渠道包。該方案利用了腳本的靈活性,適合批量打包,很是方便,可是通過測試,偶爾會出現生成的渠道包損壞的狀況。典型表明就是美團客戶端的高效多渠道打包,萬能的互聯網向咱們展現了此種方法的詳細過程,固然也歡迎感興趣的大妹子在後臺與我深夜互動。


三、快速批量多渠道打包工具
    爲了便於自動化的集成,網易雲捕精英大隊開發了多渠道打包工具,該工具主要基於前兩種渠道包製做方式,實現快速批量多渠道包的生成。
    命令行下,運行:java -jar makechannels.jar 查看版本號與使用方法:

    NetEase makechannel 1.0
        Usage:
            java -jar makechannels.jar -apk input.apk -config channel.txt [-flag manifest|meta] [-out outdir] 
[-encoding utf-8|utf-8bom|gbk|unicode|ansi|utf-16be]

參數 說明
-apk 必填,後跟須要多渠道打包的APK全路徑。
-config 必填,後跟渠道配置文件,請參考渠道配置文件channel.txt說明。
-flag 可選,後跟渠道方式,共有兩種方式,分別爲:
一、manifest,表示在AndroidManifest.xml中添加渠道信息。
二、meta,表示在app的META-INF目錄下,添加渠道信息。
不填,則默認使用方式一。
-out 可選,輸出目錄。不填,則默認爲輸入APK同級目錄下的channels。
-encoding 可選,配置文件編碼格式,該模式僅支持參數中列出的編碼格式。不填,則根據配置文件自動判斷編碼格式。

注:多渠道打包後,須要從新簽名。能夠從http://apk.aq.163.com/#download下載極速簽名工具進行批量快速簽名。
 
網易雲加密默認集成了該工具,用戶能夠將工具拷貝出來,單獨使用。   (乳齒機智有木有!有木有!網易爸爸給咱們帶來的深夜福利,分分鐘路轉粉啊<( ̄3 ̄)> )

相關文章
相關標籤/搜索