Android美團(tuán)多渠道打包Walle集成

一、為什么使用美團(tuán)多渠道打包的方式庄涡?

  • 打包更加快速
    傳統(tǒng)的通過productFlavors渠道包的方式量承,渠道10個以內(nèi)還可以接受,如果100個渠道包穴店,每個包需要打5Min,就是將近10個小時的打包撕捍,而采用美團(tuán)Walle多渠道打包的方式只需要打一個包的時間。
  • 配置更加靈活
    可以在APK渠道包中通過配置config文件泣洞,針對于不同渠道包配置各個渠道定制化額外信息

二忧风、多渠道打包原理介紹

整個APK(ZIP文件格式)會被分為以下四個區(qū)塊:

  • Contents of ZIP entries(from offset 0 until the start of APK Signing Block)
  • APK Signing Block
  • ZIP Central Directory
  • ZIP End of Central Directory


    apk-sections.png

這個是V2簽名包的APK包格式,新的應(yīng)用簽名方案有著良好的向后兼容性球凰,能完全兼容低于Android 7.0(Nougat)的版本狮腿。對比舊簽名方案,它有更快的驗證速度和更安全的保護(hù)呕诉。
區(qū)塊1缘厢、3、4都是受保護(hù)區(qū)塊甩挫,不允許修改保護(hù)區(qū)塊贴硫。美團(tuán)打包的方式,是在2區(qū)塊內(nèi)寫入ID-value的擴(kuò)展信息(渠道信息),并保存到APK中英遭。這樣间护,每打一個渠道包只需復(fù)制一個APK,然后在APK中添加一個ID-value即可挖诸,這種打包方式速度非持撸快,對一個30M大小的APK包只需要100多毫秒(包含文件復(fù)制時間)就能生成一個渠道包多律,而在運行時獲取渠道信息只需要大約幾毫秒的時間痴突。

三、Walle的工程配置及打包方式

在位于項目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴狼荞, 如下:

buildscript {
    dependencies {
        classpath 'com.meituan.android.walle:plugin:1.1.6'
    }
}

并在當(dāng)前App的 build.gradle 文件中apply這個插件苞也,并添加上用于讀取渠道號的AAR

apply plugin: 'walle'

dependencies {
    compile 'com.meituan.android.walle:library:1.1.6'
}

配置插件

walle {
    // 指定渠道包的輸出路徑
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名稱
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

配置項具體解釋:

  • apkOutputFolder:指定渠道包的輸出路徑, 默認(rèn)值為new File("${project.buildDir}/outputs/apk")
  • apkFileNameFormat:定制渠道包的APK的文件名稱, 默認(rèn)值為${appName}-${buildType}-${channel}.apk
    可使用以下變量:
     projectName - 項目名字
     appName - App模塊名字
     packageName - applicationId (App包名packageName)
     buildType - buildType (release/debug等)
     channel - channel名稱 (對應(yīng)渠道打包中的渠道名字)
     versionName - versionName (顯示用的版本號)
     versionCode - versionCode (內(nèi)部版本號)
     buildTime - buildTime (編譯構(gòu)建日期時間)
     fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
     flavorName - 編譯構(gòu)建 productFlavors 名

插入額外信息
channelFile只支持渠道寫入粘秆,如果想插入除渠道以外的其他信息,請在walle配置中使用configFile

walle {
    // 渠道&額外信息配置文件收毫,與channelFile互斥
    configFile = new File("${project.getProjectDir()}/config.json")
}

configFile是包含渠道信息和額外信息的配置文件路徑攻走。
配置文件采用json格式,支持為每個channel單獨配置額外的寫入信息此再。

{
  //extraInfo 不要出現(xiàn)以`channel`為key的情況
  /*
  不聲明extraInfo的channel默認(rèn)使用的extraInfo
  如果沒有此項則沒有默認(rèn)extraInfo
  */
  "defaultExtraInfo": {
    "key2": "20161213",
    "key": "20161212"
  },

  /*
    strategy:
     1. ifNone (默認(rèn)適用此策略) : 僅當(dāng)對應(yīng)channel沒有extraInfo時生效
     2. always : 所有channel都生效昔搂,channel中extraInfo的key與defaultExtraInfo重復(fù)時,覆蓋defaultExtraInfo中的內(nèi)容输拇。
   */

  //"defaultExtraInfoStrategy": "always",

  "channelInfoList": [
    {
      "channel": "meituan",
      // 此channel將使用自己聲明的extraInfo
      /*
      此alias可以做到寫入apk的channel是meituan摘符,而打包時輸出的文件名是美團(tuán)
      注意:alias不聲明時,walle配置apkFileNameFormat中channel就是channel策吠,否則為alias
      */
      "alias": "美團(tuán)",
      "extraInfo": {
        "buildtime": "20161212",
        "hash": "123"
      }
    },
    {
      "channel": "360cn",
      // 此channel將使用自己聲明的extraInfo
      "extraInfo": {
        "key": "20161213"
      }
    },
    {
      "channel": "googleplay"
      // 此channel將使用defaultExtraInfo
    },
    {
      "channel": "xiaomi"
      // 此channel將使用defaultExtraInfo
    },
    {
      "channel": "meizu"
      // 此channel將使用defaultExtraInfo
    },
    {
      "channel": "wandoujia",
      "excludeDefaultExtraInfo": true
      //強制聲明不使用defaultExtraInfo逛裤,默認(rèn)false
    },
    {
      "channel": "myapp",
      "excludeDefaultExtraInfo": true,
      //強制聲明不使用defaultExtraInfo,默認(rèn)false
      "extraInfo": {
        // 盡管exclude default猴抹,但也可以繼續(xù)寫入自己的带族。
        "key": "20161212"
      }
    }
  ]
}

注意:

  • 此配置項與channelFile功能互斥,開發(fā)者在使用時選擇其一即可蟀给,兩者都存在時configFile優(yōu)先執(zhí)行蝙砌。
  • extraInfo 不要出現(xiàn)以channel為key的情況

如何獲取渠道信息:

在需要渠道等信息時可以通過下面代碼進(jìn)行獲取

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

生成渠道包

AS右側(cè)點開Gradle工具欄,如下圖所示跋理,雙擊運行Task任務(wù)


TM20181108103724.png

生成的APK渠道包择克,根據(jù)Walle配置文件路徑查找


TM20181108103732.png

四、關(guān)于友盟統(tǒng)計多渠道的變更

因為友盟統(tǒng)計之前的多渠道統(tǒng)計方式是在AndroidManifast.xml文件中配合Gradle腳本productFlavors實現(xiàn)的多渠道信息集成前普。采用這種多渠道打包方式之后肚邢,productFlavors不存在了,就算沒有刪除通過原有的獲取渠道信息的方式獲取到的渠道信息也不對了汁政。所以需要進(jìn)行變更道偷。很簡單缀旁,只需在友盟初始化的時候把Channel信息作為參數(shù)傳入即可。如下所示:

    /**
     * 作者:郭翰林
     * 時間:2018/6/15 0015 12:07
     * 注釋:Umeng初始化配置
     *
     * @param mAppContext
     * @param mUmengKey
     * @param mUmengChannel
     * @param mUmengSecret
     */
    public UmengModule(Context mAppContext, String mUmengKey, String mUmengChannel, String mUmengSecret) {
        this.mUmengKey = mUmengKey;
        this.mUmengChannel = mUmengChannel;
        this.mUmengSecret = mUmengSecret;
        this.mAppContext=mAppContext;
        UMConfigure.init(mAppContext, mUmengKey, mUmengChannel, UMConfigure.DEVICE_TYPE_PHONE, mUmengSecret);
    }
        
     /**
     * 作者:郭翰林
     * 時間:2018/6/15 0015 14:15
     * 注釋:注冊友盟勺鸦,不要做主進(jìn)程判斷和在線程里注冊
     */
    private void registerUmeng() {
        UmengModule module = new UmengModule(sysApplication, "XXXXXXXXXXX",
                WalleChannelReader.getChannel(sysApplication), "XXXXXXXXXX");
                .........
                .........
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末并巍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子换途,更是在濱河造成了極大的恐慌懊渡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军拟,死亡現(xiàn)場離奇詭異剃执,居然都是意外死亡,警方通過查閱死者的電腦和手機懈息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門肾档,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辫继,你說我怎么就攤上這事怒见。” “怎么了姑宽?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵遣耍,是天一觀的道長。 經(jīng)常有香客問我炮车,道長舵变,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任瘦穆,我火速辦了婚禮纪隙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扛或。我一直安慰自己瘫拣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布告喊。 她就那樣靜靜地躺著麸拄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黔姜。 梳的紋絲不亂的頭發(fā)上拢切,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音秆吵,去河邊找鬼淮椰。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的主穗。 我是一名探鬼主播泻拦,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忽媒!你這毒婦竟也來了争拐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤晦雨,失蹤者是張志新(化名)和其女友劉穎架曹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闹瞧,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绑雄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奥邮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片万牺。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖洽腺,靈堂內(nèi)的尸體忽然破棺而出杏愤,到底是詐尸還是另有隱情,我是刑警寧澤已脓,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站通殃,受9級特大地震影響度液,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜画舌,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一堕担、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曲聂,春花似錦霹购、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旭咽,卻和暖如春贞奋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穷绵。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工轿塔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓勾缭,卻偏偏與公主長得像揍障,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俩由,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容