Gradle
Gradle基础
生命周期
生命周期监听(HOOK)
Project
Gradle的构建由一个或多个Project组成(根目录下setting.gradle决定),一个打印Project所有属性信息的示例如下:
1 | ./gradlew app:properties |
Task
Gradle Plugin 中的Task主要有三种:**普通Task
、增量Task
、Transform
**。
Task一般会继承 DefaultTask
或 **IncrementalTask
**,而 @TaskAction
注解的方法,就是此Task做的事。
继承 IncrementalTask
的类为增量Task,这个增量是相对于全量来说的,全量指的是:调用完clean后第一次编译过程,修改代码或资源后再次编译,就是增量编译
1 | public abstract class IncrementalTask extends BaseTask { |
至于 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本体目录了
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)
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 | --configuration 后参数 |
后面带有 “(*)” 的库就表示 这个库有被覆盖过(最高的版本覆盖)。
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 | allprojects { |
Google 的 Maven 代码库中提供了以下 Android 库的最新版本:
Android 支持库
架构组件库
约束布局库
AndroidX 测试
数据绑定库
Android 免安装应用库
Wear OS
Google Play 服务
Google Play 结算库
Firebase
补充链接
https://juejin.cn/post/6950643579643494431
Gradle常用命令
1 | # 命令结构 |
//gradle build 命令包含了 gradle assemble , 可通过 gradle build –dry-run查看