美文网首页android基础知识
Gradle系列之三 Gradle概述以及生命周期

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

作者: jiulu | 来源:发表于2018-11-24 12:08 被阅读9次

    1 Gradle是一种编程框架

    gradle主要由以下三部分组成

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

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

    如下图


    image.png

    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
      如下图


      image.png

    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系列之三 Gradle概述以及生命周期

        本文链接:https://www.haomeiwen.com/subject/vigeqqtx.html