[Gradle]Gradle基础

517 阅读3分钟

1、Gradle重要概念

  • 官方文档

  • Gradle 是一个构建工具,或者理解为一个编程框架。Gradle 基于Groovy语言,Groovy 又基于Java。 与Maven相比,Gradle是可编程的

  • 设置选项 GRADLE_HOME: 环境变量,告诉操作系统 Gradle 的安装目录。 GRADLE_USER_HOME: 环境变量,用于存放 Gradle 运行时的一些通用配置, 缓存等等。 默认值是 $HOME/.gradle, 一般不用单独配置。 gradle.properties:是配置文件,可以在这里添加gradle构建项目时用到的参数 gradle-wrapper.gradle:

  • Project: Gradle中每一个待编译的工程都叫一个Project,所以可以有多个Project,每个project可以打包成jar、war等等,即看成一个独立的模块。 每个Project都会有一个build文件(每一个build.gradle 会转换成一个Project 对象)

  • 额外属性 使用ext为Project和Task添加额外属性。Project 和Gradle 对象都可以设置 ext 属性 定义了ext,就可以实现属性的跨脚本调用了。

    ext.pwd="abc"
    ext {
        url = "www.baidu.com"
        username = "zhangsan"
        flag = true
    }
    
  • 项目同步 在修改gradle文件后,需要执行同步操作。使用Android Studio,可以通过Sync Project with Gradle Files触发。 其本质上是执行了generateDebugSouces任务。

2、输入选项

  • -P:在编译Android项目时增加 gradle的参数 可以在Terminal中输入构建命令,也可以在AndroidStudio 的Setting的Command-line Options 选项中,将参数写入。 携带多个参数时,依次追加即可:-Pparam1=123 -Pparam2=456 ... 然后读取参数:
    sdk_active = project.hasProperty('sdkactive') ? project.property('sdkactive') : DEFAULT_SDK_ACTIVE
    

3、构建选项

  • 构建是否使用 daemon 进程,默认 true。
    在gradle.properties中设置参数org.gradle.daemon=false

4、Gradle工作流程

说得太简单,需要深入理解

  1. 初始化:Gradle 有一个初始化流程,这个时候settings.gradle 会执行。
  2. 配置:在这个阶段,每个Project 都会被解析,并不会执行其中的任务,只会评估(Evaluate)任务的依赖性,根据其依赖性创建任务的有向无环图
  3. 执行:在gradle xxx 中指定什么任务,gradle 就会将这个xxx任务链上的所有任务全部按依赖顺序执行一遍!

5、Gradle中的对象

5.1 Gradle对象:当执行gradle命令的时候,会默认构造一个Gradle对象。并且在整个执行过程中只会产生一个对象

//代码
println( gradle.getGradleHomeDir() )
println( gradle.getGradleUserHomeDir() )

//-------------------------
//执行结果
C:\Users\xxx\.gradle\wrapper\dists\gradle-5.1.1-all\97z1ksx6lirer3kbvdnh7jtjg\gradle-5.1.1
C:\Users\xxx\.gradle

5.2 Project对象:每个build.gradle都对转换成一个Project对象

println(project.rootDir)
println(project.projectDir)

//-------------------------
//执行结果
D:\Projects\MyApp
D:\Projects\MyApp\utillib  

5.3 Setting对象:setting.gradle会转换成一个Setting对象

  • 以Android项目为例进行介绍 假设项目结构抽象后如下所示:
MyApp                     (Root Project)
  |
  |——app                  (module 1)
  |   |——build.gradle
  |
  |——utillib              (module 2)
  |   |——build.gradle
  |
  |——build.gradle
  |——settings.gradle
  |——gradle.properties
  |——gradle-wrapper.gradle

从上面的结构可以看出,Root Project中包含两个子project,分别为app和utillib。

  • build.gradle:每个Project均需要一个build.gradle文件
  • settings.gradle:告诉Root Project这个项目中一个包含几个子Project
include ':app', ':utillib'

使用gradle命令查看

# 命令
gradlew projects

# 结果
> Task :projects

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'MyApp'
+--- Project ':app'
\--- Project ':utillib'

6、补充:

6.1 subprojects和allprojects

在rootProject中可以对一个childProject进行统一的配置:subprojects和allprojects

  • allprojects是对所有project的配置,包括Root Project。
  • subprojects是对所有Child Project的配置
  • buildscript
buildscript {

  repositories {
      google()
      jcenter()

    }
    dependencies {
      classpath 'com.android.tools.build:gradle:3.4.2'
    }
  }

6.2 release和snapshot区别

  • Snapshot版本代表不稳定、尚处于开发中的版本,快照版本。(理解为抢先版)

  • Release版本则代表稳定的版本,发行版本。

  • 生成release版本的aar: 再AS的Terminal中输入命令 gradlew assembleRelease

6.3 使用 idea + Gradle 构建项目,出现乱码

方法一:

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

方法二: 在idea中,Help - Edit Custom VM Option 增加配置

-Dfile.encoding=UTF-8

此文件所在路径为:C:\Users\xxxxx\AppData\Roaming\JetBrains\IntelliJIdeaxxxxx

方法三: 在在idea中,File--Settings--file Encodings 设置编码格式