Android Gradle Get Start

2019-03-12 16:46:05 浏览数 (1)

简介

什么是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开发来说,还是非常重要的。

如有问题,欢迎指正。

0 人点赞