美文网首页gradle
Android之Gradle<第三篇>:Gradle构建脚本基础

Android之Gradle<第三篇>:Gradle构建脚本基础

作者: NoBugException | 来源:发表于2020-06-02 20:23 被阅读0次

    当新建一个Android Studio项目后,会自动生成一些Gradle配置文件,了解Gradle构建脚本是学习Gradle的必要知识之一。

    [Settings 文件]

    图片.png

    上图是Android工程的的目录结构,在根目录下有一个非常重要的文件settings.gradle,这个文件称为设置文件,设置文件大多数的作用都是为了配置子工程,也就是Module。

    Android工程支持多Module,如果项目中存在app、app1、app2、app3、app4、app5这几个Module,那么需要在设置文件中配置这几个Module,配置方式可以是:

    图片.png

    也可以这么配置

    图片.png

    如果某个Module用不到,可以不要配置这个Module。

    接下来,看一下以下项目结构

    图片.png

    默认情况下,Module文件夹的位置都在项目的根目录,那么,有没有办法调整Module在项目中的路径呢?

    答案是:有的

    为了优化工程结构,我们会将一些业务层的Module单放入一个文件夹中,在项目的根目录下新建一个名称为business的文件夹,将app1app2app3app4app5放入到business文件夹中,在设置文件中,重新执行Module的目录,配置代码如下:

    include ':app'
    include ':app1'
    project(':app1').projectDir = new File(rootDir, 'business/app1')
    include ':app2'
    project(':app2').projectDir = new File(rootDir, 'business/app2')
    include ':app3'
    project(':app3').projectDir = new File(rootDir, 'business/app3')
    include ':app4'
    project(':app4').projectDir = new File(rootDir, 'business/app4')
    include ':app5'
    project(':app5').projectDir = new File(rootDir, 'business/app5')
    

    当然,如果不指定Module的路径,那么默认就是根目录。

    [Build文件]

    我们都知道,使用工具创建一个Android工程,会默认构建一个项目,那么构建项目的入口在哪里呢?

    在项目的根目录下找到文件build.gradle,这个一个工程的Build文件,这个文件是构建项目的起始点。

    先来看一下Build文件的代码

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.0.0"
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    buildscript: 主要功能是下载并引用一些插件

    buildscript {
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.0.0"
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    

    dependencies代码块中主要放置一些项目必要的插件,当新建项目时,必然会默认加载一个gradle插件

    classpath "com.android.tools.build:gradle:4.0.0"
    

    当前gradle的插件版本是4.0.0。

    当然,也可以自定义一个插件,将自定义的插件放入dependencies代码块中加载。

    repositories代码块决定了插件下载的远程仓库,先从google仓库中下载,如果google仓库中找不到对应的插件,那么会在jcenter仓库中寻找对应的插件。

    allprojects: 主要功能是下载所有Module下的依赖

    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    

    allprojects对应着所有Module下的依赖,repositories代码块指定了那些依赖下载的地址。

    这里,有一个闭包的概念,所有,如果在闭包上添加小括号是没有语法错误的,代码如下:

    buildscript ({
        repositories ({
            google()
            jcenter()
        })
        dependencies ({
            classpath "com.android.tools.build:gradle:4.0.0"
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        })
    })
    
    allprojects ({
        repositories ({
            google()
            jcenter()
        })
    })
    

    构建一个Android工程,会执行大量的任务(task),出了一些自带的task之外,还以自定义协议task,可以将自定义task放在Build文件来执行,代码如下:

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {
      //...
    }
    
    allprojects {
      //...
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    task test1{
        println 'test1'
    }
    
    task test2{
        println 'test2'
    }
    
    task test3{
        println 'test3'
    }
    
    task test4{
        println 'test4'
    }
    
    task test5{
        println 'test5'
    }
    

    [Projects和Tasks]

    学习Gradle必须要理清楚Projects和tasks的概念,我们都知道,一个Android项目,由若干个Module组成,这些Module就是Projects,然而,每个Project的构建都是由多个Task来构建的,Task是一个命令,或者说是一个操作,由于一个Project是由多个Task来构建的,所以可以理解为多个Task就是一个Project

    [创建一个新的任务]

    方法一:

    task test{
        doLast {
            println 'doLast'
        }
    
        doFirst {
            println 'doFirst'
        }
    }
    

    方法二:

    tasks.create('test'){
        doLast {
            println 'doLast'
        }
    
        doFirst {
            println 'doFirst'
        }
    }
    

    补充:doFirst优先被执行,doLast最后被执行。

    [任务依赖]

    task test1{
        println 'test1'
    }
    
    task test2(dependsOn: test1){
        println 'test2'
    }
    

    以上代码的意思是:test2依赖于test1,所以在执行test2之前必然会执行test1。

    [自定义属性]

    定义一个属性:

    ext.aa = 1
    

    定义多个属性:

    ext{
        age = 18
        name = 'zhangsan'
    }
    

    还可以使用sourceSets定义属性,代码如下:

    sourceSets {
        main{
            resourcesDir = 'main/res'
        }
        test{
            resourcesDir = 'test/res'
        }
    }
    
    task testC{
        sourceSets.each {
            println "${it.name}的resourcesDir是:${it.resourcesDir}"
        }
    }
    

    [脚本即代码,代码也是脚本]

    在Build文件中可以使用Groovy语言,比如使用Groovy语言定义一个方法,代码如下:

    def function() {
        def sum = 1+2
        println sum
    }
    
    task testD{
        function()
    }
    

    [本章完...]

    相关文章

      网友评论

        本文标题:Android之Gradle<第三篇>:Gradle构建脚本基础

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