其實學到這裏,對於 AndroidStudio 裏的 Gradle 仍是不懂, 好多東西見過 ,但是 不知道具體是幹啥的,因此學好基礎,到後面再看 Android Gradle 就很簡 單了 。我 們接着學習基礎。java
帶着疑問去學習。android
咱們在 Gradle 中會常常看到根目錄下有個 settings.gradlebash
settings.gradle 的做用是爲了設置子工程,由於在 Gradle 的多工程是經過工程樹來表示的,其實和 AndroidStudio 中的 project 和 Module 的概念差很少,根工程就是 project,子工程就是 module。app
一個子工程只有在 Settins 文件中配置了纔會被 Gradle 識別,也就是纔會在構建的時候被包含進去。ide
rootProject.name = 'mopub-android'
include ':mopub-sdk', ':mopub-sample', ':mopub-sdk:mopub-sdk-base', ':mopub-sdk:mopub-sdk-banner',
':mopub-sdk:mopub-sdk-interstitial', ':mopub-sdk:mopub-sdk-rewardedvideo',
':mopub-sdk:mopub-sdk-native-static', ':mopub-sdk:mopub-sdk-native-video'
複製代碼
這裏是爲子項目指定默認的目錄,咱們也能夠手動指定目錄。學習
include ':mopub-sdk'
project (':mopub-sdk').projectDir = new File(rootDir,'mopub/mopub-sdk')
複製代碼
每個 Project 都會有一個 build.gradle ,這是該 Project 構建的入口,在這裏對 Project 進行配置,好比依賴哪的庫啊,依賴哪一個插件啊。gradle
雖然每一個 Project 都有一個 build.gradle 可是 Root Project 是老大,能夠獲取到全部 Child Project ,因此在 Root Project 的 build.gradle 中能夠對 Child Project 統一進行配置。好比全部的 Child Project 的倉庫爲 jcenter,這樣咱們依賴的 jar 就能夠直接從 jcenter 中下載了。ui
buildscript {
repositories {
jcenter()
google()
}
...
}
複製代碼
Child Projectgoogle
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.auto.service:auto-service:1.0-rc4'
implementation 'com.squareup:javapoet:1.11.1'
implementation project(path: ':router_annotation')
}
複製代碼
多 Project 實際上是爲了更好的拆分,低耦合、高聚合,一個項目能夠由多個 project 組成,一個 Project 又能夠由多個 Task 組成。spa
好比編譯一次 Java 代碼,上傳到 JCenter,打包成 aar 等等都是任務。
//文件名爲 custom.gradle
ask customTask{
doFirst{
println ':customTask:doFrist'
}
doLast{
println ':customTask:doLast'
}
}
複製代碼
task Buying {
doLast{
println 'Buying:買菜'
}
}
task Washing(dependsOn: Buying){
doLast{
println 'Washing:洗菜'
}
}
task Cook(dependsOn: Washing){
doLast{
println 'Cook:作飯'
}
}
複製代碼
名稱有點拗口,其實意思就是,好比咱們寫了一個 Task ,其實這個 Task 就和咱們定義的其餘變量一下,能夠直接使用 Task 以及他的方法。
task exHello {
println '<<'
}
exHello.doFirst{
println project.hasProperty('exHello')
println 'doFirst'
}
exHello.doLast{
println 'doLast'
}
複製代碼
這個咱們就用的比較多了,基本都會使用到。若是須要添加額外的自定義屬性,那麼能夠經過兩種方式,一種是 ext.age 這樣單獨添加,一種是 ext{} 添加多個。
ext.age = 12
ext{
phone = 123456
address = 'beijing'
}
task exCustomProperty{
println phone
println address
println age
}
複製代碼
相信你們在 AS 中都用過吧,因此這個自定義屬性仍是用的很普遍的。跨 Project、跨 Task 等統一配置相信你們基本都搞過,沒有搞過的就去搞搞。
還有一個地方挺常常用的,那就是 SourceSet,以及 使用 projectFlavors 中,都會和它打交道。
apply plugin:"java"
task exCustomProperty{
sourceSets.each{
println " ${it.name}--${it.java.srcDirs}"
}
}
sourceSets.all{
ext.srcDirs = null
}
sourceSets {
main {
srcDirs = ['main/src']
}
test{
srcDirs = ['test/src']
}
}
複製代碼
因此咱們再開發中的時候,爲了不各個 module 的配置不一樣和免去手抖帶來的 bug,因此須要統一管理一些配置信息,因此就能夠 ext{},美滋滋,偷懶的利器。
這就是在 Gradle 中靈活的地方,在這個腳本文件中可使用 Groovy、Java 以及 Gradle 的任何語法和 API,來作咱們想要作的事情。在腳本里,能夠定義類,內部類,導入包,定義方法,常量,接口,靈活的你想象不到,好比 咱們根據時間來生成 apk 包名。
def buildTime(){
def data = new Date()
def formattedData = date.format('yyyyMMdd')
return formattedData
}
複製代碼
劃重點: 本文是徹底參考 《Android Gradle 權威指南》而寫,做爲學習筆記使用。