Gradle之構(gòu)建變體(BuildVariant)

一邑蒋、構(gòu)建變體

1. BuildType

1.1 默認BuildType

默認情況下,Android plugin會自動的構(gòu)建release和debug兩個版本

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
    }
}
// release版本中設(shè)置了開啟混淆妓羊,并且定義了混淆文件的位置

release和debug的差異主要在于是否可以在設(shè)備上調(diào)試應(yīng)用以及APK如何簽名。

  • debug 版本會被使用已知的名稱/密碼自動生成的密鑰/證書簽名冯丙。
  • release 版本在構(gòu)建過程中不會被簽名吏恭,需要構(gòu)建后再簽名。
1.2 自定義BuildType

Android plugin允許自定義這兩個示例扬虚,并且可以創(chuàng)建其他的buildType,如下:

buildTypes {
    debug {
        minifyEnabled false
        applicationIdSuffix ".debug"
    }
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix ".custom"
        versionNameSuffix "-customs"
    }
}
  • 上述配置進行了一下設(shè)置

    1. 對默認的debug構(gòu)建類型進行了修改球恤,關(guān)閉了混淆配置辜昵,添加applicationId后綴
    2. 以debug為基礎(chǔ)創(chuàng)建一個叫custom的構(gòu)建類型(相當(dāng)于繼承了debug版本),在custom的構(gòu)建類型中修改applicationId后綴咽斧,并添加了versionName的后綴
  • 創(chuàng)建一個新的BuildType的步驟為:

    1. 在buildTypes容器下添加一個自定義名稱的元素
    2. 調(diào)用initWith或者使用閉包進行配置點擊查看BuildType的可配置屬性
  • 對于每一個BuildType堪置,Android plugin都會創(chuàng)建對應(yīng)的“assembleBuildTypeName”任務(wù)

  • 對于每一個BuildType躬存,都可以在dependencies容器中添加名為BuildTypeNameCompile的依賴配置

  • 對于每一個BuildType,Android plugin都會創(chuàng)建一個對應(yīng)的sourceSet舀锨,默認位置為:src/BuildTypeName
    所以新建BuildType的名字不能是main岭洲、androidTest和test這三個已經(jīng)被用的名字
    BuildType的代碼/資源會以以下方式進行合并

    1. manifest會被合并到app的manifest文件中
    2. res目錄下的資源文件會替換main里的資源文件
    3. java目錄下的文件會被添加到main里的java目錄中,所以不能和main里的類重名(含包名)

2. ProductFlavor

2.1 單維度的ProductFlavor

ProductFlavor定義了通過工程構(gòu)建應(yīng)用的自定義版本坎匿。一個獨立的工程可以定義不同的flavor改變生成的應(yīng)用盾剩。
創(chuàng)建方式:

productFlavors {
    flavor1 {
        minSdkVersion 10
        versionCode 1
    }
    flavor2 {
        minSdkVersion 14
        versionCode 2
    }
}
  • 上述配置進行了以下設(shè)置

    1. 新建了兩個ProductFlavors,名字分別為flavor1和flavor2
    2. 重新設(shè)置了minSdkVersion和versionCode
  • 創(chuàng)建一個新的ProductFlavor的步驟為:

    1. 在productFlavors容器下添加一個自定義名稱的元素
    2. 使用閉包進行配置
2.2 多維度的ProductFlavor

某些情況下替蔬,我們需要從多個維度來區(qū)分app的版本告私,比如渠道和是否付費,只是我們就需要創(chuàng)建多維度的ProductFlavor來生成不同的apk承桥。
創(chuàng)建方式:

flavorDimensions "channle", "version"

productFlavors {
    huawei {
        dimension "channle"
    }

    xiaomi {
        dimension "channle"
    }

    free {
        dimension "version"
    }

    paid {
        dimension "version"
    }
}
  • 上述配置進行了以下設(shè)置

    1. flavorDimensions定義了可能用到的維度和順序
    2. 新建了四個ProductFlavor驻粟,每一個ProductFlavor都指定了一個維度
  • 創(chuàng)建多維度的ProductFlavor的步驟為:

    1. 使用flavorDimensions定義維度和順序
    2. 在productFlavors容器下添加一個自定義名稱的元素
    3. 使用閉包進行配置,必須指定ProductFlavor的維度點擊查看ProductFlavor的可配置項
  • 對于每一個ProductFlavor凶异,Android plugin都會創(chuàng)建對應(yīng)的“assembleProductFlavorNameDebug”和“assembleProductFlavorNameRelease”任務(wù)

  • 對于每一個ProductFlavor蜀撑,都可以在dependencies容器中添加名為ProductFlavorNameCompile的依賴配置

  • 類似BuildType,Android plugin也會為ProductFlavor創(chuàng)建對應(yīng)的sourceSet剩彬,默認的位置為:src/ProductFlavorName
    所以ProductFlavor的名字不能和已存在的BuildType的名字沖突
    ProductFlavor的代碼/資源會以以下方式進行合并

    1. manifest會被合并到app的manifest文件中
    2. res目錄下的資源文件會替換main里的資源文件
    3. java目錄下的文件會被添加到main里的java目錄中酷麦,所以不能和main里的類重名(含包名)

3. BuildVariant

BuildType和ProductFlavor相結(jié)合,組成了構(gòu)建變體襟衰。每創(chuàng)建一個buildType或productFlavor贴铜,都會同時創(chuàng)建相應(yīng)的變體。

3.1 單維度ProductFlavor時產(chǎn)生的BuildVariant

例如:

buildTypes {
    debug {
        minifyEnabled false
        applicationIdSuffix ".debug"
    }
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix ".custom"
        versionNameSuffix "-customs"
    }
}

productFlavors {
    flavor1 {
        minSdkVersion 10
        versionCode 1
    }
    flavor2 {
        minSdkVersion 14
        versionCode 2
    }
}

上述配置的情況下會產(chǎn)生6個BuildVariant:

  • flavor1Debug
  • flavor1Release
  • flavor1Custom
  • flavor2Debug
  • flavor2Release
  • flavor2Custom
3.2 多維度ProductFlavor時產(chǎn)生的BuildVariant

如果是多維度的ProductFlavor瀑晒,例如:

buildTypes {
    debug {
        minifyEnabled false
        applicationIdSuffix ".debug"
    }
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix ".custom"
        versionNameSuffix "-customs"
    }
}

flavorDimensions "channle", "version"

productFlavors {
    huawei {
        dimension "channle"
    }

    xiaomi {
        dimension "channle"
    }

    free {
        dimension "version"
    }

    paid {
        dimension "version"
    }
}

上述配置的情況下會產(chǎn)生12個BuildVariant:

  • huaweiFreeDebug
  • huaweiFreeRelease
  • huaweiFreeCustom
  • huaweiPaidDebug
  • huaweiPaidRelease
  • huaweiPaidCustom
  • xiaomiFreeDebug
  • xiaomiFreeRelease
  • xiaomiFreeCustom
  • xiaomiPaidDebug
  • xiaomiPaidRelease
  • xiaomiPaidCustom
3.3 BuildVariant的使用
  • 對于每一個BuildVariant绍坝,Android plugin都會創(chuàng)建對應(yīng)的“assembleBuildVariantName”任務(wù)

  • BuildVariant的sourceSet合并規(guī)則:

    1. 所有的manifest會被合并到一個manifest文件中
    2. res目錄下的資源文件會遵循優(yōu)先級覆蓋的原則:
      • BuildType會覆蓋ProductFlavor
      • flavorDimensions中定義維度是的順序,決定了ProductFlavor之間資源覆蓋的順序苔悦,順序在在前的優(yōu)先級越高轩褐,高優(yōu)先級會覆蓋低優(yōu)先級的資源
      • ProductFlavor會覆蓋main的資源文件
    3. java目錄下的文件會被添加到main里的java目錄中,如果所選的BuildVariant中BuildType和ProductFlavor對應(yīng)的sourceSet中有同名的類玖详,則會編譯不通過
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末把介,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蟋座,更是在濱河造成了極大的恐慌拗踢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件向臀,死亡現(xiàn)場離奇詭異巢墅,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門君纫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驯遇,“玉大人,你說我怎么就攤上這事蓄髓〔媛” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵会喝,是天一觀的道長陡叠。 經(jīng)常有香客問我,道長好乐,這世上最難降的妖魔是什么匾竿? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蔚万,結(jié)果婚禮上岭妖,老公的妹妹穿的比我還像新娘。我一直安慰自己反璃,他們只是感情好昵慌,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮蜈,像睡著了一般斋攀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梧田,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天淳蔼,我揣著相機與錄音,去河邊找鬼裁眯。 笑死鹉梨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穿稳。 我是一名探鬼主播存皂,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逢艘!你這毒婦竟也來了旦袋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤它改,失蹤者是張志新(化名)和其女友劉穎疤孕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體央拖,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡祭阀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年截亦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬讨。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袍啡,靈堂內(nèi)的尸體忽然破棺而出踩官,到底是詐尸還是另有隱情,我是刑警寧澤境输,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布蔗牡,位于F島的核電站,受9級特大地震影響嗅剖,放射性物質(zhì)發(fā)生泄漏辩越。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一信粮、第九天 我趴在偏房一處隱蔽的房頂上張望黔攒。 院中可真熱鬧,春花似錦强缘、人聲如沸督惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赏胚。三九已至,卻和暖如春商虐,著一層夾襖步出監(jiān)牢的瞬間觉阅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工秘车, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留典勇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓鲫尊,卻偏偏與公主長得像痴柔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疫向,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咳蔚,服務(wù)發(fā)現(xiàn),斷路器搔驼,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/5255b100930e 0. 前言 完全由個人翻...
    王三的貓阿德閱讀 2,504評論 0 4
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項谈火,請點擊這里進行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,122評論 8 72
  • 0404-今日話題-萌 你報過多少網(wǎng)絡(luò)課程?學(xué)習(xí)情況如何舌涨? 1.戰(zhàn)隼老師的知乎live利用時間管理工具提升生活質(zhì)量...
    萌愛佑佑閱讀 151評論 0 0