Skip to content

Commit 252a6aa

Browse files
committed
update gradle part
1 parent 4cfccf0 commit 252a6aa

1 file changed

Lines changed: 58 additions & 16 deletions

File tree

Gradle&Maven/Gradle专题.md

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,27 @@
11
Gradle专题
22
===
33

4-
随着`Google``Eclipse`的无情抛弃以及`Studio`的不断壮大,`Android`开发者逐渐拜倒在`Studio`的石榴裙下。
5-
而作为`Studio`的默认编译方式,`Gradle`已逐渐普及。我最开始是被它的多渠道打包所吸引。关于多渠道打包,请看之前我写的文章[AndroidStudio使用教程(第七弹)][1]
6-
7-
接下来我们就系统的学习一下`Gradle`
8-
94
作用
105
---
116

12-
Gradle是一个开源的自动化构建工具。现在Android项目构建编译都是通过Gradle进行的,Gradle的版本在`gradle/wrapper/gradle-wrapper.properties`下:
13-
```
7+
[Gradle](https://docs.gradle.org/7.3.3/userguide/what_is_gradle.html)是一个开源的自动化构建工具。现在Android项目构建编译都是通过Gradle进行的,Gradle的版本在`gradle/wrapper/gradle-wrapper.properties`下:
8+
![image](https://github.com/CharonChui/Pictures/blob/master/gradle_version.png?raw=true)
149

15-
```
16-
17-
18-
使用这个工具可以完成app的编译打包等工作。
10+
当前Gradle版本为6.7.1。当我们执行assembleDebug/assembleRelease编译命令的时候,Gradle就会开始进行编译构建流程。
1911

2012

2113
简介
2214
---
2315

24-
[Gradle](https://gradle.org/releases/)是以`Groovy`语言为基础,面向`Java`应用为主。基于`DSL(Domain Specific Language)`语法的自动化构建工具。
16+
[Gradle](https://gradle.org/releases/)是以`Groovy`语言为基础,面向`Java`应用为主。
17+
基于`DSL(Domain Specific Language)`语法的自动化构建工具。
2518

2619
`Gradle`集合了`Ant`的灵活性和强大功能,同时也集合了`Maven`的依赖管理和约定,从而创造了一个更有效的构建方式。凭借`Groovy``DSL`和创新打包方式,`Gradle`提供了一个可声明的方式,并在合理默认值的基础上描述所有类型的构建。 `Gradle`目前已被选作许多开源项目的构建系统。
2720

28-
[Groovy](http://www.groovy-lang.org/api.html)基于Java并拓展了Java。 Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就是把写Java程序变得像写脚本一样简单。写完就可以执行,Groovy内部会将其编译成Javaclass然后启动虚拟机来执行。当然,这些底层的渣活不需要你管。*实际上,由于Groovy Code在真正执行的时候已经变成了Java字节码,所以JVM根本不知道自己运行的是Groovy代码*
21+
[Groovy](http://www.groovy-lang.org/api.html)基于Java并拓展了Java。
22+
Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就是把写Java程序变得像写脚本一样简单。写完就可以执行,Groovy内部会将其编译成Javaclass然后启动虚拟机来执行。
23+
当然,这些底层的渣活不需要你管。实际上,由于Groovy Code在真正执行的时候已经变成了Java字节码,所以JVM根本不知道自己运行的是Groovy代码。
24+
2925

3026
因为`Gradle`是基于`DSL`语法的,如果想看到`build.gradle`文件中全部可以选项的配置,可以看这里
3127
[DSL Reference](http://google.github.io/android-gradle-dsl/current/)
@@ -34,15 +30,61 @@ Gradle是一个开源的自动化构建工具。现在Android项目构建编译
3430

3531
![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/android_build_process.png?raw=true)
3632

33+
### Gradle的生命周期
34+
35+
1. Initialization:初始化阶段
36+
- 解析整个工程中所有的Project,构建所有Project对应的project对象。
37+
- 初始化阶段执行项目目录下的settings.gradle脚本,用于判断哪些项目需要被构建,并且为对应项目创建Project对象。
38+
39+
2. Configuration配置阶段
40+
- 解析所有的project对象中的Task,构建所有Task的括扑图
41+
- 配置阶段的任务是执行各module下的build.gradle脚本,从而完成Project的配置,并且构建Task任务依赖关系图以便在执行阶段按照依赖关系执行Task。
42+
- 这个阶段Gradle会拉取remote repo的依赖(如果本地之前没有下载过依赖的话)
43+
3. Execution执行阶段
44+
执行具体的task以及其依赖的task
45+
4. Build Finished
46+
47+
48+
49+
50+
3751
Gradle与Android Studio的关系
3852
---
3953

4054
Gradle跟Android Studio其实没有关系,但是Gradle官方还是很看重Android开发的,Google在推出AS的时候选中了Gradle作为构建工具,为了支持Gradle
41-
能在AS上使用,Google做了个AS的插件叫Android Gradle Plugin,所以我们能在AS上使用Gradle完全是因为这个插件的原因。在项目的根目录有个build.gradle文件,里面有这么一句代码:
55+
能在AS上使用,Google做了个AS的插件叫Android Gradle Plugin,所以我们能在AS上使用Gradle完全是因为这个插件的原因。
56+
57+
### AGP
58+
AGP即Android Gradle Plugin,主要用于管理Android编译相关的Gradle插件集合,包括javac,kotlinc,aapt打包资源,D8/R8等都在AGP中。
59+
60+
AGP的版本是在根目录的build.gradle中配置的:
61+
```
62+
dependencies {
63+
classpath 'com.android.tools.build:gradle:4.2.1'
64+
...
65+
}
66+
```
67+
68+
### AGP与Gradle的区别与联系
69+
70+
Gradle是构建工具,而AGP是管理Android构建的插件。可以理解为AGP是Gradle构建流程中重要的一环。
71+
72+
虽然AGP和Gradle不是一个纬度的事情,但是两者也在一定程度上有所关联:两者的版本号必须匹配上: https://developer.android.com/build/releases/gradle-plugin?hl=zh-cn#updating-gradle
73+
74+
75+
![image](https://github.com/CharonChui/Pictures/blob/master/agp_gradle_version.png?raw=true)
76+
77+
78+
既然Android编译是通过AGP实现的,AGP就是Gradle的插件,那么这个插件是什么时候被apply的内?
79+
因为一个插件如果没有apply的话,那么压根不会执行的。
4280
```
43-
classpath 'com.android.tools.build:gradle:2.1.2'
81+
plugins {
82+
id 'com.android.application'
83+
id 'kotlin-android'
84+
id 'kotlin-kapt'
85+
}
4486
```
45-
这个就是依赖gradle插件的代码,后面的版本号代表的是android gradle plugin的版本,而不是Gradle的版本,这个是Google定的,跟Gradle官方没关系。
87+
这就是AGP被apply的地方,也是区分一个module究竟是被打包成app还是一个library的地址。
4688

4789

4890

0 commit comments

Comments
 (0)