快速入门安卓Gradle指南(4/10)Gradle常见使用
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看:《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看:《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看:《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看:《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法,制作Gradle插件,请看:《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对安卓Gradle的理解。网上安卓资料千千万,笔者将继续维护专栏,承诺提供专栏内容免费技术答疑,直接咨询即可,助您提高安卓学习效率!
目录开始⬇
- 1、Gradle Wrapper包装器
- 1.1 为什么需要Gradle Wrapper包装器
- 1.2 使用gradlew还是gradle
- 2、Gradle项目生命周期
- 3、常用命令
- 4、常见操作
- 4.1 引入插件
- 4.2 指定maven仓库
上一篇文章介绍了Android项目的工程结构,Android Studio 工程目录结构和 Gradle 构建系统密切相关,Gradle 是 Android Studio 的默认构建系统,并管理整个 Android 工程的编译和构建过程。通过 Gradle 的配置,我们可以实现工程的分层、模块化开发,以及构建版本号更新和多渠道打包,从而实现更加高效和可维护的 Android 工程开发。
因此,本节讲解Gradle的运行和调试。
1、Gradle JVM进程
Gradle本质上是运⾏在 JVM(Java虚拟机) 上的⼀个程序,包含编译、打包、处理资源的函数或者插件(函数库),内部使⽤ Groovy 语⾔,编写的文件都是xxx.gradle。Gradle最后会把xxx.gradle这些脚本文件编译为xxx.class的字节码文件,也就是说最终还是Java这套东西。我们随便打开一个gradle包,核心的bin文件就是一个gradle脚本,是Gradle的核心处理逻辑,会启动⼀个 JVM 实例去加载 lib 中的各种函数去构建项⽬。
Gradle 构建⼯具在不同场景下会分别使⽤3个 JVM 进程:
- client
- Daemon
- wrapper
1.1 client进程
client 进程是一个轻量级进程,每次构建开始都会创建这个进程,构建结束后会销毁这个进程。client 进程的主要任务是与 Daemon 进程通信。
当 Daemon 进程还未启动时,client 进程会启动一个新的 Daemon 进程。而当 Daemon 进程已经存在时,client 进程会将本次构建相关的参数和任务传递给 Daemon 进程,并接收来自 Daemon 进程的日志信息。
例如,gradle.properties 文件中设置的参数,全局 init.gradle 初始化脚本的任务,都需要由 client 进程传递给 Daemon 进程。这些参数和任务一旦传递给 Daemon 进程,就会被缓存起来,以便加速后续构建任务的执行。
2.2 Daemon 进程
Daemon 进程是一个独立存在的构建工具,不依赖于集成开发环境(例如 Android Studio),其唯一任务就是执行构建任务。一旦构建完成,Daemon 进程也不会销毁,而是进入休眠状态,等待下一次构建任务的执行。使用 Daemon 进程可以加速构建速度,因为它可以缓存插件和依赖库等资源,避免了重复加载和初始化的时间。同时,由于 Daemon 进程在后台长期运行,一些支持库也会被初始化,从而可以加快构建速度。
注意:每个 Gradle 版本都对应一个独立的 Daemon 进程。如果机器上安装了多个 Gradle 版本,则会存在多个相应的 Daemon 进程。
在性能方面,由于 Gradle 运行在 JVM 上,并使用一些支持库,这些库需要初始化时间。因此,一个长期存在的后台进程可以节省编译时间。而 Daemon 进程可以缓存插件和依赖库等资源,加快构建速度。 如果同时运行多个版本的 Gradle,可能会存在多个 Daemon 进程。如果需要杀死 Daemon 进程,则可以手动进行操作。
但是 Daemon 进程会在一定条件下失效,此时需要启动新的进程。这些条件包括修改 JVM 配置、闲置超过 3 小时、环境变量的变化等。即使是同一版本的 Gradle,也可能因为 VM 配置的不同而存在多个相同版本的 Daemon 进程。例如,在同时启动多个项目时,虽然使用的 Gradle 版本相同,但是 VM 的配置不同可能会导致存在多个相同版本的 Daemon 进程。
1.3. wrapper 进程
wrapper 进程专门用于下载和管理 Gradle 版本,它不直接参与项目构建过程,其唯一任务就是负责下载 Gradle 版本。当我们将 Gradle 项目导入到开发环境中时,如果本地没有所需版本的 Gradle,那么项目的 Client 进程就会启动 Wrapper 进程,根据 gradle-wrapper.properties
文件中的配置信息,自动下载相应版本的 Gradle 文件。下载完成后,Wrapper 进程会立即关闭。接下来看看Gradle Wrapper包装器。
2、Gradle Wrapper包装器
2.1 为什么需要Gradle Wrapper包装器
在工程目录,我们可以见到:
上面的gradle-wrapper其实是对Gradle的一层封装。我们经常会遇到这些情况:
- 把自己的安卓app代码给别人,别人电脑没有安装Gradle;
- 从网上或者别人拿到的项目,项目所使用的Gradle版本太低,或者自己电脑里面的Gradle版本太低,达不到项目的要求;
这时候,我们就可以考虑使用Gradle Wrapper了,因为Gradle Wrapper正是用于解决不同项目使用不同Gradle版本
的问题,其核心是一个用来下载和安装特定版本 Gradle 的脚本,可以让开发人员和团队自动下载和使用指定版本的 Gradle 来编译项目,从而不需要手动下载和安装 Gradle。官方都建议使用Gradle Wrapper。
注:在项目根目录可以看到gradlew文件和gradle.bat文件,这两个都是上述说的Gradle脚本文件,前者适用于Unix/Linux/Mac系统,后者适用于Windows系统。本人使用Mac系统,故本文均使用gradlew进行说明。
gradle/wrapper/gradle-wrapper.properties文件的内容解析:
//Gradle 发布包(distribution)的基础路径,相对于用户目录
distributionBase=GRADLE_USER_HOME
//Gradle 发布包存储相对路径相对于 distributionBase
distributionPath=wrapper/dists
//Gradle 压缩包存储路径的基础路径,相对于用户目录
zipStoreBase=GRADLE_USER_HOME
//Gradle 压缩包存储路径的相对路径,相对于 zipStoreBase
zipStorePath=wrapper/dists
//下载 Gradle 发布包的地址,即 Gradle 的下载地址
distributionUrl=https://services.gradle.org/distributions/gradle-6.5-all.zip
上面提到的 GRALE_USER_HOME 环境变量用于这里的 Gradle Wrapper 下载的特定版本的 gradle 存储目录。如果我们没有配置过 GRALE_USER_HOME 环境变量,默认在当前用户家目录下的.gradle 文件夹中。
GradleWrapper 的执行流程:
- 当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息
- 准确的将指定版本的 gradle 下载并解压到指定的位置(GRADLE_USER_HOME目录下的wrapper/dists目录中)
- 并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),下载再使用相同版本的gradle就不用下载了
- 之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本
2.2 使用gradlew还是gradle
运行Gradle命令的时候,一般有如下两种方式:
- cd到项目根目录,此时根目录有名为gradlew的可执行文件,运行任意命令,如:
./gradlew build
(再次说明,如果是Windows电脑,则需要执行./gradlew.bat build命令)就可以开始编译工程,该指令使用的Gradle版本是此时gradle-wrapper.properties文件里配置的版本; - cd到项目根目录,因为事先下载好gradle并把gradle命令添加到环境变
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
如果你想学习Android App开发,那么学习Gradle一定是必要的。 Gradle是一种构建工具,用于编译和构建Android应用程序,它可以自动处理依赖关系,生成APK文件等。通过本指南,你将掌握Gradle的基本概念和使用技巧,以及如何在工程中配置Gradle。通过学习Gradle,你可以更高效地构建和管理你的Android应用程序,提高你的开发效率,从而更好地满足用户需求。