Gradle不是一種語言?android
不是,他只是一個使用Groovy語言的項目構建工具。且其內部代碼都是執行代碼,且真實的被運行了,並非單純的配置文件。且大量使用了閉包。api
什麼是閉包?緩存
閉包就是能夠傳遞的方法。 例如:網絡
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
複製代碼
這是咱們Android中常見的配置文件,但其實是這樣子的閉包
allprojects(new Action<Project>() {
@Override
void execute(Project project) {
project.repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
})
複製代碼
咱們用閉包的方法傳入了Action,lamada表達式其實傳遞的其實也是一個閉包,此處只是個簡單的例子。app
再來看下面這一段maven
dependencies {
classpath "com.android.tools.build:gradle:4.2.0-alpha03"
}
複製代碼
這又是什麼呢?但其實寫過Kotlin的同窗們應當很熟悉了。{}
內其實有個隱藏對象it, 因此咱們能夠以下解析上面的代碼ide
dependencies ({ it->
it .add('classpath' , "com.android.tools.build:gradle:4.2.0-alpha03")
})
複製代碼
it具體指的就是其中的一個回調 ——— dependencyHandly了,閉包不只能夠傳遞方法還有對象,甚至能夠隱藏一些方法名,只要不發生歧義便可。工具
到此其實已經很清晰了,原理就是方法調用。gradle
下面看子包下的配置文件
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
}
複製代碼
implementation 和 compile 的區別?
compile會依賴傳遞,implementation不會。好比說咱們子引入了咱們寫的一個模塊 compile project(":http")
是咱們封裝的網絡請求,其中使用了OkHttp,retrofit,room,協程拓展....,咱們使用compile以後,咱們主包能夠使用子模塊引入的庫。這會致使咱們引入多個相同的庫。咱們多個子模塊引入相同的庫致使每次編譯的到這些庫的時候會致使緩存無效,從新編譯,緣由是Grooovy不會去確認你其餘包是否使用了你傳遞的這個庫,引入了咱們的http
就完整編譯。
目前compile
已經被遺棄了更名爲api
,若是咱們有些庫常常變化,如咱們正在完善的網絡請求庫,能夠使用api
代替implementation
引入依賴。