上一階段,咱們瞭解了Gradle的生命週期android
知道了有這麼一個過程:Gradle開始於初始化Project,而後到配置造成task的拓撲圖,再到根據拓撲圖執行一個個task程序員
這階段,咱們將學習Gradle模塊中的Project相關知識編程
Project(工程)在Gradle中,是一個比較重要的概念,是Gradle整個API的入口markdown
下面是一個demo的工程目錄以下:app
在咱們程序員的視角中,會認爲「DaviPlu」是工程,「app」和「lifecycle-plugin」是模塊post
可是在Gradle視角中,倒是不同的,「DaviPlu」,「app」和「lifecycle-plugin」都會認爲是工程( Project ),具體以下圖(執行 「./gradlew projects」 後):學習
咱們能夠看到,執行了「 ./gradlew projects 」 命令後,會把當前的Gradle的Project打印出來,同時能夠注意到,其組織方式是以樹的方式實現的(根project爲「DaviPlu」,其餘爲子project)gradle
每個Project,都會有一個對應的「 build.gradle 」文件對應,咱們的Gradle編程,基本都是在「 build.gradle 」文件中編寫ui
每個子project,都會有一個輸出,好比:「app」是一個應用類型的,那麼輸出的就是apk;「lifecycle-plugin」是一個lib相似的,輸出的就是aar或者jarthis
Project相關的API相對比較多,可是大體能夠分爲以下幾類:
1)task API
- 對當前project,新增或者修改task的能力
複製代碼
2)屬性 API
- project添加額外屬性的能力
複製代碼
3)Project API
- 操做和管理父project和子project的能力
複製代碼
4)Gradle 生命週期
- 這個上次有學習,具體見:https://juejin.cn/post/6960834289755750408
複製代碼
5)file API
- 和一開始學習groovy基礎知識中的file文件操做不一樣,具體見:https://juejin.cn/post/6959482085509693476#heading-8
- 主要是操做當前gradle相關的文件爲主
複製代碼
6)其餘
- 相對零散,如:gradle添加依賴/配置/引入外部文件等內容
複製代碼
主要是:操做和管理父project和子project的能力
每個project,都有一個build.gradle文件,而後該文件編譯的時候,會被編譯爲project的字節碼,因此在build.gradle文件裏面寫的內容,其實就是在project類的內部寫的
假如咱們有這麼一個demo工程,其依賴關係爲:
DaviPlu
有3個project,那麼就有對應的3個build.gradle文件
接下來咱們分別在這3個build.gradle文件中,進行學習API
1)得到全部的project
代碼(在3個gradle文件中都執行一樣代碼):
this.getAllprojects().eachWithIndex { Project entry, int i ->
println "【getAllprojects().eachWithIndex-->】遍歷全部的project name : " + entry.name
println "【getAllprojects().eachWithIndex-->】遍歷全部的project index : " + i
}
複製代碼
執行結果:
【DaviPlu】
【getAllprojects().eachWithIndex-->】遍歷全部的project name : DaviPlu
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 0
【getAllprojects().eachWithIndex-->】遍歷全部的project name : app
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 1
【getAllprojects().eachWithIndex-->】遍歷全部的project name : lifecycle-plugin
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 2
複製代碼
【app】
【getAllprojects().eachWithIndex-->】遍歷全部的project name : app
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 0
複製代碼
【lifecycle-plugin】
【getAllprojects().eachWithIndex-->】遍歷全部的project name : lifecycle-plugin
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 0
複製代碼
2)得到父project
代碼(在3個gradle文件中都執行一樣代碼):
if (this.getParent() == null) {
println "我是根project,因此我沒有父project !!! "
} else {
println "得到父project : " + this.getParent().name
}
複製代碼
執行結果:
【DaviPlu】
我是根project,因此我沒有父project !!!
複製代碼
【app】
得到父project : DaviPlu
複製代碼
【lifecycle-plugin】
得到父project : DaviPlu
複製代碼
3)得到根Project
代碼:
this.getRootProject().name
複製代碼
4)根Project管理子Project相關API
if (this.getParent() == null) {
println "我是根project !!! "
project('app', { Project p ->
println "根project中操做 : " + p.name
//這裏其實進到了app中的gradle文件裏面,能夠自由的操做
})
project('lifecycle-plugin', { Project p ->
println "根project中操做 : " + p.name
//這裏其實進到了app中的gradle文件裏面,能夠自由的操做
})
}
複製代碼
5)當前結點project配置和全部子project的配置
allprojects {
println "【allprojects】當前結點project配置和全部子project的配置 --> " + project.name
}
複製代碼
6)全部子project的配置(不包含當前的project)
subprojects {
println "【subprojects】全部子project的配置(不包含當前的project) --> " + project.name
}
複製代碼
7)當前project是否存在xx插件
if (project.plugins.hasPlugin('com.android.application')) {
println "【project.plugins.hasPlugin】當前project存在 application插件.."
}
複製代碼
哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)