Gradle系列之基础篇

定义

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置, 项目配置简单且任务扩展方便。java

构建工具的前世此生

Gradle 诞生前有两个很是流行的自动化构建工具Ant和Maven,下列表格对比这两个构建工具的优缺点:android

image

Gradle是基于Ant和Maven诞生的自动化构建工具,那么它必需要同时拥有Ant和Maven的优点,也就是说Gradle具备以下特色:api

  • 包含依赖管理器,方便引用外部依赖库
  • 具备默认的构建任务周期
  • 灵活的自定义构建逻辑

Gradle基础

本节重点介绍下Gradle的基础内容,包括运行机制和脚本内容的分析。bash

Gradle工做流程

Gradle 工做流程分为三个阶段,以下图所示: 闭包

image

  • initialization
    Gradle初始化阶段会到root工程根目录找到setting.gradle文件,全部在该文件中声明的工程均是Gradle自动化构建的工程
  • configure
    Gradle初始化事后就会根据setting.gradle中配置的全部工程目录下找build.gradle文件,而后分析build.gradle文件,肯定须要执行的任务以及任务的顺序
  • build 根据configure阶段肯定的Task执行顺序执行Task任务
脚本分析

Gradle有不少插件,这里主要分析Android插件的脚本配置。app

setting.gradle工具

Setting.gradle中主要是声明了哪些Gradle自动化构建的工程,内容以下所示:测试

include ':app', ':library1', ':library2’ 复制代码

上面内容是包括三个Gradle工程,其中冒号能够理解为/,解释为构建工程的相对目录gradle

根目录build.gradleui

根目录build.gradle是对全部Gralde工程均起做用的全局声明,内容以下:

image

  • buildscript 该标签是编译脚本的做用域,也就是对Gradle的配置,其中repositories是Gradle构建脚本的仓库声明,其中dependencies也是Gradle构建脚本所须要的,这里明显是Android工程的Gradle构建工具
  • repositories 仓库的意思,就是声明依赖库的地址,allprojects声明的是全部Gradle工程中引用外部库的地址,当有一些lib库放在私有仓库里,须要在这里面添加私有仓库;其中buildscript中的声明的是Gradle构建工具须要依赖的仓库
  • task 这里默认声明了一个task,这个Task是用于删除Gradle构建过程生成的文件,Task用法后面再具体说

Android工程build.gradle

Android 工程中的build.gradle文件内容重点是android标签里面的特殊配置项,这里贴一个简单的配置:

image

  1. apply plugin
    表示当前Gradle工程构建过程须要使用到的插件,其中com.android.application表示的是使用Android项目的构建过程,固然也能够引用其它插件,前提是在root project的build.gradle中的buildscipt中的dependencises中配置,这里因为配置了com.android.tools.build:gradle因此能够直接使用Android插件

  2. android
    这个是Android工程特有的配置项,这里介绍一下几个基本配置选项:

    compileSdkVersion: 编译时使用的SDK版本
    buildToolsVersion: 编译时使用的编译工具的版本
    applicationId: 应用惟一标识
    buildTypes: 编译类型,通常默认deubg和release两种,能够自定义

    Android里面有不少配置选项,基本就能知足平常开发需求

  3. dependencies
    依赖标签,主要是设置工程须要的外部库,里面有不少依赖方式,这个具体后面介绍

依赖

依赖主要是引用外部库的过程,这里须要说明两点:仓库以及依赖方式

  • 仓库
    Gradle中仓库声明主要使用repositories,除了使用远程仓库,还可使用本地仓库,如在工程中依赖aar时,就是使用的本地仓库:
repositories {    
    flatDir {        
        dirs 'libs'   // aar目录
      }
}
复制代码

这里是把本地libs目录看成仓库使用

  • 依赖
    依赖方式比较多,Gradle3.0后又对依赖方式进行了修改,这里列出不一样版本以及不一样依赖方式之间的差异:
    image
    须要注意以下几点:
  1. implementation和api主要差异是可见性,api的可见性更强
  2. 上面的依赖方式每每结合Flavor使用构建不一样的Variant

依赖远程库文件主要由三部分构成: group Name version
以下所示:

image
Group:com.android.Support
Name:appcompat-v7
Version:25.1.0

Variant

Android 主要使用BuildType和Product Flavor构建多种Variant

  • BuildType
    BuildType默认有debug和release两种:

    image
    BuildType构建类型其实颇有用,好比配置签名,测试连接,以及混淆等,对平常测试开发颇有帮助,以下就定义了在不一样的构建类型里面定义了不一样的访问链接:
    image

  • Product Flavor
    Product Flavor表示不一样特色的产品,例如APK打包发布时须要发不到不一样的应用市场,开发者须要设置不一样渠道的渠道号,有的时候还须要针对不一样渠道的产品定制特殊的图标或者界面。

    1. 设置不一样Product Flavor:
      上图设置了不一样的ProductFlavor,内容是不一样渠道的渠道号,这样在构建不一样的产品时,渠道号就直接被修改了
    2. 生成不一样的Product 源集
      定制特定的功能,能够将功能独立出来,而后根据不一样的Product实现,生成不一样的Product源集须要了解下列规则:
    • java文件:java文件须要在product具体包名下生成,不可在main中也生成,不然会出现类被定义2次的错误
    • drawable和layout文件:会直接覆盖main源集中相同名称的资源
    • value目录文件:合并内容
    1. 构建Variant
      上述步骤是配置不一样的Variant,当配置完成后,就能够执行编译命令,通常编译的时候,会使用以下命令构建:
    ./gradlew assemble
    复制代码

    该命令会构建全部的的Variant,且产物的数量为BuildTypes x Product Flavor, 若是想要只构建某一个或者一类的Variant,能够执行以下构建命令:

    ./gradlew assemble + Product Name(可选) + BuildTypes(可选)
    复制代码
Task

Task是Gradle中一个很是重要的工具,经过使用Task能完成一些特定的需求,本节主要从如下三个方面说明:

  • Task使用
  • Task解析
  • Hook Task
Task使用

声明Task有好几种方式,下面展现一种直接定义的方式:

image
直接执行gradle命令运行:
image

这里注意输出:

Configure project:app
Hello world
复制代码

其中在Hello Task中定义的内容在Configure阶段就输出了,这里再看下Gradle执行流程:

image

若是想要在build task阶段执行Task,能够将task定义以下:

image
任务执行结果以下:
image
能够看出这里任务是在Task执行阶段运行,这里的<<符号表明doLast的意思,具体后面说明

Task解析

上面简单说明了Task的使用,这里主要解析一下Task。
Task内部定义了不少属性和动做,本质上是一个定义了不少方法和属性的接口,全部的方法都已经被DefaultTask实现了,因此在Gradle中使用Task都是基于DefalutTask来实现的。 每一个Task中都包含了一个Action对象的集合,这个动做都会被按照顺序执行,动做为doLast和doFirst方法,这里举一个简单的例子:

image
这里定义了一个Hello的Task,里面声明了不少doFirst和doLast的闭包,执行结果以下:
image
这里说明一下:

  1. 没有在闭包doLast和doFirst中定义的将会在Gradle的Configure阶段执行
  2. 闭包doLast和doFirst在Gradle中的Build Task阶段执行
  3. doLast和doFirst同种声明从上往下优先级递增

总结:
Task归根结底是一个类,因此也能够继承task来完成一些特定动做,这里不作自定义task的介绍,比较少用到,这里主要介绍几个经常使用的特定task,如copy,zip,delete,下面例举删除的task的使用:

image

HooK Task

Hook Task是指在项目构建的过程当中插入自定义任务,完成一些特定的需求,Hook的点有不少,主要能Hook两个阶段:

image
Configure阶段和Build阶段进行Hook,这里简单举两个例子,后面会在进阶篇重点讲解

  • Hook Configure阶段

    image
    上面是在构建Task有向图的时候忽略一些Task,这里直接忽略AndroidTest任务

  • Hook Build阶段

    image
    这里是对编译的产物进行处理

总结

本篇主要从总体上介绍一下Gradle,重点要理解Gradle的执行流程,以及build.gradle文件中的配置做用已经做用范围,下一篇将重点介绍Gradle在Android中比较高级的用法。

相关文章
相关标签/搜索