Android 多渠道打包

Android 多渠道打包

Android 其實并沒有多渠道的概念夸政,所謂的渠道號是人為添加以識別應(yīng)用市場渠道的消恍。

Android Gradle 原生多渠道打包

原理

雖然 Android 本身不支持渠道號,但是 Android-Gradle 插件有維度的概念豺总,通過維度可以實現(xiàn)模擬多渠道打包车伞。

如下面的例子:

    flavorDimensions "channel", "version"

    productFlavors {
        dji {
            dimension 'channel'
            buildConfigField 'String','channel_key','"dji_sign"'
        }

        '360' {
            dimension 'channel'
            buildConfigField 'String','channel_key','"360_sign"'
        }

        free {
            dimension 'version'
        }

        vip {
            dimension 'version'
        }
    }

通過 productFlavorsdimension 的組合關(guān)系,上面的例子可以打出如下的多種組合包:

djifreedebug喻喳、djivipdebug另玖、djifreerelease、djiviprelease表伦、360...

buildConfigField 屬性可以給特殊維度設(shè)置獨有變量日矫,如上述例子中,dji 維度的包會生成一個值為 "dji_sign" 的 channel_key 變量绑榴,而 360 維度的包則會生成一個值為 "360_sign" 的 channel_key 變量哪轿。

buildConfigField 顧名思義是給 BuildConfig 添加不同維度下的變量,與之作用類似的還有 manifestPlaceholders翔怎,從名字可以看出它是給 AndroidManifest 添加不同維度下的占位符窃诉。關(guān)于這倆個 Gradle 屬性的詳細使用規(guī)則這里不做詳細介紹,各位可以自行 Google赤套。

實現(xiàn)

Module - build.gradle - android 模塊下飘痛,添加如下配置:

    flavorDimensions "channel"

    productFlavors {
        dji {
            dimension "channel"
        }
        baidu {
            dimension "channel"
        }
        xiaomi {
            dimension "channel"
        }
    }

    productFlavors.all {
        flavor -> manifestPlaceholders.put("channel", name)
    }

manifestPlaceholders 創(chuàng)建了一個名為 'channel',值為維度名的占位符容握,然后在 AndroidManifest 配置(引用方式:${占位符})該占位符宣脉,以表達渠道的概念:

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="channel"
            android:value="${channel}" />

    </application>

然后控制臺執(zhí)行 ./gradlew build,就會打出所有維度(渠道)的包剔氏。

用下面的方式獲取 channel 的值上報塑猖。

    public String parseChannel() {
        String channel = null;
        try {
            ApplicationInfo appInfo = getPackageManager().getApplicationInfo(getPackageName(), GET_META_DATA);
            Bundle metaData = appInfo.metaData;
            channel = metaData.getString("channel");
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return channel;
    }

總結(jié)

原生 Gradle 支持,缺點是工程量大谈跛、速度慢羊苟。

第三方 Gradle 插件多渠道打包

這里推薦使用 packer-ng-plugin

原理

APK 文件就是一個帶簽名信息的 ZIP 文件,根據(jù) ZIP 文件格式規(guī)范感憾,每個 ZIP 文件的最后都必須有一個叫 Central Directory Record 的部分蜡励,這個 CDR 的最后部分叫"end of central directory record",這一部分包含一些元數(shù)據(jù),它的末尾是 ZIP 文件的注釋凉倚。注釋包含 Comment Length 和 File Comment 兩個字段兼都,前者表示注釋內(nèi)容的長度,后者是注釋的內(nèi)容稽寒,正確修改這一部分不會對 ZIP 文件造成破壞扮碧,利用這個字段,我們可以添加一些自定義的數(shù)據(jù)瓦胎,PackerNg 項目就是在這里添加和讀取渠道信息芬萍。

實現(xiàn)

根目錄 build.gradle 添加:

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

module 模塊 build.gradle 添加:

apply plugin: 'com.android.application'
apply plugin: 'packer'  //1.

android {
    ...
    defaultConfig {
        ...
    }

    signingConfigs {
        release {
            storeFile file("你的簽名地址")
            storePassword "你的簽名密碼"
            keyAlias "你的簽名別名"
            keyPassword "你的簽名密碼"
            v2SigningEnabled false  //2.一定要把v2簽名關(guān)掉
        }

        debug {
            storeFile file("你的簽名地址")
            storePassword "你的簽名密碼"
            keyAlias "你的簽名別名"
            keyPassword "你的簽名密碼"
            v2SigningEnabled false  //一定要把v2簽名關(guān)掉
        }
    }

    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release //3.
        }

        debug {
            ...
            signingConfig signingConfigs.debug
        }
    }
}

dependencies {
    ...
    implementation 'com.mcxiaoke.gradle:packer-helper:1.0.9' //4.
}

點擊同步尤揣,代碼中獲取渠道號:

String market = PackerNg.getMarket(Context);

配置完畢搔啊,開始打包。

打包方式有倆種北戏,這里只介紹控制臺打包负芋,其余參見 Github

在項目根目錄下創(chuàng)建 markets.txt 文件嗜愈,文件內(nèi)容如下:

google#谷歌渠道
xiaomi#小米渠道
huawei#華為渠道

每行一個渠道旧蛾,# 號表示注釋。

然后控制臺輸入如下命令打包(執(zhí)行命令前建議運行一次項目蠕嫁,確認無誤再執(zhí)行):

./gradlew -Pmarket=markets.txt clean apkRelease

打包成功后锨天,可在 根目錄/build/archives 看到渠道包文件(注意不是 module 下的 build 文件夾)。

總結(jié)

packer-ng-plugin 插件通過修改復(fù)制 zip(apk)實現(xiàn)了快速打包剃毒,缺點是兼容性沒有原生好病袄,可能存在適配問題。

其它多渠道打包方式

除此之外還有其余快速打包方式赘阀,如通過 python 快速修改 apk -- AndroidManifest -- meta_data 屬性益缠,然后重簽名對齊;如通過美團網(wǎng)批量打包工具 walle基公,這里僅提供思路和方向幅慌,具體項目選擇合適的打包方式即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轰豆,一起剝皮案震驚了整個濱河市胰伍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酸休,老刑警劉巖喇辽,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雨席,居然都是意外死亡菩咨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抽米,“玉大人特占,你說我怎么就攤上這事≡迫祝” “怎么了是目?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長标捺。 經(jīng)常有香客問我懊纳,道長,這世上最難降的妖魔是什么亡容? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任嗤疯,我火速辦了婚禮,結(jié)果婚禮上闺兢,老公的妹妹穿的比我還像新娘茂缚。我一直安慰自己,他們只是感情好屋谭,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布脚囊。 她就那樣靜靜地躺著,像睡著了一般桐磁。 火紅的嫁衣襯著肌膚如雪悔耘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天我擂,我揣著相機與錄音衬以,去河邊找鬼。 笑死扶踊,一個胖子當著我的面吹牛泄鹏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秧耗,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼备籽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了分井?” 一聲冷哼從身側(cè)響起车猬,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尺锚,沒想到半個月后珠闰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘫辩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年伏嗜,在試婚紗的時候發(fā)現(xiàn)自己被綠了坛悉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡承绸,死狀恐怖裸影,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情军熏,我是刑警寧澤轩猩,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站荡澎,受9級特大地震影響均践,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摩幔,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一彤委、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧热鞍,春花似錦葫慎、人聲如沸衔彻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艰额。三九已至澄港,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柄沮,已是汗流浹背回梧。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祖搓,地道東北人狱意。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像拯欧,于是被迫代替她去往敵國和親详囤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 目錄一镐作、Python打包及優(yōu)化(美團多渠道打包)二藏姐、Gradle打包三、其他打包方案:修改Zip文件的commen...
    守望君閱讀 5,675評論 4 17
  • 前言: 01.應(yīng)用的打包簽名 什么是打包该贾? 打包就是根據(jù)簽名和其他標識生成安裝包羔杨。 簽名是什么? 1.在andro...
    溫一閱讀 7,034評論 2 7
  • 多渠道打包的用途 用途一:統(tǒng)計不同渠道的數(shù)據(jù)杨蛋,方便在推廣運營過程中進行有效的渠道比較兜材。來評估渠道的質(zhì)量理澎。 用途二:...
    沒有故事的男童鞋閱讀 20,032評論 0 19
  • 蘇祿王妃葛木寧和太子墓園矾端,位于山東省德州市蘇祿王墓東側(cè)(關(guān)于“蘇祿王墓”。本博客有專文介紹)卵皂。明朝永樂年間...
    2018欄桿拍遍閱讀 281評論 0 0
  • 秋風(fēng)吹灯变,吹不開夏日的炎熱殴玛。悶悶的,好像心情都開始躁動添祸。 綠葉是清新滚粟,片片存陰忆家。在樹下才尋得一片陰涼中燥,一絲慰藉。 在...
    元氣少女易婷閱讀 176評論 0 1