Gradle 與 AGP 構(gòu)建 API: 配置您的構(gòu)建文件

image

歡迎閱讀全新的 MAD Skills 系列GradleAndroid Gradle plugin API 的第一篇文章。我們將在本文中了解 Android 構(gòu)建系統(tǒng)的工作方式以及 Gradle 的基礎(chǔ)知識(shí)。

我們將會(huì)從 Gradle 的構(gòu)建階段開始另锋,討論如何使用 AGP (Android Gradle Plugin) 的配置選項(xiàng)自定義您的構(gòu)建极祸,并討論如何使您的構(gòu)建保持高效观谦。如果您更喜歡通過視頻了解此內(nèi)容顷窒,請(qǐng)?jiān)?此處 查看谢床。

通過了解構(gòu)建階段的工作原理及配置 Android Gradle plugin 的配置方法性含,可以幫您基于項(xiàng)目的需求自定義構(gòu)建洲赵。讓我們回到 Android Studio,一起看看構(gòu)建系統(tǒng)是如何工作的吧。

Gradle 簡介

Gradle 是一個(gè)通用的自動(dòng)化構(gòu)建工具叠萍。當(dāng)然芝发,您可以使用 Gradle 來構(gòu)建 Android 項(xiàng)目,但實(shí)際上您可以使用 Gradle 來構(gòu)建任何類型的軟件苛谷。

Gradle 支持單一或多項(xiàng)目構(gòu)建辅鲸。如果要將項(xiàng)目配置為使用 Gradle,您需要在項(xiàng)目文件夾中添加 build.gradle 文件腹殿。

在多項(xiàng)目層級(jí)結(jié)構(gòu)中独悴,根項(xiàng)目中會(huì)包含一個(gè) settings.gradle 文件,其中列出了構(gòu)建中包含的其他項(xiàng)目锣尉。Android 使用多項(xiàng)目構(gòu)建來幫您模塊化應(yīng)用刻炒。

△ Android 項(xiàng)目結(jié)構(gòu)與 build.gradle 及 settings.gradle 文件

由于插件的存在,Gradle 可以處理不同類型的項(xiàng)目自沧,比如 Android 或 Java坟奥。這些插件會(huì)包含預(yù)定義的功能,用于配置和構(gòu)建特定類型的項(xiàng)目暂幼。

例如筏勒,為了構(gòu)建 Android 項(xiàng)目,您需要使用 Android Gradle 插件配置您的 Gradle 構(gòu)建文件旺嬉。無論當(dāng)前的 Android 項(xiàng)目是應(yīng)用還是依賴庫管行,Android Gradle 插件都知道如何對(duì)其進(jìn)行構(gòu)建和打包。

Task (任務(wù))

Gradle 的構(gòu)建流程圍繞名為 Task (任務(wù)) 的工作單元展開邪媳。您可以通過終端查看 Task 列表捐顷,或通過啟用 Android Studio Gradle 面板中的 Task 列表來查看任務(wù)。

△ Gradle Task 列表

這些 Task 可以接收輸入雨效、執(zhí)行某些操作迅涮,并根據(jù)執(zhí)行的操作產(chǎn)生輸出。

Android Gradle Plugin 定義了自己的 Task徽龟,并且知道構(gòu)建 Android 項(xiàng)目時(shí)叮姑,需要以何種順序執(zhí)行這些 Task。

Gradle 構(gòu)建文件由許多不同的部分組成据悔。Gradle 的配置語法被稱為 Gradle DSL传透,其為開發(fā)者定義了配置插件的方式。Gradle 會(huì)解析 build.gradle 文件中的 android DSL 塊并創(chuàng)建 AGP DSL 對(duì)象极颓,例如 ApplicationExtensionBuildType朱盐。

典型的 Android 項(xiàng)目會(huì)包含一個(gè)頂層 Gradle 構(gòu)建文件。Android 項(xiàng)目中的每個(gè)模塊又分別有一個(gè) Gradle 構(gòu)建文件菠隆。在示例項(xiàng)目中兵琳,我僅有一個(gè)應(yīng)用模塊狂秘。

在模塊層的 build.gradle 文件中,我需要聲明和應(yīng)用構(gòu)建項(xiàng)目所需的插件躯肌。為了讓 Gradle 知道我正在構(gòu)建 Android 項(xiàng)目者春,我需要應(yīng)用 com.android.applicationcom.android.library 插件。這兩個(gè)插件分別定義了如何配置和構(gòu)建 Android 應(yīng)用和依賴庫羡榴。在本例中碧查,我要構(gòu)建的是 Android 應(yīng)用項(xiàng)目,所以我需要應(yīng)用 com.android.application 插件校仑。由于我需要使用 Kotlin,所以在示例中也應(yīng)用了 kotlin.android 插件传惠。

plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
}

Android Gradle Plugin 提供了它自己的 DSL迄沫,您可以用它配置 AGP,并使該配置在構(gòu)建時(shí)應(yīng)用于 Task卦方。

想要配置 Android Gradle Plugin羊瘩,您需要使用 android 塊。在該代碼塊中盼砍,您可以為不同的構(gòu)建類型 (如 debug 或 release) 定義 SDK 版本尘吗、工具版本、應(yīng)用詳情及其它一些配置浇坐。如需了解更多有關(guān) gradle 如何使用這些信息來創(chuàng)建變體睬捶,以及您可以使用哪些其他選項(xiàng),請(qǐng)參閱 構(gòu)建文檔:

android {
    compileSdk 31

    defaultConfig {
        applicationId "com.example.myapp"
        minSdk 21
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

在下一部分中近刘,您可以定義依賴擒贸。Gradle 的依賴管理支持兼容 MavenIvy 的倉庫,以及來自文件系統(tǒng)的本地二進(jìn)制文件觉渴。

dependencies {
 
   implementation 'androidx.core:core-ktx:1.7.0'
   implementation 'com.google.android.material:material:1.4.0'
   implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
   testImplementation 'junit:junit:4.13.2'
   androidTestImplementation 'androidx.test.ext:junit:1.1.3'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
 
}

構(gòu)建階段

Gradle 分三個(gè)階段評(píng)估和運(yùn)行構(gòu)建介劫,分別是 Initialization (初始化)、Configuration (配置) 和 Execution (執(zhí)行)案淋,更多請(qǐng)參閱 Gradle 文檔座韵。

在 Initialization (初始化) 階段,Gradle 會(huì)決定構(gòu)建中包含哪些項(xiàng)目踢京,并會(huì)為每個(gè)項(xiàng)目創(chuàng)建 Project實(shí)例誉碴。為了決定構(gòu)建中會(huì)包含哪些項(xiàng)目,Gradle 首先會(huì)尋找 settings.gradle 來決定此次為單項(xiàng)目構(gòu)建還是多項(xiàng)目構(gòu)建漱挚。

在 Configuration (配置) 階段翔烁,Gradle 會(huì)評(píng)估構(gòu)建項(xiàng)目中包含的所有構(gòu)建腳本,隨后應(yīng)用插件旨涝、使用 DSL 配置構(gòu)建蹬屹,并在最后注冊(cè) Task侣背,同時(shí)惰性注冊(cè)它們的輸入。

需要注意的是慨默,無論您請(qǐng)求執(zhí)行哪個(gè) Task贩耐,配置階段都會(huì)執(zhí)行。為了保持您的構(gòu)建簡潔高效厦取,請(qǐng)避免在配置階段執(zhí)行任何耗時(shí)操作潮太。

最后,在 Execution (執(zhí)行) 階段虾攻,Gradle 會(huì)執(zhí)行構(gòu)建所需的 Task 集合铡买。

下篇文章中,在編寫我們自己的插件時(shí)霎箍,我們將深入剖析這些階段奇钞。

Gradle DSL 支持使用 Groovy 與 Kotlin 腳本編寫構(gòu)建文件。到目前為止漂坏,我都在使用 Groovy DSL 腳本來配置此工程的構(gòu)建景埃。您可以在下面看到分別由 Kotlin 和 Groovy 編寫的相同構(gòu)建文件。注意 Kotlin 腳本文件名后綴為 ".kts"顶别。

△ Kotlin 與 Groovy 腳本對(duì)比

從 Groovy 遷移到 Kotlin 或其他配置腳本的方法谷徙,不會(huì)改變您執(zhí)行 Task 的方式。

總結(jié)

以上便是本文的全部內(nèi)容驯绎。Gradle 與 Android Gradle Plugin 有許多可以讓您自定義構(gòu)建的功能完慧。在本文中,您已經(jīng)了解了 Gradle Task条篷、構(gòu)建階段骗随、配置 AGP 以及使用 DSL 配置構(gòu)建的基礎(chǔ)知識(shí)。

敬請(qǐng)關(guān)注下一篇文章赴叹,我們將帶您了解如何在編寫您自己的插件時(shí)鸿染,使用 AGP 的 Variant API 來擴(kuò)展您的構(gòu)建。

歡迎您 點(diǎn)擊這里 向我們提交反饋乞巧,或分享您喜歡的內(nèi)容涨椒、發(fā)現(xiàn)的問題。您的反饋對(duì)我們非常重要绽媒,感謝您的支持蚕冬!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鼎姊,一起剝皮案震驚了整個(gè)濱河市陵霉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穆役,老刑警劉巖获三,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旁蔼,死亡現(xiàn)場離奇詭異锨苏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棺聊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門伞租,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人限佩,你說我怎么就攤上這事葵诈。” “怎么了祟同?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵作喘,是天一觀的道長。 經(jīng)常有香客問我耐亏,道長徊都,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任广辰,我火速辦了婚禮,結(jié)果婚禮上主之,老公的妹妹穿的比我還像新娘择吊。我一直安慰自己,他們只是感情好槽奕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布几睛。 她就那樣靜靜地躺著,像睡著了一般粤攒。 火紅的嫁衣襯著肌膚如雪所森。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天夯接,我揣著相機(jī)與錄音焕济,去河邊找鬼。 笑死盔几,一個(gè)胖子當(dāng)著我的面吹牛晴弃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逊拍,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼上鞠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芯丧?” 一聲冷哼從身側(cè)響起芍阎,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缨恒,沒想到半個(gè)月后谴咸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轮听,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年寿冕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蕊程。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驼唱,死狀恐怖藻茂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玫恳,我是刑警寧澤辨赐,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站京办,受9級(jí)特大地震影響掀序,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惭婿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一不恭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧财饥,春花似錦换吧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谦炒,卻和暖如春贯莺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宁改。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工缕探, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人透且。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓撕蔼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秽誊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲸沮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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