1. Settings
讲到settings
那就得先了解 gradle 构建过程
gradle
的构建过程分为三部分:初始化阶段、配置阶段、执行阶段。
-
初始化阶段
由
settings.gradle
发起,确定每一个build.gradle
,也就是与之对应的Project
实例,最终形成一个项目的层次结构。而一个settings.gradle
脚本对应的是Settings
对象// org.gradle.api.initialization public interface Settings extends PluginAware,ExtensionAware{ String DEFAULT_SETTINGS_FILE = "settings.gradle"; ... Gradle getGradle(); ... }
// settings.gradle // 在 Gradle 的构建过程中添加各个生命周期节点监听 gradle.addBuildListener(new BuildListener(){ //... })
-
配置阶段
执行各module下的
build.gradle
,完成project的配置,同时会构造Task的任务依赖关系,该阶段的代码通常包含3个部分:build.gradle、闭包、Task中的配置语句。另外执行任何gradle命令,初始化阶段和配置阶段的代码都会被执行 -
执行阶段
根据各Task依赖关系创建一个有向无环图,可以通过
gradle.getTaskGraph()
来获取
2. Project
每一个build.gradle
脚本都会被编译器编译成 Project ,所以我们在 build.gradle 中所写的一切逻辑都是 Project 类内进行的
2.1 常用 project API
-
getAllprojects
:获取所有 project 的实例 -
getSubprojects
:表示获取当前工程下所有子工程的实例 -
getRootProject
:在任意 build.gradle 文件获取当前根目录 project 实例 -
project
:表示的是指定工程的实例,然后在闭包中对其进行操作 -
allprojects
:配置当前 project 及其旗下的每一个子 project -
subprojects
:配置当前 project 下的所有子 project// root -> build.gradle def getSubProjects(){ println("========== start ================") def it = getAllprojects().iterator() it.forEachRemaining({ println("it:$it") }) println '' def it2 = getSubprojects().iterator() it2.forEachRemaining({ println("it:$it") }) println "" def rootProjectName = getRootProject().name println "rootProject:$rootProjectName" println "" project("app"){ println "it:$it" } println '' allprojects { repositories { println 'maven mavenCentral' } } println '' subprojects { println 'subprojects' } println("========== end ================") } getSubProjects() /* 通过执行gradlew clean命令验证 > Configure project : ========== start ================ it:root project 'timer' it:project ':app' it:project ':app' rootProject:timer it:project ':app' maven mavenCentral maven mavenCentral ========== end ================ */
2.2 project 属性
一共有7个,但是 gradle 给我们提供 ext
关键字自定义扩展属性
// org.gradle.api
public interface Project extends Comparable<Project>,ExtensionAware,PluginAware{
String DEFAULT_BUILD_FILE = "build.gradle";
String PATH_SEPARATOR = ":";
String DEFAULT_BUILD_DIR_NAME = "build";
String GRADLE_PROPERTIES = "gradle.properties";
String SYSTEM_PROP_PREFIX = "systemProp";
String DEFAULT_VERSION = "unspecified";
String DEFAULT_STATUS = "release";
...
}
ext 自定义扩展属性
ext {
compileV = 5
version = [
compileV : 27,
buildToolV: "28.0.3"
]
}
def getProjects() {
println("========== start ================")
println "${ext.compileV}"
println "${ext.version.compileV}"
ext.version.each { k, v ->
println "$k - $v"
}
println("========== end ================")
}
/*
通过执行gradlew clean命令验证
> Configure project :
========== start ================
5
27
compileV - 27
buildToolV - 28.0.3
========== end ================
*/
还有一种实际用处,可以参考链接中的 6、更加智能化的现在,使用方法调用的形式做依赖;
另外还可以在 gradle.properties
下自定义扩展属性,对于其它 gradle 文件可以全局引用这类属性
// gradle.properties
mCompileVersion=27
// root-> build.gradle
def test(){
println mCompileVersion
}
2.3 文件相关 API
在 gradle 中,文件相关 API 可以总结为两类:路径获取、文件操作
// root -> build.gradle, 路径获取
def path(){
println "${rootDir.absolutePath}"
println "${buildDir.absolutePath}"
println "${projectDir.absolutePath}"
}
/*
> Configure project :
F:\gitlab\timer
F:\gitlab\timer\build
F:\gitlab\timer
如果是 app -> build.gralde,则输出为:
> Configure project :app
F:\gitlab\timer
F:\gitlab\timer\app\build
F:\gitlab\timer\app
*/
输出文件内容 file.text
def test(){
def mFile = file("config.gradle")
// groovy-3.0.7.jar\org\codehaus\groovy\runtime\ResourceGroovyMethods.getText(File fie)
println mFile.text
}
/*
> Configure project :
ext {
android = [
applicationId: "com.monk.timer.test",
innerVersion : "KA",
versionCode : 7,
versionName : "v0.1.2"
]
}
*/
文件拷贝
copy {
println 'copy start '
// 既可以拷贝文件,也可以拷贝文件夹
from file("config.gradle")
into "univ"
exclude {
// 排除不需要拷贝的文件
}
rename {
// 对拷贝过来的文件进行重命
"test.gradle"
}
println 'copy end '
}
/*
univ
- test.gradle
*/
遍历文件
fileTree("gradle/wrapper"){
it.visit {FileTreeElement fileTreeElement ->
println("${fileTreeElement.file.name}")
}
}
/*
> Configure project :
gradle-wrapper.jar
gradle-wrapper.properties
*/
2.4 其它API
buildScript
:配置项目核心依赖
// root -> build.gradle
// 我们平时见到的都是简化过的版本,以下是未简化版本
buildscript {RepositoryHandler it->
it.google()
it.mavenCentral()
// 访问本地私有maven库
it.maven {
name "personal"
url "http://localhost:80800:/xx/repositories"
credentials{
username("monk")
password("123456")
}
}
dependencies {DependencyHandler dh ->
// 配置 gradle 工程的插件依赖
dh.classpath "com.android.tools.build:gradle:7.0.2"
}
}
app/build.gradle/dependencies
:为应用程序添加三方依赖,而根目录下的dependencies
是用来配置gradle 插件依赖
// app -> build.gradle
dependencies {
implementation("com.github.bumptech.glide:glide:4.14.2"){
exclude module: 'support-v4'
// 关闭传递依赖,默认也是关闭
transitive false
}
}