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)目建好后瞎抛,看一下目錄結(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ù)器一般在境外哩照,下載速度慢挺物,解決方法主要有兩種:
- 使用阿里云鏡像
- 使用 maven 私服
我們可以把 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ǔ)言坯台。