1 Gradle是一种编程框架

gradle主要由以下三部分组成

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

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

如下图

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

    如下图

4 Gradle的生命周期的监听

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

  1. /**
  2. * 配置阶段开始前的监听回调
  3. */
  4. this.beforeEvaluate {
  5. println '配置阶段开始111...'
  6. }
  7. /**
  8. * 配置阶段后的监听回调
  9. */
  10. this.afterEvaluate {
  11. println '配置阶段执行完毕222...'
  12. }
  13. /**
  14. * gradle执行完毕后的回调
  15. */
  16. this.gradle.buildFinished {
  17. println '执行阶段执行完毕...'
  18. }
  19. //等同于 beforeEvaluate
  20. this.gradle.beforeProject {
  21. }
  22. //等同于 afterEvaluate
  23. this.gradle.afterProject {
  24. println '配置阶段执行完毕333...'
  25. }

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

5 Project详解

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

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

查看所有的project

  1. ./gradlew projects
  2. //输出如下
  3. ------------------------------------------------------------
  4. Root project
  5. ------------------------------------------------------------
  6. Root project 'gradledemo'
  7. +--- Project ':app'
  8. +--- Project ':mylib'
  9. +--- Project ':test'
  10. \--- 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

  1. //在根project下的build.gradle中,获取所有的project,添加如下代码
  2. //调用方法
  3. getProjects()
  4. //获取所有的project
  5. def getProjects(){
  6. println '------------'
  7. println 'Root Project'
  8. println '------------'
  9. //getAllprojects()返回所有的Project的set集合
  10. this.getAllprojects().eachWithIndex { Project project, int index ->
  11. if(index == 0){
  12. println "Root protject :'${project.name}'"
  13. }else{
  14. println "+--- project '${project.name}'"
  15. }
  16. }
  17. }
  18. //运行 ./gradlew clean,输出如下:
  19. ------------
  20. Root Project
  21. ------------
  22. Root protject :'gradledemo'
  23. +--- project 'app'
  24. +--- project 'mylib'
  25. +--- project 'test'
  26. +--- project 'utils'

输出所有的子project

  1. //在根project的build.gradle中,输出所有的子prject
  2. //打印所有的子project
  3. getAllSubprojects()
  4. def getAllSubprojects(){
  5. getSubprojects().each { project ->
  6. println "---- ${project.name}"
  7. }
  8. }
  9. //输出
  10. ---- app
  11. ---- mylib
  12. ---- test
  13. ---- utils

获取父project的名字

  1. //获取根project的名字,在根project中调用返回null,在子project下调用打印出父project的名字
  2. getParentProjectName()
  3. def getParentProjectName(){
  4. def project = getParent()
  5. if(project != null ){
  6. println "父project的名字是: " + project.name
  7. }else {
  8. println '没有父project'
  9. }
  10. }

获取根project的名字

  1. getRootPro()
  2. def getRootPro(){
  3. println "根project的名字是:" + getRootProject().name
  4. }
  5. //运行 ./gradlew clean ,输出:
  6. project的名字是:gradledemo

在根project对子project进行配置

  1. /**
  2. * 可以在根project下对所有的子project进行配置,如下代码
  3. * 任何在子project中的build.gradle文件中可以配置的东西
  4. * 都可以在下面的代码中进行配置
  5. */
  6. project("app") {
  7. apply plugin: 'com.android.application'
  8. group 'com.zhj'
  9. version '1.0.0'
  10. dependencies {
  11. }
  12. android {
  13. }
  14. }
  15. project('mylib') {
  16. apply plugin: 'com.android.library'
  17. group 'com.zhj'
  18. version '1.1.1'
  19. dependencies {
  20. }
  21. }

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

  1. /**
  2. * 配置当前结点工程和它的所有的所有的subproject
  3. * 比如将所有的project的group配置为 'com.zhj'
  4. */
  5. allprojects {
  6. repositories {
  7. google()
  8. jcenter()
  9. }
  10. group 'com.zhj'
  11. }
  12. //测试在allprojects中配置的group属性
  13. println "test工程的group是 : " + project('test').group
  14. //输出
  15. test工程的group com.zhj

只对子project进行配置

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

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

gradle文档

Gradle系列之三 Gradle概述以及生命周期的更多相关文章

  1. React 深入系列4:组件的生命周期

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...

  2. 【深入ASP.NET原理系列】--ASP.NET页面生命周期

    前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...

  3. maven系列(3)-maven生命周期的介绍

    1. 概述 Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",初学者容易将Maven的生命周期看成一个整体,其实不然.这三套生命周 ...

  4. Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!

    maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...

  5. Spring原理系列一:Spring Bean的生命周期

    一.前言 在日常开发中,spring极大地简化了我们日常的开发工作.spring为我们管理好bean, 我们拿来就用.但是我们不应该只停留在使用层面,深究spring内部的原理,才能在使用时融汇贯通. ...

  6. Spring系列13:bean的生命周期

    本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: ...

  7. react实战 系列 —— React 的数据流和生命周期

    其他章节请看: react实战 系列 数据流和生命周期 如何处理 React 中的数据,组件之间如何通信,数据在 React 中如何流动? 常用的 React 生命周期方法以及开源项目 spug 中使 ...

  8. Ninject之旅之三:Ninject对象生命周期

    摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...

  9. Servlet概述及其生命周期

    Servlet和传统CGI程序相比的优点:   1. 只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销 2. 如果多个请求需要做同样处理的时候,这时只需要加载一个类,这也大大降低了开 ...

随机推荐

  1. php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的

    原文呢:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict Onl ...

  2. android 内部文件读取

    Android 文件管理方法 Android使用的是基于Linux的文件系统,对于文件的訪问和管理是通过权限设置来限制的. 在Linux系统中,文件权限分别描写叙述了创建者.同组用户和其它用户对文件的 ...

  3. html5 式程序员表白

    html5 式程序员表白 王海庆 于 星期三, 04/06/2014 - 00:44 提交 今天是个好日子,2014年5月20日,表白的最佳时机,虽说孩子已经四岁.结婚已经五年.可是也不能够偷懒.于是 ...

  4. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  5. 深入理解JVM:HotSpot虚拟机对象探秘

    对象的创建 java是一门面向对象的语言.在Java程序执行过程中无时无刻有Java对象被创建出来.在语言层面上,创建对象(克隆.反序列化)一般是一个newkeyword而已,而在虚拟机中,对象的创建 ...

  6. busybox 终端支持 ctrl-r

    Busybox Settings ---> Busybox Library Tuning ---> [*] History saving [ ] Save history on shell ...

  7. 对JS闭包的理解

    闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确 ...

  8. HDU 6044 Limited Permutation 读入挂+组合数学

    Limited Permutation Problem Description As to a permutation p1,p2,⋯,pn from 1 to n, it is uncomplica ...

  9. Hadoop spark mongo复制集

    启动hadoop cd /usr/local/hadoop/hadoop $hadoop namenode -format # 启动前格式化namenode $./sbin/start-all.sh ...

  10. 在线安装Ganglia3.6.0,nginx+php搭建gweb,绝对通过

    环境:CentOS6.5 minimal 目标:安装Ganglia核心组件(gmond, gmetad, gmetric, gstat, libganglia).Ganglia web 准备 yum增 ...