Gradle学习(二):你应该记住的Gradle

437 阅读3分钟

Gradle是基于Groovy语言的DSL,用于项目构建。与Ant和Maven相比的优势在于本身是一门语言,可以做一些特定逻辑,灵活许多

Gradle生命周期

Gradle生命周期分为三个阶段: 1.初始化阶段:生成project对象

2.配置阶段:生成task对象,并完成task拓扑图

3.执行阶段:执行任务以及依赖的所有任务

生命周期相关API:

//配置阶段开始前
this.beforeEvalute{
	//doSomething
}
//配置阶段完成后,即生成了task拓扑图后
this.afterEvalute{
	//doSomething
}
//gradle执行完成后,task执行完后
this.gradle.buildFinished{	
	//doSomething
}
//等同于this.beforeEvaluate
this.gradle.beforeProject{}
//等同于this.afterEvaluate
this.gradle.afterProject{}
//初始化阶段
setting.gradle文件脚本内容即是在初始化阶段执行的

Project

AndroidStudio中每个Module就是Project,每个Module都有相应的build.gradle文件

Project相关API

//获取所有Project
this.getAllProjects()
//获取所有子Project
this.getSubProjects()
//获取根Project
this.getRootProject()
//获取父Project
this.getParent()
根据路径获取Project
project('app') {
Project project -> 
	println project.name
	apply plugin: 'com.android.application'
	android{
		//相关配置
	}
}

//配置所有Project
allprojects {
	//配置所有project
	group 'com.breeze'
	version '1.0.0'
}
subprojects {
	apply from 'common.gradle'
}
//判断是否是库工程
project.plugins.hasPlugin('com.android.library')

Project属性相关API

每个Project都有一个ext可以存放自己定义的属性

写法

ext {
	Version = '1.0.0'
	compileVersion = 28
}
脚本中使用ext.Version即可

注意点:根Project的属性默认子Project是继承的,于是当要给所有的project配置属性时,只需要在根Project配置即可 项目中使用,可以将配置抽取到一个文件中,再在根Project中引进该文件 如android中将配置抽取到common.gradle

ext {
    android = [
            compileSdkVersion : 28,
            applicationId : "com.sq.sqpackartifact",
            minSdkVersion : 19,
            targetSdkVersion: 28,
            versionCode: 1,
            versionName: "1.0"
    ]

    libs = [
            kotlinStdLib : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",
            supportAppCompatLib : "com.android.support:appcompat-v7:28.0.0",
            okhttpLib : "com.squareup.okhttp3:okhttp:3.12.0",
            okhttpLogLib: 'com.squareup.okhttp3:logging-interceptor:3.8.1',
            gsonLib : "com.google.code.gson:gson:2.8.5",
            retrofitLib : "com.squareup.retrofit2:retrofit:2.5.0",
            retrofitRxJavaLib : "com.squareup.retrofit2:adapter-rxjava:2.5.0",
            retrofitGsonLib : "com.squareup.retrofit2:converter-gson:2.5.0",
            rxAndroidLib : "io.reactivex:rxandroid:1.2.1",
            rxKotlinLib : "io.reactivex:rxkotlin:1.0.0"
    ]
}

根project中引入该文件

apply from: 'common.gradle'

子project中使用:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation rootProject.ext.libs.kotlinStdLib
    implementation rootProject.ext.libs.supportAppCompatLib
    //okhttp
    implementation rootProject.ext.libs.okhttpLib
    implementation rootProject.ext.libs.okhttpLogLib

    //gson
    implementation rootProject.ext.libs.gsonLib
    //retrofit
    implementation rootProject.ext.libs.retrofitLib
    implementation rootProject.ext.libs.retrofitRxJavaLib
    implementation rootProject.ext.libs.retrofitGsonLib
    //rx
    implementation rootProject.ext.libs.rxAndroidLib
    implementation rootProject.ext.libs.rxKotlinLib
    //download
    implementation project(path: ':download')
}

Task

定义Task

方法一:

    task helloTask(group:'breeze', description:'task study') {
        println 'hello'
    }

上述实际上是调用了task('taskName', closure)创建task 方法二: tasks是TaskContainer,是task的管理类,上面定义task的方式实际上也是由TaskContainer管理的

    this.tasks.create(name: 'helloTask2') {
        setGroup('breeze')
        setDescription('task study'')
        println 'i am task'
    }
Task生命周期
task A {
    println 'task a config'
    doFirst {
        println 'task a doFirst'
    }
    doLast {
        println 'task a doLast'
    }
}

上述代码中的执行顺序是 config->doFirst->doLast这样,并且config是在project的生命周期的第二个步骤配置task时执行的

Task依赖

在这里插入图片描述 图中是执行build命令时gradle执行的一系列task 达到该效果,需要使用task的DependsOn方法 使用dependsOn方法给A任务添加依赖task B,在执行A时就会先执行B

task A(dependsOn:'B') {
	doLast {
        println 'task a execute'
	}
}

task B {
	doLast{
		println 'task b execute'
	}
}
//也可以写成
task A {
    doLast {
        println 'task a execute'
	}
}

task B {
    doLast{
		println 'task b execute'
	}
}

project.afterEvaluate {
    tasks.getByName('A').dependsOn('B')
}

另外和依赖相关的还有两个方法,mustDoAfter, ShouldDoAfter,和DependsOn不同的是这两个只是影响执行顺序

task A {
    doLast {
        println 'task a execute'
    }
}

task B {
    shouldRunAfter 'A'
    doLast {
        println 'task b execute'
    }
}

任务A,B仍然可以单独执行,并不会因为shouldRunAfter而在执行B时先去执行A 但当任务都进行时,执行顺序就会变化了,无论是执行gradlew A B还是执行gradlew B A都是先执行A再执行B的 mustRunAfter和shouldRunAfter作用基本一致,唯一的不同点是,当任务循环时,shouldRunAfter要求没那么严格,可以忽略