Gradle 基础必知必会,一篇带你搞定

一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第5天,点击查看活动详情。

你的支持对我意义重大!

Hi,我是小彭。本文已收录到 GitHub Andrandroidstudio新建项目oid-NoteBook 中。这里有 Android 进阶成长路变量类型有哪些线笔记 & 博客,有志同道合的朋友,欢迎跟着我一起成长。(联系php货币方式在 GitHubandroid下载

前言

  • Gradle 作为官方主推的构建系统,目java面试题前已经深度应用于 Android 的多个技术体系中,例如组变量泵件化开发、产物构建、单元测试等。java语言

1. 认识 Gradle

Gradle 是一个项目构建工具,而不仅仅是一个语言或脚本。构建工具是指支持可重复、可持续生成交付产物的工具,例如 Ant、java是什么意思Maven 和 ivyphp是什么 也是历史演化过程中诞生的构建工具。

1.1 Gradle 的优缺点

相比于早期出现的构建工具,GrAndroidadjavascriptle 能够脱颖而出主要是以下优点:

  • 表达性的 DSL: Gradle 构建脚本采用基于 Groovy 的 DSL 领域特定语言javaee,而不是采用传androidstudio快捷键统的 XML 文件,这使得 Gradle 构建脚本相比其他构建系统更加简洁;
  • 基于 Java 虚拟机: Groovy 语言基于 Java 虚拟机,这使得 G变量与函数radle 支持用 Java / Kotlin 代码编写构建脚本,我们完全可以只学习一小部分 Groovy 语法就能变量英语上手 Gradle 脚本,这有助于降低 Gradle 的学习强度;
  • 约定优先于配置:androidstudio安装教程 Gradle 具有约定优先于配置的原则,即为属性提供默认值,这使得 Gradle 相比 Ant 等构建系统更容易上手。我们在开发 Gradle 插件时也需要遵循这一原则。

Gradle 也有明显的java环境变量配置缺点,例如:

  • 较弱的向后兼容性: Gradle 是一个快速java环境变量配置发展的工具,新版本经常会打破向后兼容性,有经验的同学就知道,一个工程在低版本 Gradle 可以编译,但换了新版本 Gradle 可能就编译不通变量泵过了。

1.2 Gradle 工程的基本结构

Android Stphp是什么udio 中创建新项目时,会自动生成以下与 Gradle 相关文件。这些大家都很熟悉了,简单梳理下各个文件的作用:

.
├── a-subproject
│   └── build.gradle
├── build.gradle
├── settings.gradle
├── gradle.properties
├── local.properties
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
  • settings.gradle 文件: 用于确定哪些模块参与构建;
  • 项目级 build.gradle 文件: 用于定义androidstudio简单程序所有子模块公共的配置参数;
  • 模块级 build.gradle 文件: 用于定义子模块的配置参数,它可以覆盖项目级 build.gradle 文件中定义的配置;
  • gradle/warpper: 负责自动下载安装项目所需的 Gradle 环境的脚本;
  • grandroidstudio线性布局adle.properties: 用作项目变量英语级 Gradle 配置项,会覆盖全局的配置项;
  • loandroidstudio安装教程cal.properties:android下载安装 用作项目的私有属性配置,例如 SDKjavaee 安装目录,一般不androidstudio打包apk把 local.prandroidstudio线性布局operties 加入版本控制。

1.3 Gradle 中的重要概念

  • Gradle: 一般是指 Gradle 的运行环境;
  • Gradle Daemon: 用于提升构建速度的后台进程;
  • Gradle Wjava语言rapper: 负责自动下载安装 Gradle 环境的脚本;
  • Gradandroid的drawable类le 插php是什么件: 插件本质上和 .grjava面试题adle 脚本没有区别,其实就是用模块化的方式将构建逻辑封装起来,我们熟悉的 Android 编译过程就是androidstudio简单程序 Android Gradle Plugin 提供的扩展能力;
  • GRADLE_USER_HOME:

~/.gradle/cachAndroide/dodules-2/files-2.1/包名/库名/版本号/hash字符变量是什么意思串/

  • Distribution
  • GradleUserHome
  • Projec变量泵t:变量值 在初始化构建过程时,Gradle 会为每个 buildphp是前端还是后端.gradle 文件实例化一个 Project 接口对象。我们在 .gradle 脚本中编写的代码,本质上可以理解为是在一个 Project 子类中编写的;
  • Task: 一个 Project 对象包含一个或多个 Task 对象,在配置阶段 Gradle 会将所有 Task 构建为变量之间的关系一个 DAG 有向无环图;
  • 源集(soujava怎么读r变量的定义ce set): 源集就是一起执行和编译的一组源文件,比如 Android 项目中 main 和 androidTest 是两个独立的源集。

1.4 Gradle Daemon

Gradle Daemonjavaee 是 Gradle 3.0 引入的构建优android平板电脑价格化策略,主要用于提升构建速度。 我们知道 Gradle 是运行在 Java 虚拟机上的程序,并且需要依赖各种第三方插件,因此 Gradle 的初始化时间并不低。

解决方javaee案是创建一个长时间变量名的命名规则存活的后android手机台进程 Daemon,由 Daemon 进程执行真正的构建流程。当构建结束后,Daemon 进程并不会立即销毁,而是保存在内存中等待承接下一次构建。根据官方文档说明,Gradle Daemon 能够降低 15-75% 的构建时间。

Daemon 的优化效果主要体现在 3 方面:

  • 缩短 JVM 虚拟机启动时间;
  • J变量值IT 编译: Daemon 进程会执行 JIT 编译,有助于提升后续构建的字节码执行效率;
  • 构建缓存:androidstudio新建项目 构建过程中加载的类、资源或者 Tasandroidstudio简单程序k 的输入和输出会保存在内存中,可以被后续构建复用。

相关的 Gradle 命令:

  • gradle —status: 查看存活的 Daemon 进程信息;
  • gradle —stop: 停止所有 Daemon 进程。

提示: 并不是所有的构建都会复用同一个 Daemon 进程,如果已存活的 Daemon 进程无法满足新构建的需求,则 Gradle 会新建一个新的 Daemon 进程。影响因素:

  • Gradle 版本: 不同 Gradle 版本的构建不会关联到同一个 Daemon 进程;
  • Gradle 虚拟机参数: 不满足的虚拟机参数不会关联到同一个 Daemon 进程。

1.5 Gradle Wrapper

Gradle Wrapper 本质上就是一个负责自动下载安装 Gradle 环境的脚本。 在开始执变量泵行 Gjavaeeradle 构建时,如果当前phpmyadmin设备中还未安装所需androidstudio新建项目版本的 Gradle 环境,那么 Gradle Wrapper 会先帮你下Android+Studio载安装到本地,其他需要这个版本的工程androidstudio安装教程也可以直接复用。

为什么 Gradle 官方从早期就专门推出一个自动安装环境工具呢,我认为原因有 2 个:

  • 确保 Gradandroid是什么手机牌子le 版本正确性: 鉴于 Gradle 有较弱向后兼容Android性的特点,Gradle Wra变量英语pper 能够从项目工程级别固化项目所需要的 Gandroidstudio彻底卸载干净radle 版本,从而确保同一个工变量名的命名规则程移植到其他电脑后能够正确地、可重复地构建;
  • 减少了手动安装php文件用什么软件打开 Gradle 环境的工作量: 单单从 Gradle 4 到 Gradle 7 就有大大小小十几个版本,而且每个工程所需要的 Gradle 版本不尽相同,使用 Gradle Wrapper 能够减少手动安装android下载安装环境的工作量;

简单说下 Gradle Wrapper 相关的文件,主要有 4 个:

  • gradlew & gradlew.bat: 在 Linandroid下载安装ux 或 Mac 上可用的 Shell 脚本,以及android下载在 Window 上可用的 Batch 脚本,用于以 Gradandroidstudio怎么设置中文le Wrapper 的方式执行构建。也就是说,在命令行变量名使用 gradlew 才是基于 Gradle Wrapper 执行的,而使用 gr变量名的命名规则adle 命令是直接基于系统安装的 Gradle 环境执行编译;
  • gradle-wrapper.jar: 负责下载安装 Gradlphp是什么意思e 环境的脚本;
  • gradle-wrapper.properties: Gradle Wrapperjava培训 的配置文件,主要作用是决定 Gradle 版本和安装目录:

    • distributionBase + distributionPPHPath:指定 Gradle 环境androidstudio安装教程安装androidstudio安装教程路径;
    • zipStoreBase + zipStorePath:指定 Gradle 安装包的存储路径;
    • distributionUrl:指定版本 Gradle 的下载地址,通过这个参数可以配置项目工程所需要的 Gradle 版本。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-6.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

提示:android手机 在系统环境变量中配置 GRADLE_USER_HOME 变量,可以修改 Gradle Wrapper 下载安装 Gradle 环境的存储目录java怎么读

1变量名.6 gradleandroid什么意思.propephpmyadminrties 构建环境配置

Gradle 是运行在 Java 虚拟机的androidstudio配置环境,gradle.properties 文件可以配置 Gradandroidstudio安装教程le 构建的运行环境,并java培训且会覆盖 Android Stu变量泵dio 设置中的全局配置,完整构建环境配置见官方文档:Build Envphp是什么意思iroment。常用的配置项举例:

# Gradle Daemon 开关,默认 ture
org.gradle.daemon=true  
# 虚拟机参数
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# 多模块工程并行编译多个模块,会消耗更多内存
org.gradle.parallel=true  

除了构建环境配置,其他配置android下载安装也可以用类似的键值对方式放在 gradle.properties 中,并直接在 .gradle 文件中引java面试题用。


2. Grojava是什么意思ovy 必知必会

.gradle 脚本是一个 Groovandroidstudio新建项目y 脚本文件,Groovy 是实现 Gradle 表达性 DSL 的核心,因此我们很有必要掌握足够的 Groovy 语法支持,才能为后续掌握 Gradle 脚本打下基础。当然也可以用 Kotlinandroidstudio安装教程 啦,此时脚本后缀名是 .gradle.kts。

Groovy 是基于 Java 虚拟机的,所以我们没必要从零Java开始学习 Groovy。这里android是什么系统我总结了一些 Groovy 与 Java 差异明显的地方:

2.1 一些小差异

  • 分号: 语句允许不以分号 ; 结尾;
  • pubphp精品源码lic: 默认的访问修饰符为 public;PHP
  • getter / setter: Groovy 会为androidstudio打包apk每个 field 创建对应的 getter / setter 方法,在访问 obj.field / obj.field=”” 时,实际上是在访问 getFi变量英语eld() 和 setField(””);
  • 支持静态类型和动态类型: 静态类型和动态类型的关键区php是什么意思别在于 ”类型检查是否倾向于在编java怎么读译时变量名执行“。例如 Java 是静态类型语言,意味着类型检查主要由变量是什么意思编译器在编译时完成;而 Groovy 既支持 Java 的静java环境变量配置态类型,也支持通过 def 关键字声明动态类型;
  • 字符串: Groovy 支持三种格式定义字符串 —— 单引号、双引号和三引号

    • 单引号:纯粹的android下载安装字符串,与 Java 的双引号字符串类PHP似;
    • 双引号:支持在引号内通过 $php是什么 关键字直接引用变量值;
    • 三引号:支持换行。

2.2 函数

  • 函数定义: Groovy 支持通过返回类型或 def 关键字定义函数。def 关键字定义变量值的函数如果没有 return 关键字返回值,则默认会返回 null。例如:
// 使用 def 关键字
def methodName() {
		// Method Code
}
String methodName() {
		// Method Code
}
  • 参数名: Groovy 支持不指定参数类型。例如:
// 省略参数类型
def methodName(param1, param2) {
		// Method Code
}
def methodName(String param1, String param2) {
		// Method Code
}
  • 默认参数: Groovy 支持指定函数参数默认值,默认参数必须放在参数列表末尾。例如:
def methodName(param1, param2 = 1) {
		// Method Code
}

2.3 集合

Groovy 支持通过 [] 关键字定义android/harmonyos List 列表或 Map 集合:

  • 列表: 例如 def list = [1, 2, 3, 4]
  • 散列:
  • 集合: 例如 def map = [’name’:’Tom’, ‘age’:18]
  • 范围: 例如 def range = 1 .. 10
  • 遍历:
// 列表
// 散列
// 集合
def map = [’name’:’Tom’, ‘age’:18]
map.each { key, value ->
}
map.eachWithIndex { entry, index ->
}
map.eachWithIndex { key, value, index ->
}

2.4 闭包

Groovy 闭包是一块可以作为值传递的代码块,形式上与 Java / K变量与函数otlin 的 lambda 表达式类似。例如以变量是什么意思下是有效的闭包:

{ 123 }
{ -> 123 }                                       
{ println it }
{ it -> println it }
{ name -> println name }                            
{ String x, int y ->                                
    println "hey ${x} the value is ${y}"
}
  • 闭包类型: Groovy 将闭包定义为 groovy.lang.Closure 的实例,使得闭包可以像其他类型的值一样复制给变量。例如:
Closure c = { 123 }
// 当然也可以用 def 关键字
def c = { 123 }
  • 闭包调用: 闭包可以像方法一样被调用,可以通过 Closure#call() 完成,也变量与函数可以直接通过变量完成。例如:
def c = { 123 }
// 通过 Closure#call() 调用
c.call()
// 直接通过变量名调用
c()
  • 隐式参数: 如果闭包没有显式定义参数列表(使用 )时,总是带有隐式参数 it。如果需要声明一个强制不接收参数的androidstudio新建项目闭包,那么必须用显式的空参数php是什么列表声明。例如:
// 带隐式参数 it
def greeting = { "Hello, $it!" }
assert greeting('Patrick') == 'Hello, Patrick!'
// 不带隐式参数 it
def magicNumber = { -> 42 }
// this call will fail because the closure doesn't accept any argument
magicNumber(11)
  • 闭包参数简化: 函数的最后一个参数是闭包类型的化,在调用时可以简化,省略圆括号:
def methodName(String param1, Closure closure) {
		// Method Code
}
// 调用:
methodName("Hello") {
		// Closure Code
}

this、owner、delegate


3. Gradle 构建生命androidstudio安装教程周期

Gradle Build Lifeandroidstudio简单程序cycle

理解构建生命周期非常重要,否则你可能连脚本中的每个代码单元的执行时机都搞不清楚。

3androidstudio简单程序.1 初始java模拟器化阶段

由于 Gjava怎么读radle 支持单模块构建或多模块构建,因此在初始化阶段(Initialization Phase),Gradle 需要知道哪些模块将参与构建。主要包变量与函数含 3 步:

  • 1、实例化 Settings 接口实例变量类型有哪些 Gradle 会解析根目录下的 settings.gradle 文件,并实例化一个 Settings 接口实例;
  • 2、执行 sett变量英语ings.gradle 脚本代码: 在 sphp是什么意思ettings.gandroidstudio新建项目radle 文件中的代码会在初始化阶段java模拟器执行;
  • 3、实例化 Projectjavascript 接口实例: Gradle 会解析 include 声明的模块,并为每个模块的 build.gradle 文件实例化 Project 接口实例。

orgjava怎么读.gradle.api.initializaandroidstudio彻底卸载干净tion.Settings.Java

public interface Settings extends PluginAware, ExtensionAware {
    String DEFAULT_SETTINGS_FILE = "settings.gradle";
    void include(String... var1);
    void includeFlat(String... var1);
    File getSettingsDir();
    File getRootDir();
    Gradle getGradle();
    ...
}

提示: Gradle 默认会在工程根目录下寻找 include 包含的项目,那么如果你想包含其他目录下的项目,可以这样配置:

// 引用当前工程目录下的模块
include ':app'
// 引用其他工程目录下的模块
include 'video' // 易错点:不要加’冒号 :‘
project(:video).projectDir = new File("..\libs\video")

3.2 配置阶段

配置阶段(Configuratiojava是什么意思n Phase)将执行 build.gradle 中的构建逻辑,以完成 Project 的配置。主要包含 3Android+Studio 步:

  • 1、下载插件和依赖:php是什么语言 Project 通常需要依赖其他插件或 Project 来完成工作,如果android/harmonyos有需要先下载;
  • 2、执行脚本代码: 在 build.gradle 文件中的代码会在配置阶段执行;
  • 3、构造 Task DAG: 根据 Task 的依赖关系构造一个有向无变量泵环图,以便在执行阶段按照依赖Android关系执行 Task。

提示: 执行任何 Gradle 构建命令,都会先执行初始化阶段和配置阶段。

3变量泵.3 执行阶段

在配置阶段已经构造了 Task DAU,执行阶段(Execution Phase)就是按照依赖关系执行 Task。这里有两个容易理解错误的地方:

  • 1、Task 配置代码在配置阶段执行,而 Tasandroid手机k 动作在执行阶段执行;
  • 2、即使执行一个 Task,整个工程的初始化阶段和所有PHP Project 的配置阶段也都会执行,这是为了支持执行过程中访问构建模型的任何部分。

原文: Thisjava怎么读 means that when a sandroid的drawable类ingAndroid+Studiole task, from a single project is requested,allprojects of a multi-project build are configured firandroidstudio安装教程st. The reason every project needs to be configured is to suppandroidstudio打包apkort the flexibility of accessing and chphp货币anging any part of the Gradle project mo变量英语del.

介绍完三个生命周期阶段后,你可以通过以下 Demo 体会各个代码单元java编译器所处的执行阶段:

setting.gradle

rootProject.name = 'basic'
println 'This is executed during the initialization phase.'

bandroidstudio简单程序uild.gradle

println 'This is executed during the configuration phase.'
tasks.register('configured') {
		// 易错点:这里在配置阶段执行
    println 'This is also executed during the configuration phase, because :configured is used in the build.'
}
tasks.register('test') {
    doLast {
        println 'This is executed during the execution phase.'
    }
}
tasks.register('testBoth') {
		doFirst {
				println 'This is executed first during the execution phase.'
		}
		doLast {
				println 'This is executed last during the execution phase.'
		}
		println 'This is executed during the configuration phase as well, because :testBoth is used in the build.'
}

输出:

> gradle test testBoth
This is executed during the initialization phase.
> Configure project :
This is executed during the configuration phase.
This is executed during the configuration phase as well, because :testBoth is used in the build.
> Task :test
This is executed during the execution phase.
> Task :testBoth
This is executed first during the execution phase.
This is executed last during the execution phase.
BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed

3.4 生命周期监听

Gradle 提供了一系列监听构建生命周期流程的接口,大部分的节php中文网点都有直接的 Hook 点,这里我总结一些常用的:

  • 监听初始化阶段

Gradle 接口提供了监听 Settings 初始化阶段的方法:

settings.gradle

// Settings 配置完毕
gradle.settingsEvaluated {
    ...
}
// 所有 Project 对象创建(注意:此时 build.gradle 中的配置代码还未执行)
gradle.projectsLoaded {
    ...
}
  • 监听配置阶段

Project 接口提供了监听当前 Pandroidstudio配置环境roject 配置阶段执行的方法,其中 afterEvaluate 常用于在 Project 配置完成后继续增加额外的配置,例如 Hook 构建过程中的 Task。

// 执行 build.gradle 前
project.beforeEvaluate { 
		...
}
// 执行 build.gradle 后
project.afterEvaluate { 
    ...
}

除此之外,Gradle 接口也提供了配置阶段的监听:

// 执行 build.gradle 前
gradle.beforeProject { project ->
		...
}
// 执行 build.gradle 后
gradle.afterProject { project ->
		// 配置后,无论成功或失败
    if (project.state.failure) {
        println "Evaluation of $project FAILED"
    } else {
        println "Evaluation of $project succeeded"
    }
}
// 与 project.beforeEvaluate 和 project.afterEvaluate 等价
gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
    @Override
    void beforeEvaluate(Project project) {
				...
    }
    @Override
    void afterEvaluate(Project project, ProjectState projectState) {
				...
    }
})
// 依赖关系解析完毕
gradle.addListener(new DependencyResolutionListener() {
		@Override
    void beforeResolve(ResolvableDependencies dependencies) {
        ....
    }
		@Override
    void afterResolve(ResolvableDependencies dependencies) {
        ....
    }
})
// Task DAU 构造完毕
gradle.taskGraph.whenReady {   
}
// 与 gradle.taskGraph.whenReady 等价
gradle.addListener(new TaskExecutionGraphListener() {
		@Override
    void graphPopulated(TaskExecutionGraph graph) {
        ...
    }
})
// 所有 Project 的 build.gradle 执行完毕
gradle.projectsEvaluated {
    ...
}
  • 监听执行阶段变量值

Gradleandroidstudio线性布局 接口提供php是什么了执行阶段的监听:

gradle.addListener(new TaskExecutionListener() {
		// 执行 Task 前
		@Override
    void beforeExecute(Task task) {
        ...
    }
		// 执行 Task 后
		@Override
    void afterExecute(Task task, TaskState state) {
        ...
    }
})
gradle.addListener(new TaskActionListener() {
		// 开始执行 Action 列表前,回调时机略晚于 TaskExecutionListener#beforeExecute
    @Override
		void beforeActions(Task task) {
        ...
    }
		// 执行 Action 列表完毕,回调时机略早于 TaskExecutionListener#afterExecute
		@Override
    void afterActions(Task task) {
        ...
    }
})
// 执行 Task 前
gradle.taskGraph.beforeTask { Task task ->
}
// 执行 Task 后
gradle.taskGraph.afterTask { Task task, TaskState state ->
    if (state.failure) {
        println "FAILED"
    }
    else {
        println "done"
    }
}
  • 监听 Task 创建

TaskContainer 接口提供了监听 Task 添加的方法变量名的命名规则,可以在 Task 添加到 Project 时收到回调:

tasks.whenTaskAdded { task ->
}
  • 监听构建结束

当所有 Task 执行完毕,意味着构建结束:

gradle.buildFinished {
    ...
}

5. Project 核心 API

在初始化构建过程时,Gradle 会为每个 buphp是什么意思ild.gradle 文件实例化一个变量之间的关系 Project 接口phpstudyandroid什么意思象。我们在 .gradle 脚本中编写的Android代码,本质上可以理解为是在一个 Project 子类中编写的。

5.1 Project API

Project 提供了一系列操作 Project 对象的 API:

  • getProject(): 返回当前 Project;
  • getParent(): 返回父 Prandroidstudio打包apkoject,如果在工程 RootProandroid什么意思ject 中调用,则会返回 null;
  • getRootPrandroidstudio简单程序oject(): 返回工程 RootProject;
  • getAllprojects(): 返回一个 Project Set 集合,包含当前 Project 与所有子变量 Project;
  • getSubprojects(): 返回一个 Project Set 集合,包含变量的定义所有子 Project;
  • project(String): 返回指定 Project,不存在时抛出 UnKnownProjectAndroidException;
  • findProject(Stphp是前端还是后端ring): 返回指定 Project,不存在时返回 null;
  • ajava编译器llprojects(Closure): 为当前 Projecandroidstudio线性布局t 以及php中文网所有子 Project 增加配置;
  • subprojects(Closure): 为所有子 Project 增加配置。

5.2 Projecphp是什么语言t 属性 APIandroid什么意思

Projandroid是什么系统eandroidstudio安装教程cAndroid+Studiot 提供了android/harmonyos一系列操作属性的java面试题 API,通过属性 API 可以实现在 Project 之间androidstudio快捷键共享配置参数Android

  • hasProperty(Stringphp中文网): 判断是否存在指定属性名;
  • property(Stirng): 获取属性值,如果属性不存在则抛出 MissingPropertyException;
  • findProperty(String): 获取属性值,如果属性不存android手机在则返回 nandroid手机ull;
  • setProperty(String, Object): 设置属性值,如果属性不存在则抛出 MissingPropertyException。

实际上,你不一定需要显示调用这些 API,当android什么意思我们直接使用属性名时,Gradle 会帮我们隐式调用 property() 或 setjava怎么读Property()。例如:

build.gradle

name => 相当于 project.getProperty("name")
project.name = "Peng" => 相当于 project.setProperty("name", "Peng")

5.2.1 属性匹配优先级

Project 属性的概念比我们理解的字段概念要复杂些,不仅仅是一个简单的键值对。Project 定义了 4 种命名空间(scopes)的属性,当我们通过访问属性时,getProperty() 会按照优先顺序搜android/harmonyos索:

  • 1、自有属性: Project 对象自身持有的属性,例如 rootProphp是前端还是后端ject 属性;
  • 2、Extension 扩展
  • 3、ext 额外属性
  • 4、Task 任务: 添加到 Project 上的 Task 也支持通过属性 API 访问;
  • 5、javascript父 Pjava编译器roject 的 Extension 扩展和 Convention 对象: Extension 扩展和 Convention 对象会被子 Project 继承,因此当 1 ~ 5 未命中时,会继续从父 ProjAndroidect 搜索。从父 Projec变量英语t 继承的属性是只读的;
  • 6、以上未命中,抛出 Misandroid是什么手机牌子singandroidstudio简单程序PropertyExceptiophp是什么语言n 或返回 null。

由于部分androidstudio简单程序属性是只读的,因此 setProperphp货币ty() 的搜索路径较短:

  • 1、自有属性
  • 2、ext 额外属性

提示:变量泵 其实还有 Convention 命名空间,不过已经androidstudio简单程序过时了,我们不考虑。

5.2.2 Extension 扩展

TODO

5.2.3 ext 额外属性

TODO

5.3 Project 文件 API

5.3.1 文件路径

  • getRootDir(): Project 的根目录(不是工程根目录)
  • getProj变量与函数ectDir(): 包含 build 文件夹的项目目录
  • getBuildDir(): build 文件夹目录

5.3.2 文件获取

  • File file(Object path): 获取单个文件,相对位置从当前 Project 目录开始
  • ConfigurableFileCollection fi变量值les(Object… paths): 获取多个文件,相对位置从当前 Project 目录开始
def destFile = file('releases.xml')
if (destFile != null && !destFile.exists()) {
		destFile.createNewFile()
}

5.3.3 文件拷phpstudy

  • copy(Closure): 文件拷贝,参数闭包用于配置 CodeSpec 对象
copy {
		// 来源文件
    from file("build/outputs/apk")
		// 目标文件
    into getRootProject().getBuildDir().path + "/apk/"
    exclude {
        // 排除不需要拷贝的文件
    }
    rename {
        // 对拷贝过来的文件进行重命名
    }
}

5.3.4 文件遍历

  • fileTree(Object baseDir): 将指定目录转化为文件树,再进行遍历操作
fileTree("build/outputs/apk") { FileTree fileTree ->
    fileTree.visit { FileTreeElement fileTreeElement ->
        // 文件操作
    }
}

5.4 Project 依赖管理 API

一个 Project 通常需要依赖其他 Proandroidstudio简单程序ject 才能完成工作,变量之间的关系相反地,一个 Project 通常也会生成一些产物给其他 Project 使用,这样就组成了 Project 的依赖关系php是什么

  • 管理仓库: 通过 Project#getRepositories() 管理依赖的仓库;
  • java是什么意思理依赖: 通过 Project#getDependencies() 管理 Project 的依赖;
  • 管理产物: 通过 Project#getArtifacts() 管理 Project 的产物。

TODO


6. Task 核心 API

Project 基本上就是 Task 的集合,每个 Task 负责完成一个基本的工作,例如 Javac 编译 Task、资源编译 Task、Lint 检查 Task,签名 Taskjavascript等。

6.1 Task 创建 API

创建 Task 的语法有 2 种:

  • 1、通过 task 关键字
// 创建名为 MyTask 的任务
task MyTask(group: "MyGroup") {
		// Task 配置代码
}
  • 2、通过 TaskCojava环境变量配置ntainer 方法: 通过 Project 的 TaskContainer 属性,变量是什么意思可以创建 Task,也可以操作已有的 Task。

    • Task create(String, Closure) 热创建: 立即创建并添加 Task;
    • TaskProvider register(String, Closure) 懒创建: 注册 Task 配置,创建 Task 操作会延迟到调用 TaskProvider#get() 或通过变量类型有哪些 TaskContainer#getByName() 访问 Task 时;
    • Task getByNandroid什么意思ame(String): 获取 Task,如果 Task 不存在则抛出 UnKnownDomainObjectException;
    • Task findByName(Stjava编译器ring): 获取 Task,如果 Task 不存在则返回 null。
// 创建名为 MyTask 的任务
project.tasks.create(name: "MyTask") {
		// Task 配置代码
}
println project.MyTask.name 
=> 等同于 project.tasks.getByName("MyTask").name
输出:MyTask

6.2 Task 属性 API

设置 Task 属性的语法有 3 种:Android+Studio

  • php精品源码创建 Task 时设置
task MyTask(group: "MyGroup")
  • 通过 setter 方法设置
task MyTask {
		group = "MyGroup" => 等同于 setGroup("MyGroup")
}
  • 通过 ext 额外属性设置: Task 也支持与 Project 类似的额外属性。例如:
task MyTask(group:"111") {
    ext.goods = 2
}
ext.goods = 1
println MyTask.good
输出:2

Tas变量泵k 常用的自有属性如下:

注意事项:

  • 严格避免使用带空格的 Task name,否则在一些版本的 Andrjavaeeoid Studio 中会被截断,导致不兼容;
  • Android Studio 的 Gradleandroidstudio配置环境 面板会按照 group 属性对 Ta变量名sk 进行分组显示。其中, Tasks 组为 Root Project 中的 Task,PHP其他分组为各个 Project 中的 Task,未指定 grouandroid/harmonyosp 的 Tandroid是什么手机牌子ask 会分配在 other 中。

6.3 Task Ac变量与函数t变量之间的关系ion 动作

Action 可以理android是什么手机牌子解为一个php是什么语言可执行的代码单元,执行 Task 就是按顺序执行其中的 actions 列表。Task 提供了php精品源码两个方法来添加 Actiandroid什么意思on:

  • doFirst(Closure): 在 Action 列表头部添加一个 Action;
  • doLast(Closure): 在 Action 列表尾部添加一个 Action;

【图】用队列示意 doLast 和 doFirst 的作用

task MyTask
MyTask.doFirst{
    println "Action doFirst 1"
}
MyTask.doFirst{
    println "Action doFirst 2"
}
MyTask.doLast{
    println "Action doLast 1"
}
执行 MyTask 输出:
Action doFirst 2
Action doFirst 1
Action doLast 1

6.4 Task 异常

Task 提供了两个异常,能够当 Action 执行过程中抛出以android是什么系统下异常,将跳过执行并继续变量值后续的构建过程:

  • StopActionException: 中断当前 Actphp文件用什么软件打开ion,并继android是什么手机牌子续当前 Task 的下一个 Action;
  • StopExecutionException: 中断当前 Task,并继续 Task 依赖树上的下一个 Action。

6.5 Task 依赖管理 API

  • dependsOn 强依赖: Task 通过 dependsOn 属性建立强依赖关系,可以直接通过 dependsOn 属性设置依赖列表,也可以通过 dependsOn() 方法添android是什么系统加一个依赖。

// 通过属性设置依赖列表
task task3(dependsOn: [task1, task2]) {
}
// 添加依赖
task3.dependsOn(task1, task2)
依赖关系:task3 依赖于 [task1, task2],在执行 task3 前一定会执行 task1 和 task2
  • mustRunAfter 弱依赖: Task 通过 mustRunAfter 属性建立执行顺序约变量名束,但这个方法并没有建立依赖关系。
  • shouandroidstudio安装教程ldRunAfter 弱依赖: 与 mustRunAfter 类似,但顺序约束是非强制的。
task3 mustRunAfter(task1, task2)
task3 shouldRunAfter(task1, task2)
依赖关系:无,在执行 task3 前不一定会执行 task1 和 task2
顺序关系:[task1, task2] 优先于 task3

6.6 Task 类型

Copyandroid的drawable类

Delete

TODO

自定义 Task 子类

defaultTasks

输入输出


7. 常用 Gradle 命令

version cataloandroid下载g

7.x之前的版本,如果多个模块需要实现同个版本的依赖管理,androidstudio怎么设置中文一般会过buildSrc或者composite buildjava编译器实现,从7.x开始,Gradle引入了version catalog,在7.4的版本正式稳定使用java语言,如果需要在之前的版本使用,需要通过settings.gradle中通过enableFeaturePreview("VERSION_CATALOphp是什么意思GS")开启。


8. 其他

Android Gradl变量是什么意思e Plugin 源码阅读技巧

为了深入理解变量名的命名规则 Android 的构建流程,只阅读相关资料或文档是不够的,还是需要阅读 Android Gradlephp是什么 Plugin 源码。

Gradle 源android下载码下载:services.gradle.org/disjavascripttributio…

总结

提示:文章排版有些瑕变量的定义疵,稍后更新以下

参考资料

  • 添加构建依赖项 —— Android 官方文档
  • 扩展 Android Graphpmyadmindle 插件 —— Android 官方文档
  • Android Gradle Plugin变量名 D变量泵SL 参考文档 —— Android 官方文档
  • Gradle 说明文档 —— Gradle 官方文档
  • Gradle DSL 参考文档 —— Gradle 官方文档
  • Groovy 参考文档 —— Groovy 官方文档
  • 《Gradlandroid什么意思e for Android》—— Kevin Pelgrims 著,余小乐 译
  • 《实战 Gradle》—— [美] Benjamin Muschko 著,李建 朱本威 杨柳 译
  • 深入php文件用什么软件打开探索 Gradle 自动化构建技术(系列) —— jsonc变量与函数hao 著

发表评论

提供最优质的资源集合

立即查看 了解详情