Android 多渠道打包配置

看完這篇你學(xué)到什么:

  • 熟悉gradle的構(gòu)建配置
  • 熟悉代碼構(gòu)建環(huán)境的目錄結(jié)構(gòu)铡恕,你知道的不僅僅是只有src/main
  • 開(kāi)發(fā)铁材、生成環(huán)境等等環(huán)境可以任意切換打包
  • 多渠道打包
  • APK輸出文件配置

需求

一般我們開(kāi)發(fā)的環(huán)境分為:debug 和 release问慎,但是你想再分內(nèi)測(cè)1環(huán)境型雳、內(nèi)測(cè)2環(huán)境等等怎么辦呢骂删?

這就需要依賴(lài)強(qiáng)大的gradle 來(lái)配置了。

相關(guān)的配置也可以參考谷歌官方文檔四啰。

配置構(gòu)建類(lèi)型 buildTypes

名詞解析我們通常會(huì)分不同的編譯環(huán)境進(jìn)行打包宁玫,比如有debug、release柑晒、beta等環(huán)境參數(shù)欧瘪,像這種我們就稱(chēng)之為buildTypes.

您可以在模塊級(jí) build.gradle 文件的 android {} 代碼塊內(nèi)部創(chuàng)建和配置構(gòu)建類(lèi)型。當(dāng)您創(chuàng)建新模塊時(shí)匙赞,Android Studio 會(huì)自動(dòng)為您創(chuàng)建調(diào)試和發(fā)布這兩種構(gòu)建類(lèi)型佛掖。盡管調(diào)試構(gòu)建類(lèi)型不會(huì)出現(xiàn)在構(gòu)建配置文件中,Android Studio 會(huì)將其配置為 debuggable true涌庭。這樣芥被,您可以在安全的 Android 設(shè)備上調(diào)試應(yīng)用并使用通用調(diào)試密鑰庫(kù)配置 APK 簽署。

如果您希望添加或更改特定設(shè)置坐榆,您可以將調(diào)試構(gòu)建類(lèi)型添加到您的配置中拴魄。以下示例為調(diào)試構(gòu)建類(lèi)型指定了 applicationIdSuffix,并配置了一個(gè)使用調(diào)試構(gòu)建類(lèi)型中的設(shè)置進(jìn)行初始化的jnidebug構(gòu)建類(lèi)型席镀。

applicationIdSuffix: 字段表示匹中,在不改變你默認(rèn)的程序ID(包名)的情況下,為其添加后綴豪诲。比如你的包名是com.rae.app顶捷,但你想?yún)^(qū)分測(cè)試包和正式包的情況,這個(gè)時(shí)候?qū)pplicationIdSuffix設(shè)置為.debug屎篱,那么你的應(yīng)用程序?qū)?yīng)的包名就變成了com.rae.app.debug

android {
    ...
    defaultConfig {...}
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            applicationIdSuffix ".debug"
        }

        /**
         * The 'initWith' property allows you to copy configurations from other build types,
         * so you don't have to configure one from the beginning. You can then configure
         * just the settings you want to change. The following line initializes
         * 'jnidebug' using the debug build type, and changes only the
         * applicationIdSuffix and versionNameSuffix settings.
         */

        jnidebug {

            // This copies the debuggable attribute and debug signing configurations.
            initWith debug

            applicationIdSuffix ".jnidebug"
            jniDebuggable true
        }
    }
}

構(gòu)建源集

名詞解析: 通常源代碼是放在src/main 文件夾下的服赎,但你想可以根據(jù)不同的構(gòu)建類(lèi)型(比如debug葵蒂、release)區(qū)分不同的源文件,這樣對(duì)應(yīng)建立的文件夾就是一個(gè)不同的構(gòu)建源重虑。打個(gè)比方刹勃,debug的構(gòu)建源為src/debug,release的構(gòu)建源為src/release嚎尤,而在src/main定義的為公共資源荔仁,最后在構(gòu)建的時(shí)候會(huì)進(jìn)行合并操作。

Android Studio 按邏輯關(guān)系將每個(gè)模塊的源代碼和資源分組為源集芽死。模塊的 main/ 源集包括其所有構(gòu)建變體共用的代碼和資源乏梁。其他源集目錄為可選項(xiàng),在您配置新的構(gòu)建變體時(shí)关贵,Android Studio 不會(huì)自動(dòng)為您創(chuàng)建這些目錄遇骑。不過(guò),創(chuàng)建類(lèi)似于 main/ 的源集有助于讓 Gradle 只應(yīng)在構(gòu)建特定應(yīng)用版本時(shí)使用的文件和資源井然有序:

構(gòu)建源的命名規(guī)則如下:
productFlavor 表示渠道包揖曾,可以看下面的多渠道打包

  • src/main/ 此源集包括所有構(gòu)建變體共用的代碼和資源落萎。
  • src/<buildType>/ 創(chuàng)建此源集可加入特定構(gòu)建類(lèi)型專(zhuān)用的代碼和資源。示例:src/jnidebug
  • src/<productFlavor>/ 創(chuàng)建此源集可加入特定產(chǎn)品風(fēng)味專(zhuān)用的代碼和資源炭剪。比如百度渠道包:src/baidu
  • src/<productFlavorBuildType>/ 創(chuàng)建此源集可加入特定構(gòu)建變體專(zhuān)用的代碼和資源练链。

例如,要生成應(yīng)用的“完全調(diào)試”版本奴拦,構(gòu)建系統(tǒng)需要合并來(lái)自以下源集的代碼媒鼓、設(shè)置和資源。比如:百度的開(kāi)發(fā)環(huán)境包:src/baiduDebug

構(gòu)建類(lèi)型的依賴(lài)配置

很多時(shí)候我們會(huì)把sdk或者api接口單獨(dú)做成一個(gè)庫(kù)错妖,一般會(huì)有生產(chǎn)環(huán)境和測(cè)試環(huán)境之分绿鸣,但在依賴(lài)的時(shí)候往往我們會(huì)像這樣去引用:compile project(':sdk'),這樣依賴(lài)的環(huán)境就是release暂氯,在開(kāi)發(fā)調(diào)試的時(shí)候測(cè)試環(huán)境的時(shí)候就不行了潮模。我們得換另外一種方式:

<buildType>Compile project()

這樣會(huì)根據(jù)不同的構(gòu)建類(lèi)型去依賴(lài)不同的包,比如我們測(cè)試環(huán)境的依賴(lài)包:debugCompile project(':sdk')痴施,再比如上面的jnidebug:jnidebugCompile project(':sdk')

那么問(wèn)題來(lái)了擎厢,我當(dāng)前的構(gòu)建類(lèi)型怎么對(duì)應(yīng)到其他的module去呢?比如你的app要依賴(lài)sdk module 的debug 環(huán)境晾剖,那么你可以這么做:

configuration:目標(biāo)module的<buildType>锉矢,比如你sdk 中<buildType>的debug構(gòu)建類(lèi)型

debugCompile project(path: ':sdk', configuration: 'debug')

綜合示例

  1. 先看app這邊的build.gradle配置:
apply plugin: 'com.android.application'

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
        }
        
        // 自定義的構(gòu)建類(lèi)型,名字隨便取齿尽,一定要有意義
        raedebug {
            initWith debug
            applicationIdSuffix '.raedebug'
        }
    }
}

dependencies {
    // 生成環(huán)境依賴(lài)
    releaseCompile project(path: ':sdk', configuration: 'release')
    // 測(cè)試環(huán)境依賴(lài)
    debugCompile project(path: ':sdk', configuration: 'debug')
    // 自定義構(gòu)建類(lèi)型依賴(lài)
    raedebugCompile project(path: ':sdk', configuration: 'uutest')
}

  1. sdk module的build.gradle配置:
apply plugin: 'com.android.library'

android {
       buildTypes {
        debug {
            debuggable true
            minifyEnabled false
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        
        // 注意這里,跟第一點(diǎn)的 raedebugCompile project的configuration要匹配灯节。
        uutest {
            initWith debug
        }
    }
}


渠道打包 productFlavors

先看看build.gradle配置你就懂了

android{

    // 渠道包定義循头,默認(rèn)定義的名稱(chēng)就是渠道名稱(chēng)
    productFlavors {
 
        dev {} // 測(cè)試
        baidu {}        // 百度手機(jī)助手
        yinyongbao {}   // 應(yīng)用寶
        m360 {}         // 360手機(jī)助手
        pp {}           // PP助手
        anzhi{}         // 安智市場(chǎng)
        xiaomi {}       // 小米商店
        letv {}         // 樂(lè)視商店
        huawei {}       // 華為商店
        lenovomm {}     // 聯(lián)想樂(lè)商店
        other {}        // 其他市場(chǎng)
        official{}      // 官方版本
 
    }
 
    // 批量渠道包值替換
    productFlavors.all { flavor ->
        // 友盟绵估、極光推送渠道包, UMENG_CHANNEL 是根據(jù)你AndroidManifest.xml來(lái)配置的卡骂,請(qǐng)看下面国裳。
        flavor.manifestPlaceholders = [UMENG_CHANNEL: name, JPUSH_CHANNEL: name]
    }
}

AndroidManifest.xml 配置:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.rae.demo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
       
       <!--變量采用${變量名}這樣來(lái)替換,不僅限與<meta-data /> 標(biāo)簽全跨,任何你想替換的都行缝左。-->
         <meta-data
            android:name="UMENG_APPKEY"
            android:value="${UMENG_APPKEY}"/>
        
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL}"/>
        
        <!--${變量隨變換}-->   
        <activity
            android:name=".DemoActivity"
            android:label="${變量隨變換}"/>
            
    </application>

</manifest>

sync gradle之后看看gradle projects 面板列表就多出了好到渠道的任務(wù)了,Build Variants 面板也相對(duì)應(yīng)多了這些構(gòu)建類(lèi)型浓若。

APK輸出配置

在結(jié)合到多渠道打包后渺杉,運(yùn)營(yíng)的那邊希望我們給的渠道包是這種格式的app-{版本號(hào)}-{渠道名稱(chēng)}.apk,那我們來(lái)看看怎么來(lái)滿(mǎn)足這個(gè)多渠道打包輸出apk文件名修改的挪钓。

android{

    // 輸出文件配置
   applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def dirName = outputFile.parent // 輸出文件夾所在的位置
            
                // 文件名修改
                def fileName = "app-${output.processResources.variantName}-${defaultConfig.versionName}-${variant.flavorName}.apk"
                
                // 比如不想這么麻煩是越,直接在后面加上版本號(hào)也行:
                // def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                
                
                output.outputFile = new File(dirName, fileName)
            }
        }
    }
}

上面介紹的多渠道打包是采用gralde默認(rèn)的配置,但有個(gè)弊端是每個(gè)渠道包都會(huì)重新編譯一次碌上,編譯速度慢倚评。

喜歡請(qǐng)點(diǎn)擊+關(guān)注哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市馏予,隨后出現(xiàn)的幾起案子天梧,更是在濱河造成了極大的恐慌,老刑警劉巖霞丧,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腿倚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚯妇,警方通過(guò)查閱死者的電腦和手機(jī)敷燎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箩言,“玉大人硬贯,你說(shuō)我怎么就攤上這事≡墒眨” “怎么了饭豹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)务漩。 經(jīng)常有香客問(wèn)我拄衰,道長(zhǎng),這世上最難降的妖魔是什么饵骨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任翘悉,我火速辦了婚禮,結(jié)果婚禮上居触,老公的妹妹穿的比我還像新娘妖混。我一直安慰自己老赤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布制市。 她就那樣靜靜地躺著抬旺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祥楣。 梳的紋絲不亂的頭發(fā)上开财,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音误褪,去河邊找鬼责鳍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛振坚,可吹牛的內(nèi)容都是我干的薇搁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渡八,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啃洋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起屎鳍,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宏娄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逮壁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孵坚,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窥淆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卖宠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忧饭,死狀恐怖扛伍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情词裤,我是刑警寧澤刺洒,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吼砂,受9級(jí)特大地震影響逆航,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渔肩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一因俐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦女揭、人聲如沸蚤假。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至袍嬉,卻和暖如春境蔼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伺通。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工箍土, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罐监。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓吴藻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弓柱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沟堡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,135評(píng)論 8 72
  • 版權(quán)聲明:本文為博主原創(chuàng)文章矢空,未經(jīng)博主允許不得轉(zhuǎn)載航罗。 https://blog.csdn.net/zhaoyanj...
    勤奮的pangdunhu閱讀 2,038評(píng)論 0 1
  • 文章來(lái)源:Google 此頁(yè)面以配置構(gòu)建概覽為基礎(chǔ),向您介紹如何配置構(gòu)建變體屁药,以便從同一個(gè)項(xiàng)目中創(chuàng)建應(yīng)用的不同版本...
    文文太遠(yuǎn)了閱讀 769評(píng)論 0 1
  • 這一章主要針對(duì)項(xiàng)目中可以用到的一些實(shí)用功能來(lái)介紹Android Gradle粥血,比如如何隱藏我們的證書(shū)文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,619評(píng)論 3 25
  • 又到學(xué)期末酿箭,又是離別時(shí)复亏。 “老師,9月份你還教我們嗎缭嫡?”這是今天上午散學(xué)典禮后孩子們圍著我問(wèn)得最多的問(wèn)題缔御。 “這是...
    鹿鳴閣主閱讀 198評(píng)論 1 1