快速入门安卓Gradle指南(4/10)Gradle常见使用

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)

嵌入式

本人是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 中的各种函数去构建项⽬。

alt

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包装器

在工程目录,我们可以见到:

alt

上面的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 的执行流程:

  1. 当我们第一次执行 ./gradlew build 命令的时候,gradlew 会读取 gradle-wrapper.properties 文件的配置信息
  2. 准确的将指定版本的 gradle 下载并解压到指定的位置(GRADLE_USER_HOME目录下的wrapper/dists目录中)
  3. 并构建本地缓存(GRADLE_USER_HOME目录下的caches目录中),下载再使用相同版本的gradle就不用下载了
  4. 之后执行的 ./gradlew 所有命令都是使用指定的 gradle 版本

2.2 使用gradlew还是gradle

运行Gradle命令的时候,一般有如下两种方式:

  • cd到项目根目录,此时根目录有名为gradlew的可执行文件,运行任意命令,如:./gradlew build(再次说明,如果是Windows电脑,则需要执行./gradlew.bat build命令)就可以开始编译工程,该指令使用的Gradle版本是此时gradle-wrapper.properties文件里配置的版本;
  • cd到项目根目录,因为事先下载好gradle并把gradle命令添加到环境变

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

快速入门安卓Gradle指南 文章被收录于专栏

如果你想学习Android App开发,那么学习Gradle一定是必要的。 Gradle是一种构建工具,用于编译和构建Android应用程序,它可以自动处理依赖关系,生成APK文件等。通过本指南,你将掌握Gradle的基本概念和使用技巧,以及如何在工程中配置Gradle。通过学习Gradle,你可以更高效地构建和管理你的Android应用程序,提高你的开发效率,从而更好地满足用户需求。

全部评论
硬核
点赞 回复 分享
发布于 2023-05-25 11:56 北京

相关推荐

27届学院本誓死冲击...:自我评价和校园经历全删了,荣誉经历只留奖学金,项目也全得换都不如外卖
点赞 评论 收藏
分享
03-04 22:09
已编辑
南昌大学 golang
西北上单:29届? 请你去三角洲猛攻
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
4734次浏览 44人参与
# 你的实习产出是真实的还是包装的? #
1062次浏览 27人参与
# 米连集团26产品管培生项目 #
3919次浏览 181人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6891次浏览 36人参与
# 简历第一个项目做什么 #
31243次浏览 312人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186328次浏览 1114人参与
# 巨人网络春招 #
11132次浏览 221人参与
# 面试紧张时你会有什么表现? #
30317次浏览 188人参与
# 简历中的项目经历要怎么写? #
309349次浏览 4149人参与
# 网易游戏笔试 #
6301次浏览 83人参与
# 职能管理面试记录 #
10676次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6825次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56694次浏览 357人参与
# 腾讯音乐求职进展汇总 #
160388次浏览 1105人参与
# 小红书求职进展汇总 #
226838次浏览 1356人参与
# AI时代,哪些岗位最容易被淘汰 #
62336次浏览 725人参与
# 你怎么看待AI面试 #
179221次浏览 1160人参与
# 正在春招的你,也参与了去年秋招吗? #
362456次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92120次浏览 896人参与
# 机械求职避坑tips #
94393次浏览 567人参与
# 校招笔试 #
466042次浏览 2950人参与
# 面试官最爱问的 AI 问题是...... #
27052次浏览 834人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务