什么是Gradle?
一個(gè)像 Ant 一樣的非常靈活的通用構(gòu)建工具
一種可切換的, 像 maven 一樣的基于合約構(gòu)建的框架
支持強(qiáng)大的多工程構(gòu)建
支持強(qiáng)大的依賴管理(基于 ApacheIvy )
支持已有的 maven 和 ivy 倉(cāng)庫(kù)
支持傳遞性依賴管理, 而不需要遠(yuǎn)程倉(cāng)庫(kù)或者 pom.xml 或者 ivy 配置文件
優(yōu)先支持 Ant 式的任務(wù)和構(gòu)建
基于 groovy 的構(gòu)建腳本
有豐富的領(lǐng)域模型來(lái)描述你的構(gòu)建
如何學(xué)習(xí)Gradle?
學(xué)習(xí) Groovy(http://docs.groovy-lang.org/)
學(xué)習(xí) Gradle DSL(https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html)
學(xué)習(xí) Android DSL和Task(http://google.github.io/android-gradle-dsl/current/index.html)
使用Gradle wrapper
如果你本地安裝了Gradle,那么你就可以使用gradle命令來(lái)直接構(gòu)建。如果本地沒(méi)有安裝,那么可以通過(guò)gradle wrapper來(lái)構(gòu)建,Linux和MAC使用./gradlew,而Windows上面則使用gradlew,還可以在 gradle/gradle-wrapper.properties 中配置 Gradle 版本。
Gradle腳本的執(zhí)行時(shí)序
Gradle腳本的執(zhí)行分為三個(gè)過(guò)程:
初始化
分析有哪些module將要被構(gòu)建,為每個(gè)module創(chuàng)建對(duì)應(yīng)的 project實(shí)例。這個(gè)時(shí)候settings.gradle文件會(huì)被解析。配置:處理所有的模塊的 build 腳本,處理依賴,屬性等。這個(gè)時(shí)候每個(gè)模塊的build.gradle文件會(huì)被解析并配置,這個(gè)時(shí)候會(huì)構(gòu)建整個(gè)task的鏈表(這里的鏈表僅僅指存在依賴關(guān)系的task的集合,不是數(shù)據(jù)結(jié)構(gòu)的鏈表)。
執(zhí)行:根據(jù)task鏈表來(lái)執(zhí)行某一個(gè)特定的task,這個(gè)task所依賴的其他task都將會(huì)被提前執(zhí)行。
下面我們根據(jù)一個(gè)實(shí)際的例子來(lái)詳細(xì)說(shuō)明。這里我們?nèi)匀徊捎肰irtualAPK這個(gè)開(kāi)源項(xiàng)目來(lái)做演示,它的地址是:https://github.com/didi/VirtualAPK。
我們以它的宿主端為例,宿主端有如下幾個(gè)模塊:
其中buildSrc是virtualapk-gradle-plugin,為了便于調(diào)試我將其重命名為buildSrc。他們的依賴關(guān)系如下:
解釋一下,app模塊依賴CoreLibrary和buildSrc,CoreLibrary又依賴AndroidStub。為了大家更好理解,下面加一下log。
現(xiàn)在隨便執(zhí)行一個(gè)task,比如./gradlew clean,那么將會(huì)輸出如下日志,大家對(duì)比著日志,應(yīng)該能明白Gradle腳本的執(zhí)行順序了吧。
可以看到,Gradle執(zhí)行的時(shí)候遵循如下順序:
1. 首先解析settings.gradle來(lái)獲取模塊信息,這是初始化階段;
2. 然后配置每個(gè)模塊,配置的時(shí)候并不會(huì)執(zhí)行task;
3. 配置完了以后,有一個(gè)重要的回調(diào)project.afterEvaluate,它表示所有的模塊都已經(jīng)配置完了,可以準(zhǔn)備執(zhí)行task了;
4. 執(zhí)行指定的task。