Gradle系列之三 Gradle概述以及生命周期

九路 等级 595 0 0

1 Gradle是一种编程框架

gradle主要由以下三部分组成

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

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

如下图 Gradle系列之三  Gradle概述以及生命周期

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概述以及生命周期

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是很重要的概念,下面是官方的文档

gradle文档

收藏
评论区

相关推荐

Gradle技术之一 Groovy语法精讲
Gradle技术之一 Groovy语法精讲 gradle脚本是基于groovy语言开发的,想要学好gradle必须先要对groovy有一个基本的认识 1. Groovy特点 groovy是一种DSL语言,所谓的DSL语言,就是专门针对某一特定领域的语言,专精而不专广 是一种基于JVM的开发语言,也是编译成class字节码文件 结合和Pytho
Gradle技术之二 Groovy对文件的操作
Groovy对文件的操作 对文件的遍历 假设文件的原始内容为: hello,world 这里是北京 andorid and ios are good system 第一种方法:使用 eachLine() //1.1 new 一个File def file new File(filepath) //1.2 groovy对文件的遍历 file.
Gradle系列之三 Gradle概述以及生命周期
1 Gradle是一种编程框架 gradle主要由以下三部分组成 1 groovy核心语法 2 build script block 3 gradle api 注:本章所有的代码都在 https://github.com/jiulu313/gradledemo.git 如下图 73485499237410.png(https://img
Gradle技术之四 - Gradle的Task详解
1 Gradle的Task详解 1 Task定义和配置 2 Task的执行 3 Task的依赖和执行顺序 4 Task类型 5 Task结合gradle的生命周期 6 Task实战 1.1 Task定义和配置 1.1.1 查看所有的task java ./gradlew tasks 输出 Task :tasks
【Swift】Swift 2.0 到 Swift 3.0
问: 报错:The “Swift Language Version” (SWIFT\_VERSION) build setting must be set to a supported value for targets which use Swift. This setting can be set in the build settings editor
半小时掌握Android Gradle
目前国内对Android领域的探索已经越来越深,不少技术领域如插件化、热修复、构建系统等都对Gradle有迫切的需求,不懂Gradle将无法完成上述事情。所以Gradle必须要学习。 Gradle 里的几乎任何东西都是基于这两个基础概念: task project 掌握了这两个,你就掌握了一大半的 Gradle 知识了。 首先讲 Task
Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同?
开始之前 Composition API 可以说是Vue3最大的特点,那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发
Retrofit 动态修改BaseUrl 操作
开发中会遇到URL需要动态切换,若你还是通过gradle打包切换是否不太灵活,下面将介绍一下retrofit基于OKhttp中动态修改URL; 原理添加拦截器,在retrofit中的现实更加灵活了如下代码: language private RetrofitUrlManager() { if (DEPENDENCY_OKHTT
Kotlin 协程中,关于 runBlocking, launch ,withContext ,async,doAsync 之间的简单区别
引入大佬的话,Kotlin的协程,本质上是一个线程框架,它可以方便的切换线程的上下文(如主线程切换到子线程/子线程切回主线程)。而平时我们要想在Android Studio使用协程,先要在gradle引入协程依赖: implementation "org.jetbrains.kotlinx:kotlinxcoroutinescore:1.3.3"
Compose Weekly #4:Weather App
本文同步发表于我的微信公众号,在微信搜索 OpenCV or Android 即可关注。 前言 It's raining... Compose! Pull out all the stops for this final challenge. Build a beautiful weather app for a chance to win a Pixel
Javascript本地存储 - 入门指南
在讲解之前,我们需要明白之间的差别server side storage,并client side storage当涉及到网站和应用程序。服务器端意味着我们使用数据库将数据存储在服务器上,客户端包含JavaScript API,这些API可让您在客户端(在浏览器中)存储数据。什么是本地存储? 简而言之,local storage可以将其与数据库进行比较,只
(win环境)使用Electron打造一个桌面应用翻译小工具
初始化项目npm init 修改package.json "name": "trans", "version": "1.0.0", "main": "main.js", "license": "MIT", "scripts": "start": "electron .", "build":"electronpackager . ove
Spring Boot 无侵入式 实现RESTful API接口统一JSON格式返回
前言现在我们做项目基本上中大型项目都是选择前后端分离,前后端分离已经成了一个趋势了,所以总这样·我们就要和前端约定统一的api 接口返回json 格式,这样我们需要封装一个统一通用全局 模版api返回格式,下次再写项目时候直接拿来用就可以了 约定JSON格式一般我们和前端约定json格式是这样的json "code": 200, "message
【IDEA】实战,阿里二面被问到构建及二次开发,直接裂开!!
JMeter5.4.1源码IDEA构建&二次开发(实战) 1.下载源码 2.导入IDEA 2.1 先设置Gradle目录未设置过Gradle的IDEA,建议先设置下Gradle的用户目录 2.2导入JMeter工程 2.3设置国内Gradle源 设置gradle的下载源速度直接起飞!😂重新加载Gradle,或者重新加载项目接下来就是耐心的等等待,网速好的话,
个人博客开发之技术选型规划
项目技术1. SpringBoot2.4.7 技术栈2. MybatisPlus3.4.x ORM框架3. Mysql8.0 数据库4. IDEA 2021 开发工具5. Mac pro 电脑6. Redis 缓存7. Thymeleaf 模版引擎 项目架构1. 打算用现在最流行的架构模式,前后端分离,采用RESTful API 规范风格json api