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
引入依赖。