溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android快速批量多渠道包的“蛋生”

發(fā)布時(shí)間:2020-07-02 13:27:45 來(lái)源:網(wǎng)絡(luò) 閱讀:658 作者:網(wǎng)易云捕 欄目:移動(dòng)開發(fā)

對(duì)于安卓程序猿朋友來(lái)說(shuō),每當(dāng)發(fā)布新版本的APP,均會(huì)分發(fā)到各大應(yīng)用市場(chǎng),比如騰訊應(yīng)用寶,豌豆莢和360手機(jī)助手等。為了讓程序猿同志們更好的區(qū)分不同的應(yīng)用市場(chǎng),掌握各市場(chǎng)APP發(fā)展?fàn)顩r,為了更多體現(xiàn)世界對(duì)程序猿的關(guān)愛,我們的多渠道包誕生啦。
                                                                         Android快速批量多渠道包的“蛋生”

一、Android多渠道打包機(jī)制

       Android多渠道打包機(jī)制的原理為:向分發(fā)到不同市場(chǎng)的APP中打入對(duì)應(yīng)的市場(chǎng)標(biāo)識(shí),APP運(yùn)行時(shí)獲取到該標(biāo)識(shí)信息,并將信息發(fā)送到指定的統(tǒng)計(jì)服務(wù)器,用于跟蹤記錄各個(gè)市場(chǎng)中APP的發(fā)展情況。
      通過(guò)制作多渠道包,程序猿朋友們可以掌握第一手應(yīng)用市場(chǎng)動(dòng)態(tài),隨時(shí)向老板匯報(bào),制定相應(yīng)的需求策略,出任總經(jīng)理,擔(dān)任CEO,贏取白富美,從此走上人生巔峰。
                                    
                   Android快速批量多渠道包的“蛋生”

 

二.多渠道包的DIY方式  
   

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

  • AndroidManifest.xml中添加渠道信息

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

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


       例如,對(duì)于渠道Goapk_Market,三種渠道信息的添加方式如下:
1.  AndroidManifest.xml中添加渠道信息。
        渠道信息將被添加到application結(jié)點(diǎn)下的子結(jié)點(diǎn)meta-data中,如下:   

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

       該種方式是目前應(yīng)用最廣的一種,比如友盟統(tǒng)計(jì)sdk,騰訊統(tǒng)計(jì)sdk等。其中name和value可以自由定義,比較靈活。APP可以利用系統(tǒng)API,方便的獲取渠道信息,示例代碼如下:

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

2.  META-INF目錄下添加渠道信息。
        渠道信息將被添加到APP的META-INF目錄下,如下:
        Android快速批量多渠道包的“蛋生”
       該種方式也是較常用的方式之一,利用了META-INF目錄的優(yōu)勢(shì),可以在APP簽名后,再添加渠道信息。相對(duì)第一種方式,如何獲取渠道信息相對(duì)麻煩些,示例代碼如下:

  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包的特點(diǎn),在zip的注釋字段中添加渠道信息,并提供了gradle插件。其中數(shù)據(jù)格式定義如下:   

        Android快速批量多渠道包的“蛋生”
        而添加的渠道信息如下所示:
      Android快速批量多渠道包的“蛋生”

        該種方式較前兩種方式實(shí)現(xiàn)相對(duì)麻煩些,特別是渠道信息的獲取需要讀取整個(gè)APK,解析注解,獲取渠道信息,另外就是兼容性不是很好。

三、快速批量多渠道打包工具的實(shí)現(xiàn)


 

      目前,前兩種渠道包制作方式應(yīng)用較廣。我們的程序猿大兄弟考慮群眾需求,為大家介紹基于前兩種打包方式的快速批量多渠道打包工具實(shí)現(xiàn)
1、利用Gradle Flavor實(shí)現(xiàn)快速批量打包
        該方案充分利用了gradle的特性,具體為根據(jù)需求在build.gradle文件中配置productFlavor,并添加必要的代碼和資源文件,實(shí)現(xiàn)快速多渠道打包,比較靈活,但是有一定的局限性,完全依賴于gradle,不太適合自動(dòng)化的構(gòu)建過(guò)程。
        該方案的具體過(guò)程為:
    a、在AndroidManifest.xml里設(shè)置動(dòng)態(tài)渠道變量。

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

    b、在build.gradle設(shè)置productFlavors。

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

       通過(guò)上面的配置,可以達(dá)到一次編譯就能產(chǎn)生多個(gè)具有自己特性配置的版本。
2、利用python腳本實(shí)現(xiàn)快速批量打包
      該方案主要應(yīng)用在第二種渠道包制作方式中,通過(guò)向簽名后APP的META-INF目錄下寫入渠道文件,實(shí)現(xiàn)打渠道包。該方案利用了腳本的靈活性,適合批量打包,非常方便,但是經(jīng)過(guò)測(cè)試,偶爾會(huì)出現(xiàn)生成的渠道包損壞的情況。典型代表就是美團(tuán)客戶端的高效多渠道打包,萬(wàn)能的互聯(lián)網(wǎng)向我們展示了此種方法的詳細(xì)過(guò)程,當(dāng)然也歡迎感興趣的大妹子在后臺(tái)與我深夜互動(dòng)。
3、快速批量多渠道打包工具
    為了便于自動(dòng)化的集成,網(wǎng)易云捕精英大隊(duì)開發(fā)了多渠道打包工具,該工具主要基于前兩種渠道包制作方式,實(shí)現(xiàn)快速批量多渠道包的生成。
    命令行下,運(yùn)行:java -jar makechannels.jar 查看版本號(hào)與使用方法:

    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]


參數(shù)說(shuō)明

-apk必填,后跟需要多渠道打包的APK全路徑。-config必填,后跟渠道配置文件,請(qǐng)參考渠道配置文件channel.txt說(shuō)明。-flag可選,后跟渠道方式,共有兩種方式,分別為:
1、manifest,表示在AndroidManifest.xml中添加渠道信息。
2、meta,表示在app的META-INF目錄下,添加渠道信息。
不填,則默認(rèn)使用方式一。-out可選,輸出目錄。不填,則默認(rèn)為輸入APK同級(jí)目錄下的channels。-encoding可選,配置文件編碼格式,該模式僅支持參數(shù)中列出的編碼格式。不填,則根據(jù)配置文件自動(dòng)判斷編碼格式。


注:多渠道打包后,需要重新簽名??梢詮?/span>http://apk.aq.163.com/#download下載極速簽名工具進(jìn)行批量快速簽名。
 

網(wǎng)易云加密默認(rèn)集成了該工具,用戶可以將工具拷貝出來(lái),單獨(dú)使用。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI