从我开始接触Android的时候,Eclipse作为Android开发的 主流ide的 时代已经结束了 ,随之而起的是基于JetBrains家的大名鼎鼎的Intelli Idea的 AndroidStudio,从此整个Android项目 的构建 开始采用 Gradle。
初识:
Gradle 是项目构建 的脚本工具 ,拥有完整的语言支持,和丰富的三方库插件!信息显示Gradle是基于Ant 和Maven的更加优秀的构建 工具,要比 Ant跟 Maven的构建速度更快,Gradle支持增量构建,数据 显示Gradle的构建速度比Ant跟Maven快一倍以上。
Google官方 也一直在推荐使用Gradle来 构建大型项目,许多明星开源项目也 在支持 用Gradle来构建比如 SpringBoot
新建一个Android项目 ,切换到工程目录下我们 可以看到 android项目中到处都有Gradle的影子
但是说实话,第一次 用gradle 来构建项目的 时候 ,并没有 体会到 gradle有多优秀,因为 漫长的 构建 过程,早已使我丢失了 对 gradle深入 学习的乐趣,后来的后来 才发现原来是自己使用姿势不对 ,毕竟有些资源库是需要翻墙才能访问的,当然我们 也可以 使用国内的镜像 来访问,从而加快构建 速度
工程角度:
我们可以点开setting.gradle 这 个脚本 ,这个脚本是项目构建 的时候 最先执行到的地方,里面一般会有 inclue app xxx xxx 之类的字眼,没错app是整个项目的核心入口 ,其他是android工程的library 或者module,所以若果想做一些基础的 初始化 操作,可以在 setting.gradle 里加入一些逻辑 。
我们再看下整个项目的build.gradle这个脚本 ,一般是这样子的
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
我们 看到这里面有好多大括号 ,并不像我们认识的java里的那种比较规整的类文件 ,这对于动态类型的语言 并没有严格 的条框规定 ,大括号的 含着一些 代码段就有了闭包的概念,这在Kotlin中也比较常见,在Grrovy中也常见,
repositories{}这种闭包里是添加 项目依赖的三方库的地址,google()是谷歌的maven仓库地址 jcenter()是最大的 java开源库托管地址,但是看报道应该jcenter()后续可能也不维护了 ,dependencies{}闭包里是装着的是具体依赖的三方库的名字和版本号,这里是整个项目的构建文件,一般这里是并不会做太多的处理的 ,要 做修改的是我们的app目录下的的那个 build.gradle 文件,
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.example.myeventbusdemo"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'org.greenrobot:eventbus:3.2.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
这里依然 是一些闭包 ,里面的 东西都大同小异 ,真实的项目开发中这个文件 中的逻辑 还是 比较复杂的,我们看第一个 plugins{ } 闭包,这个里面是用来引用一些已经做好的三方的 gradle插件,比如有关 kotlin中直接使用id代表组件 的 id 'kotlin-android-extensions' 还有一些三方库的比如 bugly arouter之类的,下面是比较大一点的 android{} 里面又会存在一些其它闭包,默认配置项 编译的类型,以及一些 依赖的 设置 ,不再详细介绍,dependencies{} 前面说过的 ,都大同小异,但是这里要说几种依赖的方式,
implementation 这种依赖算是谷歌在构建上做的一个 优化,采用这种依赖方式构建,编译期间其它模块是 不会拿到这部分的 依赖的,只有构建 输出以后其它模块才能用到 这里的依赖 ,这样的好处 是会显著减少构建的时间,因为如果更改了依赖 中的内容,只有依赖他的模块会参与重新构建,其它模块并不会,这也是gradle构建中比较推荐的方式,那如果想要其他模块也能引用到该模块引用的三方库,就需要使用api这种引用方式了,compileOnly Gradle 只会将依赖项添加到编译类路径(也就是说,不会将其添加到构建输出)。如果您创建 Android 模块时在编译期间需要相应依赖项,但它在运行时可有可无,此配置会很有用 runtimeOnly Gradle 只会将依赖项添加到构建输出,以便在运行时使用。也就是说,不会将其添加到编译类路径。
那我们 在来说下gradle wrapper,wrapper会对gradle的版本做一个 包装,适合当前项目,比如我们在当前 项目的 终端执行 gradle 命令 可能不被 识别,那是因为我们没有 配置gradle的全局 环境变量,如果我们 执行 的是 ./gradlew - xxx 之类的命令 一般都是可以 正常执行的,
此外还有一个这样的文件
用来配置gradle的路径版本 之类。
Gradle中的细节
语言:
我们 知道 gradle的 早期 构建 语言是 Grrovy,后期 加入 了kotlin DSL的支持,Grrovy作为一类动态语言,其实对于我们使用Kotlin的开发者 来说 不会觉得 陌生,里面有很多语言概念 都很相似 ,其实 在 android项目 中编写gradle 相关代码的时候,已经做了更好的封装了 ,对于Groovy的直接使用 概率并不高,简单对Grrovy编程语言做个 了解,也是有些必要的,目前对于Android开发来说,Groovy使用到 最多的地方就是gradle里了。
task:
gradle中想要做一些 额外的操作 ,我们 可以写一些task来实现,对于task这里便不再过多介绍 ,关于 task的文章有很多很多,task的 执行依赖,修改,构建打包之类有很多 介绍。那我们 知道 Gradle有一种增量 构建 的功能 up _to _date, Gradle每次 执行 task都会把task缓存下来,如果 task的入参,或者说 输入没有 变化,那他的输出也不会 有 变化 ,这样我们直接拿缓存里的 task就可以 ,这就避免task重复 执行,节省了构建时间。
生命周期:
gradle中的几个 回调 基本的执行顺序是这样的。
this.gradle.settingsEvaluated {
//初始化
println("这是settingsEvaluated")
}
this.gradle.projectsLoaded {
println("这是 projectsLoaded")
}
this.gradle.beforeProject {
println("这是beforeProject")
}
this.gradle.afterProject {
println("这是 afterProject")
}
this.gradle.projectsEvaluated {
println("这是projectsEvaluated")
}
this.gradle.buildStarted {
println("这是buildStarted")
}
this.gradle.buildFinished {
println("这是buildFinished")
}
其他
Gradle如果要 使用的比较好,自然少不了对官方文档 的研读 ,android官网也给出了十分 详细的 文档 ,我们 可以参看 学习。附上链接