Gradle基础知识

Gradle中的依赖方式有以下几种:

  • implementation
  • api (相当于Gradle3.0之前compile)
  • compileOnly (相当于Gradle3.0之前provided )
  • runtimeOnly(相当于Gradle3.0之前apk)

其中implementation和api在前面可以加上debug,release或者test声明,例如debugApi

详细说明:

  • 使用implementation依赖可以减少构建时间,例如Module A implementation Module B,Module B implementation Module C,此时A无法引用中的内容。当C发生改变时,A不需要重新编译。
  • 使用api的依赖,还是上面的例子,A可以引用C中的内容。
  • compileOnly的依赖只有编译时可以用,不会打包到apk(注释处理器等)
  • runtimeOnly的依赖编译时不可用,会打包到apk

基本语法

第一手资料 Groovy API,Gradle Doc

下面列出几个常用的和Java区别比较大的:

  • with,给对象赋值
obj.with {
   name = "android"
   phone= "145555555"
}
  • 和python相似的判断true或false
if (str) { }
  • kotlin相似的判空
obj?.setData()
  • 使用each遍历Map或List
map.each {
   println "map:[${it.key} : ${it.value}]"
}
  • XmlParser解析Xml
def xml = new XmlParser().parse(new File("test.xml"))
// 访问view节点的name属性
println xml['view'].@name[0]
  • 在android studio中直接运行Groovy,使用命令gradlew test
task(test).doLast {
    println "start execute yuangshuo"
    getString()
}

def getString() {
}

更多基础语法:
Groovy快速入门指南
Gradle脚本基础全攻略

Gradle生命周期和执行顺序

Gradle的生命周期分为3个阶段:Initialization、Configuration和Execution

  1. 首先解析settings.gradle来获取模块信息(Initialization阶段)
  2. configure项目中top-level的build.gradle,然后configure每个module的build.gradle,配置的时候并不会执行task,一个module执行configure结束会执行project.afterEvaluate(Configuration阶段)
  3. 按configure顺序执行(Execution阶段)
// 打印日志顺序
setting##init
top-level##init
app##init
app##afterEvaluate
common##init
app##task

详细学习:Gradle基础 - 构建生命周期和Hook技术

常用Api

定义Task
  • 第一种方式
task myTask {
    println "config myTask"
}

myTask.doLast {
    println "after execute myTask"
}

myTask.doFirst {
    println "before execute myTask"
}

执行一个task时,都会先执行task的配置,doFirst是在task开始执行之前,而doLast则是在执行后,两者都是在task配置之后执行的,因为执行任意一个task,都需要先配置一遍。每个task执行之前都需要进行一遍完整的配置。

  • 第二种方式
class MyTask extends DefaultTask {
    @TaskAction
    def hello() {
        println "Hello world."
    }
}
task taskname(type : MyTask)

@TaskAction表示task要执行的动作

  • 第三种方式
project.task('myTask').doLast {
    println "after execute myTask"
}
Task依赖
task taskA(dependsOn: 'taskB') {
    doLast {
        println 'taskA'
    }
}

task taskB {
    doLast {
        println 'taskB#1'
    }
}

taskB.doLast {
    println 'taskB#2'
}

执行gradlew taskA,打印结果

> Task :app:taskB 
taskB#1
taskB#2

> Task :app:taskA 
taskA

一个Task执行前先执行其依赖的Task,doFirst和doLast可以被执行多次

Gradle命令:

  • gradlew project:列出项目module名称
  • gradlew build:执行build操作
  • gradlew taskname:执行某个task
  • gradlew -x taskname:执行build操作但排除某个task
  • gradlew tasks:列出项目中所有任务
  • gradlew help –task taskname:显示某个task的详细信息

Gradle日志级别

  • Error 错误级别
  • Quiet 重要级别
  • Warning 警告级别
  • LifeCycle 进度信息
  • Info 信息性信息
  • Debug 调试信息

gradlew -q taskname 可以控制日志输出级别

你可能感兴趣的