快捷搜索:  汽车  科技

gradle需要学习吗(Gradle概述以及生命周期)

gradle需要学习吗(Gradle概述以及生命周期)在android工程中,所有的lib module都是一个project在gradle中,project就好像是android中的activity一样,经常使用,所以project概述是一个很重要的概念Gradle生命周期分为三个部分,如下:在root build.gradle中,添加如下代码/** * 配置阶段开始前的监听回调 */ this.beforeEvaluate { println '配置阶段开始111...' } /** * 配置阶段后的监听回调 */ this.afterEvaluate { println '配置阶段执行完毕222...' } /** * gradle执行完毕后的回调 */ this.gradle.buildFinished { println '执行阶段执行完毕...'

1 gradle是一种编程框架

gradle主要由以下三部分组成

  • 1 groovy核心语法
  • 2 build script block
  • 3 gradle api

注:本章所有的代码都在 https://github.com/jiulu313/gradledemo.git

如下图

gradle需要学习吗(Gradle概述以及生命周期)(1)

2 Gradle的优势
  • 1 更加的灵活,因为gradle是编程框架,所以功能要强大的多
  • 2 粒度性上,源码的编译,资源的编译,都是一个一个Task的,我们可以修改task来达到精细控制上
  • 3 扩展性上,gradle有插件机制

以上所有的优势其实全因为Gradle是一种编程框架

3 Gradle的生命周期

Gradle生命周期分为三个部分,如下:

  • 1 初始化阶段: 解析整个工程中所有Project 构建所有的Project对应的project对象,这个阶段主要就是解析setting.gradle文件
  • 2 配置阶段:解析所有的projects对象中的task,构建好所有的task拓扑图,主要解析各个project下的build.gradle文件
  • 3 执行阶段:执行具体的的task及其依赖task
    如下图

gradle需要学习吗(Gradle概述以及生命周期)(2)

4 Gradle的生命周期的监听

在root build.gradle中,添加如下代码

/** * 配置阶段开始前的监听回调 */ this.beforeEvaluate { println '配置阶段开始111...' } /** * 配置阶段后的监听回调 */ this.afterEvaluate { println '配置阶段执行完毕222...' } /** * gradle执行完毕后的回调 */ this.gradle.buildFinished { println '执行阶段执行完毕...' } //等同于 beforeEvaluate this.gradle.beforeProject { } //等同于 afterEvaluate this.gradle.afterProject { println '配置阶段执行完毕333...' }

然后运行 ./gradlew build 就会输出相应的log

5 Project详解

在gradle中,project就好像是android中的activity一样,经常使用,所以project概述是一个很重要的概念

在android工程中,所有的lib module都是一个project

查看所有的project

./gradlew projects //输出如下 ------------------------------------------------------------ Root project ------------------------------------------------------------ Root project 'gradledemo' --- Project ':app' --- Project ':mylib' --- Project ':test' \--- Project ':utils'

可以看到当前工程下有5个 proejct,其中有一个根 project,剩下的4个是子project 可以看到project是树的结构,根project的作用就是用来管理子project
如何管理呢?就是通过相应的api进行管理,后面有讲到。每个project都对应一个输出

每个project都有一个build.gradle文件,build.gradle文件也是project的标识

5.1 Project核心api

  • 1 gradle 生命周期api
  • 2 project相关api
  • 3 task相关api
  • 4 属性相关api
  • 5 file相关api
  • 6 其它api

在gradle中,一个build.gradle文件会被编译成proejct字节码,所以在build.gradle中编写的所有的代码相当于都是在proejct中类内部编写的

输出所有的proejct

//在根project下的build.gradle中,获取所有的project,添加如下代码 //调用方法 getProjects() //获取所有的project def getProjects(){ println '------------' println 'Root Project' println '------------' //getAllprojects()返回所有的Project的set集合 this.getAllprojects().eachWithIndex { Project project int index -> if(index == 0){ println "Root protject :'${project.name}'" }else{ println " --- project '${project.name}'" } } } //运行 ./gradlew clean 输出如下: ------------ Root Project ------------ Root protject :'gradledemo' --- project 'app' --- project 'mylib' --- project 'test' --- project 'utils'

输出所有的子project

//在根project的build.gradle中,输出所有的子prject //打印所有的子project getAllSubprojects() def getAllSubprojects(){ getSubprojects().each { project -> println "---- ${project.name}" } } //输出 ---- app ---- mylib ---- test ---- utils


获取父project的名字

//获取根project的名字,在根project中调用返回null 在子project下调用打印出父project的名字 getParentProjectName() def getParentProjectName(){ def project = getParent() if(project != null ){ println "父project的名字是: " project.name }else { println '没有父project' } }

获取根project的名字

getRootPro() def getRootPro(){ println "根project的名字是:" getRootProject().name } //运行 ./gradlew clean ,输出: 根project的名字是:gradledemo

在根project对子project进行配置

/** * 可以在根project下对所有的子project进行配置,如下代码 * 任何在子project中的build.gradle文件中可以配置的东西 * 都可以在下面的代码中进行配置 */ project("app") { apply plugin: 'com.android.application' group 'com.zhj' version '1.0.0' dependencies { } android { } } project('mylib') { apply plugin: 'com.android.library' group 'com.zhj' version '1.1.1' dependencies { } }

为所有的project进行统一的配置

/** * 配置当前结点工程和它的所有的所有的subproject * 比如将所有的project的group配置为 'com.zhj' */ allprojects { repositories { google() jcenter() } group 'com.zhj' } //测试在allprojects中配置的group属性 println "test工程的group是 : " project('test').group //输出 test工程的group是 : com.zhj

只对子project进行配置

/** * 和allprojects不同的是,subprojects不包括当前工程,只包括子project */ subprojects { Project project -> if(project.hasProperty('com.android.library')){ //将库工程编译的库上传到maven中 } }

gradle 中对project的管理是以树的形式进行管理的,根project主要就是对子Project进行管理,可以查找,可以获取所有的子project,同时在子project中也可以获取根proejct或者父project的信息。同时,一个project对应于一个build.gradle文件,build.gradle文件也是判断是不是project的标志。project是很重要的概念,下面是官方的文档
https://docs.gradle.org/current/userguide/userguide.html#using_existing_gradle_builds

猜您喜欢: