gradle7 從上手到實(shí)踐之上手體驗(yàn)

1 上手

簡(jiǎn)而言之,gradle 是一個(gè)基于 groovy 編程語(yǔ)言的軟件框架,主要用于源代碼的組織管理和編譯。
概念很抽象,下面我們實(shí)際體驗(yàn)一下 gradle 在 Android 開(kāi)發(fā)中的應(yīng)用消略,在實(shí)際應(yīng)用中理解 gradle。
使用 Android Studio 新建一個(gè) Empty Activity 項(xiàng)目:

新建項(xiàng)目

項(xiàng)目建好后瞎抛,看一下目錄結(jié)構(gòu):

tree -L 2
.
├── app
│   ├── build
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
├── build.gradle
├── gradle
│   └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

項(xiàng)目中的 gradle 腳本有:

  • 根目錄下的 settings.gradle build.gradle
  • app 目錄下的 build.gradl

下面我們逐個(gè)介紹其作用:

settings.gradle

settings.gradle: 對(duì)項(xiàng)目做整體的配置疑俭,核心功能點(diǎn)是配置整個(gè)項(xiàng)目的結(jié)構(gòu)

//配置gradle的遠(yuǎn)程依賴(lài)倉(cāng)庫(kù)
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

//配置項(xiàng)目的遠(yuǎn)程依賴(lài)倉(cāng)庫(kù)
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
//指定項(xiàng)目名稱(chēng)
rootProject.name = "HelloAndroid"
//指定項(xiàng)目包含了哪些子項(xiàng)目
include ':app'

最新的 Gradle 7.x 版本將遠(yuǎn)程庫(kù)的配置統(tǒng)一在了 settings.gradle 中。
這里解釋一下什么是 “gradle 的遠(yuǎn)程依賴(lài)庫(kù)" , 什么是 "項(xiàng)目的遠(yuǎn)程依賴(lài)庫(kù)":

  • gradle 配置腳本身也是一個(gè)軟件項(xiàng)目,他也需要使用一些第三方庫(kù)(主要是一些 gradle 插件)钞艇,這些第三方庫(kù)就在 “gradle 的遠(yuǎn)程依賴(lài)庫(kù)”中查找并下載到本地啄寡。
  • 我們寫(xiě)的 Android App 項(xiàng)目需要使用很多第三方庫(kù),這些庫(kù)就在 “項(xiàng)目的遠(yuǎn)程依賴(lài)倉(cāng)庫(kù)”中查找并下載

遠(yuǎn)程庫(kù)的服務(wù)器一般在境外哩照,下載速度慢挺物,解決方法主要有兩種:

我們可以把 settings 修改為以下內(nèi)容以加快第三庫(kù)的下載速度:

//配置gradle的遠(yuǎn)程依賴(lài)倉(cāng)庫(kù)
pluginManagement {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/public/' }
    }
}

//配置項(xiàng)目的遠(yuǎn)程依賴(lài)倉(cāng)庫(kù)
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/public/' }
    }
}
//指定項(xiàng)目名稱(chēng)
rootProject.name = "HelloAndroid"
//指定項(xiàng)目包含了哪些子項(xiàng)目
include ':app'

容易發(fā)現(xiàn),相比于早起版本飘弧,這里多了一個(gè) repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)识藤。在 gradle 文檔 中介紹了其作用:

FAIL_ON_PROJECT_REPOS :在項(xiàng)目的子 module 中配置倉(cāng)庫(kù)信息會(huì)導(dǎo)致編譯失敗。
PREFER_PROJECT:使用子 module 中配置倉(cāng)庫(kù)信息次伶,忽略根目錄中 settings 配置的倉(cāng)庫(kù)信息
PREFER_SETTINGS:使用根目錄中 settings 配置的倉(cāng)庫(kù)信息痴昧,忽略子 module 中配置倉(cāng)庫(kù)信息

build.gradle

build.gradle:根目錄下得 build.gradle,對(duì)項(xiàng)目整體進(jìn)行配置,與 setting 分工協(xié)作:

//申明可能會(huì)用到的 gralde 插件冠王,這里的插件均從 gradle 的遠(yuǎn)程依賴(lài)倉(cāng)庫(kù)中下載
plugins {
    id 'com.android.application' version '7.1.2' apply false
    id 'com.android.library' version '7.1.2' apply false
}

//自定義 clean Task
task clean(type: Delete) {
    delete rootProject.buildDir
}

app/build.gradle

app/build.gradle:用于配置 app module:

//應(yīng)用 Android Gradle Plugin 插件赶撰,這是一個(gè) Android App 項(xiàng)目
plugins {
    id 'com.android.application'
}

//配置 Android Application 項(xiàng)目,插件提供的配置內(nèi)容
android {
    //sdk 版本
    compileSdk 32

    //android app 項(xiàng)目的配置柱彻,從名字可知道其基本功能
    defaultConfig {
        applicationId "com.zzh.helloandroid"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    //編譯類(lèi)型豪娜,后面詳說(shuō)     
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    //設(shè)置 java 版本
    compileOptions {
        //Language level of the java source code
        sourceCompatibility JavaVersion.VERSION_1_8
        //Version of the generated Java bytecode
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

//配置項(xiàng)目依賴(lài)的第三方庫(kù)
dependencies {
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

至此,我們了解一個(gè)使用 gradle 組織的 Android App 項(xiàng)目的基本結(jié)構(gòu)哟楷。

2 執(zhí)行 gradle 腳本

當(dāng)通過(guò) Android Studio 新建好項(xiàng)目后瘤载,可以使用命令行來(lái)執(zhí)行 gradle 腳本以完成編譯運(yùn)行打包等任務(wù):

# 這里使用 gradlew, gradlew 是一個(gè)bash可執(zhí)行文件,
# 它對(duì) gradle 進(jìn)行了包裝以保證執(zhí)行時(shí)使用正確的gradle版本
./gradlew build  #編譯整個(gè)項(xiàng)目
./gradlew assembleDebug #生成 debug 的apk
./gradlew installDebug  #安裝 debug 的程序到手機(jī)

這里執(zhí)行的都是 gradle 的 task卖擅,我們通過(guò) ./gradlew tasks 命令查看所有的 task鸣奔。
這里我們會(huì)基本的命令行使用即可,具體的概念(task惩阶,gradlew等)會(huì)在后續(xù)文章中講解挎狸。

3 基本概念理解

以 .gradle 結(jié)尾的文件,稱(chēng)之為 gradle 腳本琳猫。gradle 腳本由零個(gè)或多個(gè)聲明(statements)和腳本塊(script blocks)組成。聲明(statements)包含了方法調(diào)用私痹,屬性賦值脐嫂,本地變量定義。腳本塊(script blocks)是一個(gè)以閉包(closure)為參數(shù)的方法調(diào)用紊遵,這些方法通常用于配置委托對(duì)象(delegate object)账千。比如 settings.gradle 中:

//腳本塊
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

//腳本塊
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
//聲明
rootProject.name = "HelloAndroid"
//聲明
include ':app'

當(dāng)執(zhí)行 gradle 腳本時(shí),gradle 會(huì)為每個(gè)腳本生成一個(gè)對(duì)象并通過(guò)腳本的內(nèi)容來(lái)配置這個(gè)對(duì)象暗膜。這個(gè)對(duì)象稱(chēng)之為腳本的委托對(duì)象(delegate object)匀奏。settings.gradle 對(duì)應(yīng) Settings 對(duì)象,build.gradle 對(duì)應(yīng) Project 對(duì)象学搜。

要理解這些對(duì)象娃善,理解聲明和腳本塊论衍,需要我們了解 groovy 的基本語(yǔ)法。接下來(lái)的內(nèi)容聚磺,我們就來(lái)看看 groovy 這門(mén)語(yǔ)言坯台。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘫寝,隨后出現(xiàn)的幾起案子蜒蕾,更是在濱河造成了極大的恐慌,老刑警劉巖焕阿,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咪啡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡暮屡,警方通過(guò)查閱死者的電腦和手機(jī)撤摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栽惶,“玉大人愁溜,你說(shuō)我怎么就攤上這事⊥獬В” “怎么了冕象?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)汁蝶。 經(jīng)常有香客問(wèn)我渐扮,道長(zhǎng),這世上最難降的妖魔是什么掖棉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任墓律,我火速辦了婚禮,結(jié)果婚禮上幔亥,老公的妹妹穿的比我還像新娘耻讽。我一直安慰自己,他們只是感情好帕棉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布针肥。 她就那樣靜靜地躺著,像睡著了一般香伴。 火紅的嫁衣襯著肌膚如雪慰枕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天即纲,我揣著相機(jī)與錄音具帮,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜂厅,可吹牛的內(nèi)容都是我干的匪凡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葛峻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锹雏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起术奖,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤礁遵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后采记,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體佣耐,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年唧龄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兼砖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡既棺,死狀恐怖讽挟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丸冕,我是刑警寧澤耽梅,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站胖烛,受9級(jí)特大地震影響眼姐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佩番,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一众旗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趟畏,春花似錦贡歧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至沃琅,卻和暖如春哗咆,著一層夾襖步出監(jiān)牢的瞬間蜘欲,已是汗流浹背益眉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郭脂。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓年碘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親展鸡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屿衅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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