Gradle 作為Android studio指定的自動(dòng)化管理構(gòu)建程序的工具,每個(gè)Android 程序員都應(yīng)該對其有最基本的了解,但是平時(shí)Android studio 已經(jīng)幫我們完成了大多數(shù)Gradle的配置,所以大多數(shù)人對Gradle理解的并不多,接下來就讓我們進(jìn)入Gradle的世界。
構(gòu)建流程(摘自https://developer.android.com/studio/build/)

如圖 所示,典型 Android 應(yīng)用模塊的構(gòu)建流程通常依循下列步驟:
- 編譯器將您的源代碼轉(zhuǎn)換成 DEX(Dalvik Executable) 文件(其中包括運(yùn)行在 Android 設(shè)備上的字節(jié)碼),將所有其他內(nèi)容轉(zhuǎn)換成已編譯資源。
- APK 打包器將 DEX 文件和已編譯資源合并成單個(gè) APK。不過,必須先簽署 APK,才能將應(yīng)用安裝并部署到 Android 設(shè)備上。
- APK 打包器使用調(diào)試或發(fā)布密鑰庫簽署您的 APK:
- 如果您構(gòu)建的是調(diào)試版本的應(yīng)用(即專用于測試和分析的應(yīng)用),打包器會(huì)使用調(diào)試密鑰庫簽署您的應(yīng)用。Android Studio 自動(dòng)使用調(diào)試密鑰庫配置新項(xiàng)目。
- 如果您構(gòu)建的是打算向外發(fā)布的發(fā)布版本應(yīng)用,打包器會(huì)使用發(fā)布密鑰庫簽署您的應(yīng)用。要?jiǎng)?chuàng)建發(fā)布密鑰庫,請閱讀在 Android Studio 中簽署您的應(yīng)用。
- 在生成最終 APK 之前,打包器會(huì)使用 zipalign 工具對應(yīng)用進(jìn)行優(yōu)化,減少其在設(shè)備上運(yùn)行時(shí)的內(nèi)存占用。
構(gòu)建流程結(jié)束時(shí),您將獲得可用來進(jìn)行部署、測試的調(diào)試 APK,或者可用來發(fā)布給外部用戶的發(fā)布 APK。
目錄結(jié)構(gòu)

Android項(xiàng)目中最重要的就是 build.gradle, setting.gradle
setting.gradle
setting.gradle 是Gradle 的設(shè)置文件,位于項(xiàng)目的根目錄,用于指示 Gradle 在構(gòu)建應(yīng)用時(shí)應(yīng)將哪些模塊包括在內(nèi)。對大多數(shù)項(xiàng)目而言,該文件很簡單,只包括以下內(nèi)容:
include ':app'
如果有多個(gè)module項(xiàng)目的話
include ':app', ':app2'
頂級(jí)根目錄build.gradle
頂級(jí) build.gradle 文件位于項(xiàng)目根目錄,用于定義適用于項(xiàng)目中所有模塊的構(gòu)建配置。默認(rèn)情況下,這個(gè)頂級(jí)構(gòu)建文件使用 buildscript {} 代碼塊來定義項(xiàng)目中所有模塊共用的 Gradle 存儲(chǔ)區(qū)和依賴項(xiàng)。
/**
buildscript{}是基礎(chǔ)配置,構(gòu)建開始的時(shí)候,所有子模塊都會(huì)讀取這個(gè)里面的內(nèi)容
*/
buildscript {
repositories { // 告訴Gradle 下載第三方庫的地址
jcenter() // 代表 https://bintray.com/bintray/jcenter
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
//配置所有模塊的共同使用內(nèi)容
allprojects {
repositories {
jcenter() //讓所有子模塊都從jcenter 獲取第三方包
}
}
Gradle 插件和Gradle版本的關(guān)系

如上圖所示我們設(shè)置的是Gradle插件的版本號(hào),并不是Gradle的版本,最后的序號(hào)就是插件的版本號(hào),注意插件不是gradle,插件是根據(jù)gradle特性編寫為完成需求的jar包,插件依賴于gradle,下圖是插件和Gradle版本對應(yīng)的關(guān)系,也就是說,如果我們用3.1.0的插件,就必須使用Gradle4.4以上的版本。

https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin
在該文件里可以查看Gradle的版本信息

模塊級(jí) build.gradle
build.gradle 文件位于每個(gè) <project>/<module>/ 目錄,用于配置適用于其所在模塊的構(gòu)建設(shè)置。您可以通過配置這些構(gòu)建設(shè)置來提供自定義打包選項(xiàng)(例如附加構(gòu)建類型和產(chǎn)品風(fēng)味),以及替換 main/ 應(yīng)用清單或頂級(jí) build.gradle 文件中的設(shè)置。
以下這個(gè)示例 Android 應(yīng)用模塊 build.gradle 文件概述了您應(yīng)該了解的部分基本 DSL 元素和設(shè)置。google提供的dsl查詢手冊
/**
告訴Gradle這個(gè)module的構(gòu)建類型,application 或者library
*/
apply plugin: 'com.android.application'
/**
Android 構(gòu)建的參數(shù)
*/
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
applicationId 'com.example.myapp'
// Defines the minimum API level required to run the app.
minSdkVersion 15
// Specifies the API level used to test the app.
targetSdkVersion 28
// Defies the version number of your app.
versionCode 1
// Defines a user-friendly version name for your app.
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
splits {
// Screen density split settings
density {
// Enable or disable the density split mechanism
enable false
// Exclude these densities from splits
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
/**
* The dependencies {} block in the module-level build configuration file
* only specifies dependencies required to build the module itself.
*/
dependencies {
compile project(":lib")
compile 'com.android.support:appcompat-v7:28.0.0'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Gradle 還包括兩個(gè)屬性文件,位于項(xiàng)目根目錄,可用于指定適用于 Gradle 構(gòu)建工具包本身的設(shè)置:
gradle.properties
您可以在其中配置項(xiàng)目范圍 Gradle 設(shè)置,例如 Gradle 后臺(tái)進(jìn)程的最大堆大小。如需了解詳細(xì)信息,請參閱構(gòu)建環(huán)境
local.properties
為構(gòu)建系統(tǒng)配置本地環(huán)境屬性,例如 SDK 安裝路徑。由于該文件的內(nèi)容由 Android Studio 自動(dòng)生成并且專用于本地開發(fā)者環(huán)境,因此您不應(yīng)手動(dòng)修改該文件,或?qū)⑵浼{入您的版本控制系統(tǒng)。
Gradle 在執(zhí)行的時(shí)候大概進(jìn)行了如下幾步操作:
1 初始化構(gòu)建
2 配置構(gòu)建
3 執(zhí)行構(gòu)建
4 完成構(gòu)建或者失敗
在項(xiàng)目初始化構(gòu)建的時(shí)候,去讀取項(xiàng)目的setting.gradle,判斷需要構(gòu)建的項(xiàng)目,并在初始化的時(shí)候生成一個(gè)Gradle對象,我們可以在官網(wǎng)查到這個(gè)對象的的api和屬性。
初始化完成后,Gradle讀取到需要構(gòu)建的各個(gè)項(xiàng)目,便開始配置構(gòu)建工作,去讀取每個(gè)項(xiàng)目的build.gradle,并生成一個(gè)project對象,這個(gè)project對象對應(yīng)這個(gè)這個(gè)build.gradle。project的文檔,我們可以在build.gradle 文件里調(diào)用project對象。

每個(gè)項(xiàng)目也就是build.gradle里都有一個(gè)個(gè)task,執(zhí)行構(gòu)建的工作就是執(zhí)行這些task,在執(zhí)行這些task的過程,Gradle會(huì)把這個(gè)task任務(wù)的依賴任務(wù)也一個(gè)個(gè)執(zhí)行。我們可以在Android studio的Gradle 視圖里看到這些task

Android studio的安裝應(yīng)用按鈕,clean其實(shí)都是在幫我們執(zhí)行這些相應(yīng)的task 命令。