Android Gradle构建脚本基础(三)

1. settings.gradle文件

位于项目根目录下,用于项目的配置,常见的是配置子工程。可以类比认识,根工程对应AndroidStudio项目中的Project,子工程对应Module。
一个子工程只有在setting.gradle中配置了,才能够被识别,构建的时候才会被包含进去。

rootProject.name = "GradleGuide"

include ':app'

include ':demo'
project(":demo").projectDir=new File(rootDir,"demo")
//rootDir的路径为xxx/xxx/xxx/GradleGuide

rooDir项目的根目录。
project(“:demo”).projectDir=new File(rootDir,“demo”)
此行代码是给子工程demo指定路径。非必需,如果不指定,默认为include ':demo"中demo同级的目录。

2. build.gradle文件

每个Project都有一个build.gradle文件,作为构建的入口。在这个文件中可以配置版本,插件,依赖库等。
对于Root Project也会有一个build.gradle文件,在这个文件中可以获取到所有的Child Project,并对他们进行统一的配置,例如应用的插件,Maven库等。

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.1.3"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"

    }
}
allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            url "https://oss.sonatype.org/content/groups/staging"
        }
    }
}

subprojects {
    repositories {
        google()
        mavenCentral()
    }
}

allprojects:对所有的Projet进行配置。
subprojects:对所有的子Project进行配置。

3.Project

Project直译就是项目,在Gradle中会有很多Project,例如在一个Android项目中,有根工程,有module,module又分Application和Library。其实它们都可以理解为是Project,只不过根工程是rootProject,而Module是Project,但实际上都可以理解为是Project。
Android Gradle构建脚本基础(三)_第1张图片

task printProjects {
    println "------rootProject------"
    println rootProject.toString()
    println "------rootProject.getRootProject()------"
    println rootProject.getRootProject().toString()
    println "------rootProject.getChildProjects()------"
    def childProjects = rootProject.getChildProjects()
    childProjects.each {
        println "key=${it.key},value=${it.value}"
    }
}

输出结果:

------rootProject------
root project 'GradleGuide'
------rootProject.getRootProject()------
root project 'GradleGuide'
------rootProject.getChildProjects()------
key=app,value=project ':app'

通过代码输出结果与工程截图对比可以发现,RootProject是GradleGuide,子Project是app。
Project下有很多属性和方法,这里只是简单的使用了两个。

4.Task

Task可以理解为是Gradle的一个执行单元,一个操作,也可以理解为是Project的一个属性。创建一个任务和定义一个Project的变量一样,变量名就是任务名。类型为Task(org.gradle.api),所以可以通过任务名来时使用Task的API来进行访问和控制。

4.1Task创建

4.1.1 通过task创建
task sayHi{
    println "Hello World"
}
task testTask {
    project.sayHi
}

输出结果:

Hello World

可以看到定义两个task,sayHi,testTask,在testTask中通过project.sayHi的形式来调用。所以把Task理解为Project的一个属性也是没有问题的。
Android Gradle构建脚本基础(三)_第2张图片可以看到创建任务的task并不是一个关键字而是一个方法。

4.1.2通过TaskContainer对象tasks创建
tasks.create("testTasks"){
    println "testTasks"
}

输出结果:

testTasks

4.2 任务依赖

任务依赖可以使用dependsOn方法来实现,可以接受多个依赖的任务作为参数。
DependsOn

task beforeSayHi {
    doLast {
        println "beforeSayHi"
    }
}
task sayHi(dependsOn:beforeSayHi) {
//    dependsOn beforeSayHi
    doLast {
        println "sayHi"
    }
}

输出结果:

> Task :beforeSayHi
beforeSayHi

> Task :sayHi
sayHi

4.3任务控制

通过任务名进行任务的操作需要先声明,其原理是:Project在创建任务的时候,同时会把任务注册为Project的一个属性,类型是Task。可以通过project.hasProperty方法来验证。

def Task taskOne = task(taskOne) {

}
taskOne.doFirst {
    println "taskOne-doFirst"
}
taskOne.doLast {
    println project.hasProperty("taskOne")
    println "taskOne-doLast"
}

task sayHi {
}
sayHi.doFirst {
    println "sayHi-doFirst"

}
sayHi.doLast {
    println project.hasProperty("sayHi")
    println "sayHi-doLast"
}

task entrance{
    dependsOn taskOne,sayHi
}

输出结果:

> Task :sayHi
sayHi-doFirst
true
sayHi-doLast

> Task :taskOne
taskOne-doFirst
true
taskOne-doLast

4.4自定义属性

Project和Task都支持添加自定义属性。可以通过ext属性来进行添加和访问,设置多个属性可以使用ext代码块。

其实可以在四个文件中定义:

  • settings.gradle
  • build.gradle(root)
  • build.gradle(module)
  • 自定义gradle文件
文件名称 定义方式 访问方式 作用域
settings.gradle gradle.ext或gradle.ext{} gradle.ext.xxx all
build.gradle(root) ext或ext{} rootProject.ext或$(只在当前project有效) build.gradle(root,module,自定义)
build.gradle(module) ext或ext{} project.ext或$(只在当前project有效) build.gradle(module)
自定义gradle 同root,module 同root,module 同root,module
在settings.gradle文件中定义
//settings.gradle文件
rootProject.name = "GradleGuide"

include ':app'

gradle.ext.settings="settings"
gradle.ext{
    fileName="settings.gradle"
}
RootProject:build.gradle文件
task printSettingsExt{
    println gradle.ext.settings
    println gradle.ext.fileName
}

输出结果:

settings
settings.gradle
在build.gradle(root)文件中

在其它Project的build.gradle可以通过rootProject,ext.xxx来进行访问。

apply from:"version.gradle"

ext.name123="kylp"
ext.set("age",20)
ext{
    city="北京"
}

task testExt{
    println "name=$name123"
    println "go=$go"
    println rootProject.ext.name123
    println rootProject.ext.age
    println rootProject.ext.find("city")
    println rootProject.hasProperty("name123")
}

其中versionl.gradle为自定义新建的gradle文件。
version.gradle文件

ext.go="gogogoggogo"

输出结果:

name=kylp
go=gogogoggogo
kylp
20
北京
true
在build.gradle(module)文件中
ext.paramInAppModule="app"

task printExt {
    println "$paramInAppModule"
    println project.ext.paramInAppModule
}

输出结果:

app
app
在自定义xxx.gradle文件中

同build.grad(root,module)文件。

不同build.gradle属性获取

在build.gradle(module)中获取build.gradle(root)定义的属性使用rootProject.ext.xxx。

你可能感兴趣的:(Android,Gradle,gradle,android,android,studio)