gradle

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

2020-06-02  本文已影响0人  NoBugException

当新建一个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()
}

[本章完...]

上一篇下一篇

猜你喜欢

热点阅读