Gradle

Gradle 用户指南官方文档中文版

Gradle基础

gradle basic 5

gradle basic 7

生命周期

img

生命周期监听(HOOK)

img

Project

Gradle的构建由一个或多个Project组成(根目录下setting.gradle决定),一个打印Project所有属性信息的示例如下:

1
2
3
4
5
6
7
8
9
./gradlew app:properties
常见如:
项目名称: project.name
项目目录: project.projectDir
构建目录: project.buildDir
根项目: project.rootProject
版本: project.version
组: project.group
状态: project.status

Task

Gradle Plugin 中的Task主要有三种:**普通Task增量TaskTransform**。

Task一般会继承 DefaultTask 或 **IncrementalTask**,而 @TaskAction 注解的方法,就是此Task做的事。

继承 IncrementalTask 的类为增量Task,这个增量是相对于全量来说的,全量指的是:调用完clean后第一次编译过程,修改代码或资源后再次编译,就是增量编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class IncrementalTask extends BaseTask {
// 是否需要增量,默认false
@Internal protected boolean isIncremental() { }

// 需要子类实现,全量时执行的任务
protected abstract void doFullTaskAction() throws Exception;

// 增量时执行的任务,默认什么都不执行,参数是增量时修改过的文件
protected void doIncrementalTaskAction(Map<File, FileStatus> changedInputs) throws Exception{ }

@TaskAction
void taskAction(IncrementalTaskInputs inputs) throws Exception {
// 判断是否是增量,是执行doIncrementalTaskAction,否则执行doFullTaskAction


// 获取修改文件
private Map<File, FileStatus> getChangedInputs(IncrementalTaskInputs inputs) { }
}

至于 Transform(变换),是Android官方提供给开发者,在.class → .dex转换期间用来修改.class文件的一套API,留意 transform() 方法的实现就好。

Gradle Plugin Version or Gradle Vesion

Gladle插件版本(AGP) build.gradle文件 classpath’com.android.tools.build:gradle:3.0.0’ 指定,是AS用来引入gladle特性的插件

Gladle版本(Gradle): gradle/wrapper/gradle-wrapper.properties文件中 distributionUrl=https://services.gradle.org/distributions/gradle-x.x.x.zip 指定,也即使gradle本体的版本

简述:这很好理解,gradle-wrapper.properties配置后会下载该版本Gradle本体到/gradle目录下,这就是gradle本体目录了

image-20240227152415767

AGP和gradle的版本对应关系:

插件版本 所需的 Gradle 版本
7.3 7.4
7.2 7.3.3
7.1 7.2
7.0 7.0
4.2.0+ 6.7.1
4.1.0+ 6.5+
4.0.0+ 6.1.1+
3.6.0 - 3.6.4 5.6.4+
3.5.0 - 3.5.4 5.4.1+
lower version lower version

Android Studio版本(AS)

AS > AGP:


Dependencies Tree Check

dependencies

Task :app:dependencies用于输出项目依赖项的树状结构

如果 dependencies 信息太多,可以保存到文件:./gradlew :app:dependencies --configuration releaseRuntimeClassPath > dependencies.txt,这样更方便搜索和查看。项目依赖项信息非常有用,可以用来排查依赖冲突、分析库依赖关系等。

全部依赖: gradlew app:dependencies

release依赖: gradlew app:dependencies –configuration releaseRuntimeClasspath

./gradlew app:dependencies --configuration debugRuntimeClasspath

1
2
3
4
5
6
--configuration 后参数
正式环境依赖: releaseRuntimeClasspath

debug依赖: debugRuntimeClasspath

编译依赖: compile

后面带有 “(*)” 的库就表示 这个库有被覆盖过(最高的版本覆盖)。

1
2
3
4
5
6
7
androidx.annotation:annotation:1.1.0 -> 1.3.0

org.jetbrains.kotlin:kotlin-stdlib:1.5.31 -> 1.7.10 (*)

org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)

androidx.test:core:{strictly 1.4.0} -> 1.4.0 (c)
  • ->:表示冲突,比如这个1.1.0 -> 1.3.0,-> 后面的版本表示Gradle决议之后的版本,这里表示1.1.0版本被拉高到1.3.0;
  • **其实是省略的意思,层级太深,Gradle就省略了一部分,而越深的信息也不太重要,就显的冗余,往往重要的信息都在前几层;
  • c:c是constraints的简称,主要是用来保证当前依赖项所需要的依赖的版本的一致性,白话讲就是为了防止其他依赖项把我需要的依赖给拉高而导致我自己不可用的情况。
  • strictly:strictly跟force一样表示强制使用该版本,区别在于strictly可以在依赖树里标示出来,而force则没有任何标示,所以force在高版本里也被废弃了。

dependencyInsight

Task :app:dependencyInsight 用于输出项目中特定依赖项的详细信息

使用这个 task 的方式是:./gradlew :app:dependencyInsight --configuration someConf --dependency someDep,必须有 –configuration 和 –dependency 选项。对于 –configuration 选项参数,可以通过上面的Task :app:androidDependencies 查看。

1
./gradlew module-detail:dependencyInsight --dependency component-media --configuration releaseRuntimeClasspath

How Gradle depend on

本地库模块依赖项

module

implementation project(‘:mylibrary’)

这声明了对一个名为“mylibrary”(此名称必须与在您的 settings.gradle 文件中使用 include: 定义的库名称相符)的 Android 库模块的依赖关系。在构建您的应用时,构建系统会编译该库模块,并将生成的编译内容打包到 APK 中。

本地二进制文件依赖项

jar java ARchive .class文件+MENIFEST.MF文件

implementation fileTree(dir: ‘libs’, include: [‘*.jar’])

Gradle 声明了对项目的 module_name/libs/ 目录中 JAR 文件的依赖关系(因为 Gradle 会读取 build.gradle 文件的相对路径)。

或者,您也可以按如下方式指定各个文件:

implementation files(‘libs/foo.jar’, ‘libs/bar.jar’)

远程二进制文件依赖项

aar = jar + AndroidManifest、res、R、public.txt和可能其他

implementation ‘com.example.android:app-magic:12.3’

这实际上是以下代码的简写形式:

implementation group: ‘com.example.android’, name: ‘app-magic’, version: ‘12.3’

这声明了对“com.example.android”命名空间组内的 12.3 版“app-magic”库的依赖关系。

文件格式.aar

实际上.arr中可能只有.jar 和 AndroidManifest.xml

Maven依赖

1
2
3
4
5
6
7
8
9
10
11
    allprojects {
repositories {
google() //Google Maven repository
jcenter() //Bintray’s JCenter Maven repository 已不维护
mavenCentral() //central Maven repository
maven { url "https://maven.aliyun.com/repository/google" } //Google阿里镜像
maven { url "https://maven.aliyun.com/repository/jcenter" } //JCenter阿里镜像

mavenLocal() //
}
}

Google 的 Maven 代码库中提供了以下 Android 库的最新版本:

Android 支持库
架构组件库
约束布局库
AndroidX 测试
数据绑定库
Android 免安装应用库
Wear OS
Google Play 服务
Google Play 结算库
Firebase

补充链接

https://juejin.cn/post/6950643579643494431

Gradle常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 命令结构
gradle [taskName...] [--option-name...]

# 增量编译:同一个项目中, 同一个 task除非有必要, 否则不会被无意义的执行多次;
# 缓存:无论是否在同一个项目,只要Task输入没变就复用缓存结果,不必真的执行task;

# Tasks执行
gradle myTask # 执行某个Task
gradle :my-subproject:taskName # 执行子项目中的Task
gradle my-subproject:taskName # 同上,不指定子项目,会执行所有子项目的此Task,如gradle clean;
gradle task1 task2 # 运行多个Task
gradle dist --exclude-task test # 将某个task排除在执行外
gradle dist -x test # 同上
gradle test --rerun-tasks # 强制执行UP-TO-DATE的Task,即不走增量编译,执行全量编译;
gradle test --continue # 默认情况下,一旦Task失败就会构建失败,通过此参数可继续执行;

# 常见任务(和插件间的Task约定)
gradle build
gradle run
gradle check
gradle clean # 删除构建目录

# 构建细节
gradle projects # 列出所有子项目
gradle tasks # 列出所有Task(分配给任务组的Task)
gradle tasks --group="build setup" # 列出特定任务组的Task
gradle tasks --all # 列出所有Task
gradle -q help --task libs # 查看某个Task的详细信息
gradle myTask --scan # 生成可视化的编译报告
gradle dependencies # 列出项目依赖
gradle -q project:properties # 列出项目属性列表

# 调试选项
-?,-h,--help # 帮助信息
-v,--version # 版本信息
-s, --stacktrace # 打印出异常堆栈跟踪信息;
-S, --full-stacktrace # 比上面更完整的信息;

# 性能相关
--build-cache # 复用缓存
--no-build-cache # 不复用缓存,默认
--max-workers # 最大处理器数量
--parallel # 并行生成项目
--no-parallel # 不并行生成项目
--priority # Gradle启动的进程优先级
--profile # 生成性能报告

# 守护进程
--daemon # 使用deamon进程构建
--no-daemon # 不使用deamon进程构建
--foreground # 前台进程启动deamon进程
--status # 查看运行中和最近停止的deamon进程;
--stop # 停止所有同一版本的deamon进程;

# 日志选项
-q, --quiet # 只记录错误
-w, --warn
-i, --info
-d, --debug
--console=(auto,plain,rich,verbose) # 指定输出类型
--warning-mode=(all,fail,none,summary) # 指定警告级别

# 执行选项
--include-build # 复合构建
--offline # 离线构建
--refresh-dependencies # 强制清除依赖缓存
--dry-run # 在不实际执行Task的情况下看Task执行顺序
--no-rebuild # 不重复构建项目依赖

# 环境选项
-b, --build-file # 指定构建文件
-c, --settings-file # 指定设置文件
-g, --gradle-user-home # 指定默认.Gradle目录
-p, --project-dir # 指定Gradle的开始目录
--project-cache-dir # 指定缓存目录,默认.gradle
-D, --system-prop # 设置JVM系统属性
-I, --init-script # 指定初始化脚本
-P, --project-prop # 指定根项目的项目属性;

//gradle build 命令包含了 gradle assemble , 可通过 gradle build –dry-run查看

Author

white crow

Posted on

2021-04-02

Updated on

2024-07-16

Licensed under