Android使用Gradle配置構(gòu)建變體

轉(zhuǎn)載:https://blog.csdn.net/ming54ming/article/details/78766182

每個(gè)構(gòu)建變體都代表您可以為應(yīng)用構(gòu)建的一個(gè)不同版本甥郑。例如俩滥,您可能希望構(gòu)建應(yīng)用的免費(fèi)版本(只提供有限的內(nèi)容)和付費(fèi)版本(提供更多內(nèi)容)迹淌。您還可以針對(duì)不同的設(shè)備屡江、根據(jù) API 級(jí)別或其他設(shè)備變體構(gòu)建應(yīng)用的不同版本沟优。然而巢钓,如果您希望根據(jù)設(shè)備 ABI 或屏幕密度構(gòu)建不同的版本病苗,則請(qǐng)改用 [APK 拆分]

gradle.png

主要是在android {} 代碼塊內(nèi)部創(chuàng)建和配置構(gòu)建類型,其中defaultConfig是一些基本配置症汹,buildTypes就是構(gòu)建類型硫朦,其中默認(rèn)情況下已經(jīng)有了一個(gè)release版本,就是所謂的發(fā)布版本背镇,release{}代碼塊里面就是屬于release版本的一些配置咬展,其實(shí)默認(rèn)情況下應(yīng)該還有一個(gè)debug版本,就是平常的調(diào)試版本瞒斩,只是這里沒有顯示出來(lái)破婆。

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

buildtype.png

這里我們來(lái)看一下buildTypes的基本構(gòu)建,
applicationIdSuffix: 是在當(dāng)前applicationId的基礎(chǔ)上拼接剩下的字段形成一個(gè)新的applicationId胸囱,因?yàn)橥粋€(gè)applicationId是無(wú)法同時(shí)運(yùn)行在同一個(gè)手機(jī)上的祷舀,這里也可以直接使用applicationId屬性來(lái)命名新的一個(gè)包名。
initWith:復(fù)制其他buildTypes的內(nèi)容烹笔,這里的jnidebug變體就復(fù)制了debug變體的內(nèi)容裳扯。一般寫法是可以命名一個(gè)默認(rèn)的變體,將一些公共的變量在里面賦值從而給其他變體使用谤职。

配置產(chǎn)品風(fēng)味ProductFlavor

創(chuàng)建產(chǎn)品風(fēng)味與創(chuàng)建構(gòu)建類型類似:只需將它們添加到 productFlavors {} 代碼塊并配置您想要的設(shè)置饰豺。產(chǎn)品風(fēng)味支持與 defaultConfig 相同的屬性,這是因?yàn)?defaultConfig 實(shí)際上屬于 ProductFlavor 類允蜈。這意味著冤吨,您可以在 defaultConfig {} 代碼塊中提供所有風(fēng)味的基本配置,每種風(fēng)味均可更改任何這些默認(rèn)值陷寝,例如 applicationId锅很。


ProductFlavor .png

這里可以看到使用和buildTypes類似,具體需要哪些屬性可以查看官網(wǎng)地址凤跑。這里有個(gè)地方應(yīng)該注意的是爆安,編譯類型其實(shí)是buildTyps和productFlavor的組合,這里有三種buildTypes和兩種productFlavor所以最終有6種編譯類型仔引。

在創(chuàng)建和配置您的產(chǎn)品風(fēng)味之后扔仓,在通知欄中點(diǎn)擊 Sync Now褐奥。在同步完成后,Gradle 會(huì)根據(jù)您的構(gòu)建類型和產(chǎn)品風(fēng)味自動(dòng)創(chuàng)建構(gòu)建變體翘簇,并按照 <product-flavor><Build-Type> 的格式命名這些變體撬码。例如,如果您創(chuàng)建了“演示”和“完整”這兩種產(chǎn)品風(fēng)味并保留默認(rèn)的“調(diào)試”和“發(fā)布”構(gòu)建類型版保,Gradle 將創(chuàng)建以下構(gòu)建變體:

  • 演示調(diào)試
  • 演示發(fā)布
  • 完整調(diào)試
  • 完整發(fā)布

您可以將構(gòu)建變體更改為您要構(gòu)建并運(yùn)行的任何變體呜笑,只需轉(zhuǎn)到 Build > Select Build Variant,然后從下拉菜單中選擇一個(gè)變體彻犁。然而叫胁,要開始自定義每個(gè)構(gòu)建變體及其功能和資源,您需要了解如何創(chuàng)建和管理源集汞幢。

組合多個(gè)商品風(fēng)味

某些情況下驼鹅,您可能希望組合多個(gè)產(chǎn)品風(fēng)味中的配置。例如森篷,您可能希望基于 API 級(jí)別為“完整”和“演示”產(chǎn)品風(fēng)味創(chuàng)建不同的配置输钩。
為此,您可以通過(guò)適用于 Gradle 的 Android 插件創(chuàng)建產(chǎn)品風(fēng)味組仲智,稱為風(fēng)味維度买乃。
構(gòu)建您的應(yīng)用時(shí),Gradle 會(huì)將您定義的每個(gè)風(fēng)味維度中的產(chǎn)品風(fēng)味配置與構(gòu)建類型配置組合來(lái)創(chuàng)建最終構(gòu)建變體坎藐。Gradle 不會(huì)組合屬于相同風(fēng)味維度的產(chǎn)品風(fēng)味为牍。


3.png

flavorDimensions屬性:創(chuàng)建一個(gè)“模式”風(fēng)味維度以組織“完整”和“演示”產(chǎn)品風(fēng)味,以及一個(gè)“api”風(fēng)味維度以基于API級(jí)別組織產(chǎn)品風(fēng)味配置

風(fēng)味維度 demo full
minApi24 [minApi24][Demo] [minApi24][Full]
minApi23 [minApi23][Demo] [minApi23][Full]
minApi21 [minApi21][Demo] [minApi21][Full]

在 Gradle 為每個(gè)構(gòu)建變體或?qū)?yīng) APK 命名時(shí)岩馍,屬于較高優(yōu)先級(jí)風(fēng)味維度的產(chǎn)品風(fēng)味首先顯示碉咆,之后是較低優(yōu)先級(jí)維度的產(chǎn)品風(fēng)味,再之后是構(gòu)建類型蛀恩。以上面的構(gòu)建配置為例疫铜,Gradle 可以使用以下命名方案創(chuàng)建總共 12 個(gè)構(gòu)建變體:

構(gòu)建變體:[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]

對(duì)應(yīng) APK:app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk

例如,
構(gòu)建變體:minApi24DemoDebug
對(duì)應(yīng) APK:app-minApi24-demo-debug.apk

過(guò)濾變體

您可以在模塊級(jí) build.gradle 文件中創(chuàng)建一個(gè)變體過(guò)濾器双谆,以移除某些構(gòu)建變體配置壳咕。
假設(shè)您計(jì)劃為演示版本的應(yīng)用僅支持 API 級(jí)別 23 和更高級(jí)別。您可以使用代碼塊過(guò)濾出組合了“minApi21”和“演示”產(chǎn)品風(fēng)味的所有構(gòu)建變體配置:

android {
  ...
  buildTypes {...}

  flavorDimensions "api", "mode"
  productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
  }

  variantFilter { variant ->
      def names = variant.flavors*.name
      // To check for a certain build type, use variant.buildType.name == "<buildType>"
      if (names.contains("minApi21") && names.contains("demo")) {
          // Gradle ignores any variants that satisfy the conditions above.
          setIgnore(true)
      }
  }
}
...

創(chuàng)建源集

默認(rèn)情況下顽馋,Android Studio 會(huì)創(chuàng)建 main/ 源集和目錄谓厘,用于存儲(chǔ)在所有構(gòu)建變體之間共享的一切資源。然而寸谜,當(dāng)然也可以創(chuàng)建新的源集來(lái)控制 Gradle 要為特定的構(gòu)建類型竟稳、產(chǎn)品風(fēng)味(以及使用風(fēng)味維度時(shí)的產(chǎn)品風(fēng)味組合)和構(gòu)建變體編譯和打包的確切文件。
例如,可以在 main/ 源集中定義基本的功能他爸,使用產(chǎn)品風(fēng)味源集針對(duì)不同的客戶更改應(yīng)用的品牌聂宾,或者僅針對(duì)使用調(diào)試構(gòu)建類型的構(gòu)建變體包含特殊的權(quán)限和日志記錄功能。

使用步驟如下:
(1)打開 Project 窗格并從窗格頂端的下拉菜單中選擇 Project 視圖诊笤。
(2)導(dǎo)航至 /app/src/系谐。
(3)右鍵點(diǎn)擊 src 目錄并選擇 New > Folder > Java Folder。
(4)從 Target Source Set 旁邊的下拉菜單中讨跟,選擇編譯的版本纪他。
(5)點(diǎn)擊 Finish。

同樣可以用來(lái)創(chuàng)建XML 值文件:
(1)在相同的 Project 窗格中晾匠,右鍵點(diǎn)擊 src 目錄并選擇 New > XML > Values XML File止喷。
(2)為 XML 文件輸入名稱或保留默認(rèn)名稱。
(3)從 Target Source Set 旁邊的下拉菜單中混聊,選擇 編譯的版本。
(4)點(diǎn)擊 Finish乾巧。


4.png
5.png
6.png

更改源集配置

如果您的源未組織到 Gradle 期望的默認(rèn)源集文件結(jié)構(gòu)中句喜,可以
使用 sourceSet{} 代碼塊更改 Gradle 希望為源集的每個(gè)組件收集文件的位置。
下面的代碼示例可以將 app/other/ 目錄中的源映射到 main 源集的某些組件沟于,并更改 androidTest 源集的根目錄咳胃。

android {
  ...
  sourceSets {
    // Encapsulates configurations for the main source set.
    main {
      // Changes the directory for Java sources. The default directory is
      // 'src/main/java'.
      java.srcDirs = ['other/java']

      // If you list multiple directories, Gradle uses all of them to collect
      // sources. Because Gradle gives these directories equal priority, if
      // you define the same resource in more than one directory, you get an
      // error when merging resources. The default directory is 'src/main/res'.
      res.srcDirs = ['other/res1', 'other/res2']

      // Note: You should avoid specifying a directory which is a parent to one
      // or more other directories you specify. For example, avoid the following:
      // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']
      // You should specify either only the root 'other/res1' directory, or only the
      // nested 'other/res1/layouts' and 'other/res1/strings' directories.

      // For each source set, you can specify only one Android manifest.
      // By default, Android Studio creates a manifest for your main source
      // set in the src/main/ directory.
      manifest.srcFile 'other/AndroidManifest.xml'
      ...
    }

    // Create additional blocks to configure other source sets.
    androidTest {

      // If all the files for a source set are located under a single root
      // directory, you can specify that directory using the setRoot property.
      // When gathering sources for the source set, Gradle looks only in locations
      // relative to the root directory you specify. For example, after applying the
      // configuration below for the androidTest source set, Gradle looks for Java
      // sources only in the src/tests/java/ directory.
      setRoot 'src/tests'
      ...
    }
  }
}
...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旷太,隨后出現(xiàn)的幾起案子展懈,更是在濱河造成了極大的恐慌,老刑警劉巖供璧,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存崖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡睡毒,警方通過(guò)查閱死者的電腦和手機(jī)来惧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)演顾,“玉大人供搀,你說(shuō)我怎么就攤上這事∧浦粒” “怎么了葛虐?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棉钧。 經(jīng)常有香客問(wèn)我屿脐,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任摄悯,我火速辦了婚禮赞季,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奢驯。我一直安慰自己申钩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布瘪阁。 她就那樣靜靜地躺著撒遣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪管跺。 梳的紋絲不亂的頭發(fā)上义黎,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音豁跑,去河邊找鬼廉涕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛艇拍,可吹牛的內(nèi)容都是我干的狐蜕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卸夕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼层释!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起快集,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贡羔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后个初,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乖寒,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年勃黍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宵统。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡覆获,死狀恐怖马澈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄息,我是刑警寧澤痊班,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站摹量,受9級(jí)特大地震影響涤伐,放射性物質(zhì)發(fā)生泄漏馒胆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一凝果、第九天 我趴在偏房一處隱蔽的房頂上張望祝迂。 院中可真熱鬧,春花似錦器净、人聲如沸型雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纠俭。三九已至,卻和暖如春浪慌,著一層夾襖步出監(jiān)牢的瞬間冤荆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工权纤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钓简,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓汹想,卻偏偏與公主長(zhǎng)得像涌庭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欧宜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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