全面理解Gradle - 執行時序
什麼是Gradle?
一個像 Ant 一樣的非常靈活的通用構建工具
一種可切換的, 像 maven 一樣的基於合約構建的框架
支援強大的多工程構建
支援強大的依賴管理(基於 ApacheIvy )
支援已有的 maven 和 ivy 倉庫
支援傳遞性依賴管理, 而不需要遠端倉庫或者 pom.xml 或者 ivy 配置檔案
優先支援 Ant 式的任務和構建
基於 groovy 的構建指令碼
有豐富的領域模型來描述你的構建
如何學習Gradle?
-
學習 Groovy( http://docs.groovy-lang.org/ )
-
學習 Gradle DSL( https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html )
-
學習 Android DSL和Task( http://google.github.io/android-gradle-dsl/current/index.html )
使用Gradle wrapper
如果你本地安裝了Gradle,那麼你就可以使用gradle命令來直接構建。如果本地沒有安裝,那麼可以通過gradle wrapper來構建,Linux和MAC使用./gradlew,而Windows上面則使用gradlew,還可以在 gradle/gradle-wrapper.properties 中配置 Gradle 版本。
Gradle指令碼的執行時序
Gradle指令碼的執行分為三個過程:
-
初始化
分析有哪些module將要被構建,為每個module建立對應的 project例項。這個時候settings.gradle檔案會被解析。
-
配置:處理所有的模組的 build 指令碼,處理依賴,屬性等。這個時候每個模組的build.gradle檔案會被解析並配置,這個時候會構建整個task的連結串列(這裡的連結串列僅僅指存在依賴關係的task的集合,不是資料結構的連結串列)。
-
執行:根據task連結串列來執行某一個特定的task,這個task所依賴的其他task都將會被提前執行。
下面我們根據一個實際的例子來詳細說明。這裡我們仍然採用VirtualAPK這個開源專案來做演示,它的地址是: https://github.com/didi/VirtualAPK 。
我們以它的宿主端為例,宿主端有如下幾個模組:

image
其中buildSrc是virtualapk-gradle-plugin,為了便於除錯我將其重新命名為buildSrc。他們的依賴關係如下:

解釋一下,app模組依賴CoreLibrary和buildSrc,CoreLibrary又依賴AndroidStub。為了大家更好理解,下面加一下log。




現在隨便執行一個task,比如 ./gradlew clean
,那麼將會輸出如下日誌,大家對比著日誌,應該能明白Gradle指令碼的執行順序了吧。

可以看到,Gradle執行的時候遵循如下順序:
1. 首先解析settings.gradle來獲取模組資訊,這是初始化階段;
2. 然後配置每個模組,配置的時候並不會執行task;
3. 配置完了以後,有一個重要的回撥 project.afterEvaluate
,它表示所有的模組都已經配置完了,可以準備執行task了;
4. 執行指定的task。