简介
什么是gradle
Gradle其实是一套平台和规范,为打包提供的规范。而Android的打包,是Google写的一个Gradle插件。
gradle在做什么
编译好的代码,只是一堆散装的.jar 、.so 、.xml文件。要将它们以正确的目录结构,合并成一个apk。
所以,通常在gradle中,我们需要根据工程结构配置路径,然后配置工程信息,并干预合成apk的过程。
Gradle的生命周期
初始化
Gradle可以构建一个和多个项目。在初始化阶段,Gradle会确定哪些项目参与构建,并且为这些项目创建一个Project实例。
此时,settings.gradle会被执行。settings.gradle中会包含:
代码语言:javascript复制include ':app'
include ':xxx'
include ':xx2'
监听
代码语言:javascript复制gradle.buildStarted{
println "【settings.gradle】 初始化执行开始"
}
gradle.settingsEvaluated {
println "【settings.gradle】 初始化执行结束"
}
gradle.projectsLoaded {
println '【settings.gradle】初始化结束'
}
代码语言:javascript复制gradle.addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
println '【settings.gradle】 初始化执行开始'
}
@Override
void settingsEvaluated(Settings settings) {
println '【settings.gradle】 初始化执行结束'
}
@Override
void projectsLoaded(Gradle gradle) {
println '【settings.gradle】初始化结束'
}
})
配置
执行build.gradle:
代码语言:javascript复制println 'build.gradle的配置阶段'
// 调用Project的dependencies(Closure c)声明项目依赖
dependencies {
// 闭包中执行的代码
println 'dependencies中执行的代码'
}
// 创建一个Task
task test() {
println 'Task中的配置代码'
// 定义一个闭包
def a = {
println 'Task中的配置代码2'
}
// 执行闭包
a()
doFirst {
println '这段代码配置阶段不执行'
}
}
输出结果:
代码语言:javascript复制build.gradle的配置阶段
dependencies中执行的代码
Task中的配置代码
Task中的配置代码2
我是顺序执行的
:buildEnvironment
我们可以看到配置阶段,会执行build.gradle中包括依赖,task配置等代码。但不会执行task中doFirst,doLast的内容。
最终,配置阶段结束后,会形成Task依赖拓朴图,这个图是一个有向无环图。
监听
代码语言:javascript复制gradle. beforeEvaluate{
println 'build.gradle 配置执行开始'
}
gradle. afterEvaluate {
println 'build.gradle 配置执行结束'
}
代码语言:javascript复制gradle.addBuildListener(new BuildListener() {
@Override
void beforeEvaluate(Gradle gradle) {
println '配置执行开始'
}
@Override
void afterEvaluate(Gradle gradle) {
println '配置执行结束'
}
})
除此之外,还有gradle.projectsEvaluated
,gradle.taskGraph.whenReady
两个回调,就不写代码了。
执行
Gradle为在配置阶段创建和配置的任务再次筛选需要执行的任务的子集,这个子集的筛选是由在命令行下传递给Gradle的任务名和目录决定的,子集中的每个任务都会被执行。
监听
每个任务在执行时,都会
gradle.taskGraph.beforeTask
,gradle.taskGraph.afterTask
当整个gradle构建完成时,会回调gradle.buildFinish。
apk打包流程
apk打包流程
小结
在Android开发中,很多情况下,我们的逻辑并不能写在代码中。因为无用的分支和资源,将产生额外的APK大小。我们应该将一部分不依赖网络的业务逻辑,放在编译期完成,根据需要打出不同的APK包。
所有编译期的工作,就是由Gradle来完成的。我们可以根据需要,通过Gradle配置不同的资源和逻辑。甚至可以通过Gradle Transform修改.class到.dex的逻辑。
未来的Android开发,会越来越倾向于,以SDK作为零件,项目则主要进行组装。Gradle就是这个组装过程的核心技术。所以学好Gradle对Android开发来说,还是非常重要的。
如有问题,欢迎指正。