Gradle 之 Android 中的应用
在上一篇文章中 Gradle 之語言基礎 Groovy 主要介紹了 Groovy 的基礎語法(如果沒有 Groovy 的基礎,建議先看看上篇文章,如果可以動手敲一下里面的示例代碼就更好不過了),也是為本篇文章打基礎的。
本篇文章主要介紹 Gradle 在 Android 中的應用(Android DSL 和 Gradle DSL),也是通過一些示例來介紹和理解,主要分為以下一些內容,示例代碼都在 GradleForAndroid
原文在此:Gradle 之 Android 中的應用
一. Gradle 構建生命周期
一個 Gradle 的構建通常有如下三個階段
- 初始化:項目 Project 實例會在該階段被創建。如果一個項目中包含有多個模塊,并且每一個模塊都有其對應的 build.gradle 文件,就會為每一個模塊都創建一個對應的 Project 實例
- 配置:執行各個模塊下的 build.gradle 腳本,為 Project實例創建和配置 Task,構造 Task 任務依賴關系圖以便在執行階段按照依賴關系執行 Task
- 執行:在這個階段將會決定執行哪個 Task,哪個 Task 被執行取決于開始該次構建的參數配置和該 Gradle 文件的當前目錄
在創建完成一個新的 Android 應用項目之后,一般情況下, .gradle 文件的目錄結構如下所示:
GradleForAndroid|---- build.gradle|---- setting.gradle\---- app\---- build.gradle 復制代碼其中,兩個文件 build.gradle 和 setting.gradle 位于項目的根目錄下,還有一個 build.gradle 位于 \app\ 目錄下。\build.gradle 是頂層構建文件,\app\build.gradle 是模塊構建文件。 我們以上面這個新創建的項目來學習 Gradle 的構建生命周期
1.1 初始化
在初始化階段,會創建一個 Setting 對象,對應著 setting.gradle 文件, Setting 對象的一個主要作用就是聲明哪些模塊將會參與到構建中去,Setting 文檔(Gradle API 5.0)
在新建的項目中,setting.gradle 文件一般會默認包含一行內容,如下所示
include ':app' 復制代碼上面這一行,其實是一行 groovy 代碼的簡寫,對應的是 Setting#include(String[] projectPaths) 方法,表示 :app 模塊將會參與到構建中去。 如果我們創建一個 library 庫,setting.gradle 將會變為如下所示,表示 :app 和 :library 兩個模塊將會參與到構建中
include ':app', ':library' 復制代碼setting.gradle 腳本文件可以中讀取一些只可讀的配置信息,這些配置信息的來源可以有如下三個:
- 可以在本工程的 gradle.properties 文件中定義配置信息
- 也可以在系統的 gradle.properties 文件中定義配置信息,系統的 gradle.properties 位于 user's .gradle 目錄下
- 還可以通過 -P 命令參數指定配置信息,比如 ./gradlew clean -P cmd='Hello from commandLine' 便在執行 clean task 的時候,指定了 cmd='Hello from commandLine' 配置信息
上面講到,一個 setting.gradle 文件對應著一個 Setting 對象,Setting 對象包含的方法如下圖所示
例如有如下代碼 include ':app', ':library'println propertiesFile println DEFAULT_SETTINGS_FILE println getRootProject().name println getRootProject().pathgetGradle().addBuildListener(new BuildListener() {void buildStarted(Gradle gradle) {println 'buildStarted'}void settingsEvaluated(Settings settings) {println "settingsEvaluated"}void projectsLoaded(Gradle gradle) {println 'projectsLoaded'}void projectsEvaluated(Gradle gradle) {println 'projectsEvaluated'}void buildFinished(BuildResult result) {println 'buildFinished'} }) 復制代碼其輸出是:
Hello from gradle.properties settings.gradle GradleForAndroid : settingsEvaluated projectsLoaded projectsEvaluatedBUILD SUCCESSFUL in 0s 3 actionable tasks: 3 executed buildFinished 復制代碼1.2 配置
1.3 執行
執行階段就是指執行某個具體的任務 Task。說道 Task,我想大家應該比較熟悉,在 Android 項目中依賴了 Android Gradle 插件以后,會有許多自帶的 Task,比如常用的 clean、assemble 等,而且大家更應該掌握的是如何自定義 Task,關于 Task 會單獨抽一節來講述。
二. 自定義 Task
- 通過閉包 Closure 的方式添加 Actionclass HelloTask extends DefaultTask {def message = 'create Task by extends DefaultTask'def hello() {println message} }task helloTask2(type: HelloTask) {doFirst {println 'helloTask2 doFirst'}doLast {println 'helloTask2 doLast'} } 復制代碼
- 直接添加 Action 實例對象def taskDef = task helloTask3(type: HelloTask) taskDef.doFirst(new Action<Task>() {void execute(Task task) {println 'helloTask3 Action execute doFirst'} }) taskDef.doLast(new Action<Task>() {void execute(Task task) {println 'helloTask3 Action execute doLast'} }) 復制代碼
- helloTaskB.dependsOn(helloTaskA) 中,可以單獨運行 helloTaskA,但是運行 helloTaskB 的時候會觸發 helloTaskA 的執行
- helloTaskC.mustRunAfter(helloTaskA)中,helloTaskA 和 helloTaskC 都是可以單獨運行的,但是當 helloTaskC 和 helloTaskA 同時運行時,helloTaskC 一定會在 helloTaskA 之后運行
- 下面一幅圖清晰地展示了 Gradle 構建過程中一些關鍵的回調,可以在下面一些回調中添加自定義 Task
- 在 project 對象中,可以通過 gradle 對象得到 TaskExecutionGraph 的實例對象,也可以通過 TaskExecutionGraph 實例對象一些關鍵回調添加自定義的 Task。比如下面這個例子,就是在 TaskExecutionGraph 實例對象準備好之后,彈出一個 dialog 用于輸入 storePass 和 keyPass,然后將 storePass 和 keyPass 設置到 android.signingConfigs 中
如下圖所示 TaskExecutionGraph 的方法結構如下圖所示,都是非常實用方便的方法
三. Android DSL & Gradle DSL
3.1 Android DSL
Android DSL 是 Gradle 的一個 Android 插件,其實在使用 Android Studio 開發的時候經常會和 Android DSL 打交道,比如下面 android{ } 閉包 里面的內容都是 Android DSL
apply plugin: 'com.android.application' import groovy.swing.SwingBuilderandroid {compileSdkVersion 27defaultConfig {applicationId "com.lijiankun24.gradleforandroid"minSdkVersion 15targetSdkVersion 27// ......}buildTypes {// ......}signingConfigs {// ......} } 復制代碼至于里面都有哪些 API,可以去 Android DSL 文檔 查看,也可以去 GitHub 上面搜 android-gradle-dsl
3.2 Gradle DSL
Gradle DSL 在上面介紹 Gradle 生命周期和自定義 Task 的時候已經介紹過了,比如上面介紹的 Setting 和 TaskExecutionGraph 都是 Gradle DSL 中的類,其他的類和方法等 API 可以去 Gradle DSL 文檔 查看,或者可以在 Android Studio 中像查看 Android SDK 源碼一樣去查看 Gradle DSL 的源碼
總結
以上是生活随笔為你收集整理的Gradle 之 Android 中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 封装框架的实践
- 下一篇: CF993E:Nikita and Or