赞
踩
本文前面介绍部分转载
Gradle介绍:
Gradle 是一种现代自动化工具,用于项目构建自动化的软件开发。
“自动化工具”究竟是什么意思? 好吧,这就是你可能正在想的——你点击一个按钮并根据你的自动化操作接收结果。
话虽如此,让我们从一般解释跳到软件开发领域,因为这是 Gradle 使用最多的地方。 现在你口袋里的任何应用程序(我的意思是在你的智能手机中)都是自动化的产物。 该应用程序由许多源代码文件组成,并使用许多库。 组装最终产品需要很多步骤,称为应用程序的“构建”。 构建的输出通常是经过测试的应用程序工件。 如果它通过测试,它将被运送到你的智能手机。
你是否注意到每周都会在智能手机应用程序中看到一项新功能? 每次更新时,你都会收到每个应用程序的新版本。 事实上,在你收到更新之前,可能已经完成了许多构建。
那么,如果构建过程很长,你怎么可能仍然如此快速地收到这些更新? 答案——自动化工具。 Gradle 允许你指定项目构建(将源代码放在一起,链接库等),然后每次进行更改时,你只需“点击按钮”,Gradle 就会自动为你完成所有步骤。
Gradle 经常用于 JVM 应用程序的开发,使用 Java 或 Kotlin 等语言编写。 它的直接竞争对手是Maven和Ant。 虽然这些工具在很大程度上执行相同的功能,但它们的执行方式存在巨大差异。 你可以在此处查看 Gradle 和 Maven 之间的官方比较。
Gradle是如何构建工作的?
Gradle 构建配置存储在名为 build.gradle 的文件中,该文件基于领域特定语言 (DSL)。 这是一种结合了声明式和命令式结构的专用脚本语言。 该配置文件位于项目的根文件夹中,定义了一个项目、其任务、依赖项以及其他与项目相关的项。 Gradle 支持多项目构建,其中每个项目在项目根文件夹中都有自己的 build.gradle 文件。
“任务”是一个原子工作单元,它描述了当它被调用时应该做什么。 一个构建可以被描述为一组任务。 每个任务由动作、输入和输出组成; 每个部分都是可选的。
要查看 Gradle 项目的所有可用任务的列表,你可以在命令行中执行“gradle tasks”。 对于简单的 Java 项目,你可以从以下类别的预定义任务中进行选择:
构建任务
构建设置任务
分发任务
文档任务
帮助任务
验证任务
其他任务
为什么需要 Gradle?
管理项目生命周期是一项可以完成的复杂任务,但需要付出巨大的努力。 由于其复杂性,手动完成这些任务时很容易出错。
以依赖管理为例。 你能想象每次更新时手动下载和配置项目使用的库吗? 或者手动执行所有命令来编译类,将它们移动到正确的文件夹,或者手动执行测试呢? 我可以继续命名所有步骤,但我认为你明白这不是这样做的方法。
更有效的方法是使用 Gradle 之类的自动化工具,它可以在需要时为你做任何事情。 如果你需要自动化一些 Gradle 无法开箱即用的功能,你可以编写一次自己的任务并依靠你的手动工作。
Gradle 是一个非常有用的项目生命周期和构建管理工具。与其问你是否应该使用构建自动化工具,不如问该使用哪种工具。Gradle 已经存在超过 13 年,并被许多开发团队广泛采用。 虽然它比它的竞争对手 Maven 年轻一点,但 Gradle 具有相同的功能,并且在某些情况下优于 Maven。
使用Gradle来构建Android项目对Android开发者而言并不陌生,因为当我们使用Android Studio来进行项目开发时,就一直在使用这种构建方式。
Gradle构建一个新的Android项目时,会生成几个重要的gradle文件,一个setting.gradle文件,两个build.gradle文件:
这些文件都有什么用呢?依次说明
1.根目录下(project)的settings.gradle文件
一个项目可能会有多个Module
app目录下的build.gradle文件
该文件下的属性只能应用在Android APP模块,可以覆盖顶层(project)下build.gradle文件的任何属性。
setting.gradle文件:在初始化阶段被执行,并且定义了哪些模块应该被包含在构建内,因此单模块不一定要包含setting.gradle文件,多模块一定要包含setting.gradle文件,否则Gradle不知道哪个模块包含在构建内。当我们在setting下gradle下设置gradle选择“use defalut gradle wrapper(recommended)”
时,as就会根据{project.dir}\gradle\wrapper\gradle-wrapper.properties文件中的配置去gradle
该文件主要用来配置所有模块的配置参数,
- // 需要引进的相关插件Plugins
- plugins {
- // 'java' 表示应用java插件添加对java的支持
- id 'java'
- // 'idea' 表示应用idea插件添加对idea的支持
- id 'idea'
- // gradle
- id 'io.franzbecker.gradle-lombok' version '3.1.0'
- // Spring boot
- id 'org.springframework.boot' version '2.1.6.RELEASE'
- // Maven
- id 'io.spring.dependency-management' version '1.0.8.RELEASE'
- }
你要考虑的是你的项目是否需要这些插件。
buildscript代码块用于配置构建:例如通过repositories将JCenter配置成一个仓库,为应用和依赖项目提供一系列的可下载的函数库,JCenter是一个有名的Maven库,其中的dependencies代码块用于配置构建过程中的依赖包,唯一被默认定义的依赖包是gradle的Android插件,该插件可使其自己对应的android模块执行Android相关的任务。
allprojects代码块用来申明那些需要被用于所有模块的属性,当然也可以创建任务,这些任务最终会被运用到所有模块。
repositories 存储库,仓库用于存储依赖,dependencies依赖就相当于货物,存放在仓库中。
repositories
- // repositories闭包 存储库
- // 声明在何处查找项目的依赖项
- repositories {
- // 指定使用maven本地仓库,而本地仓库在配置maven时setting文件指定的仓库位置。
- mavenLocal()
-
- maven {
- name "aliyun"
- url "https://maven.aliyun.com/repository/gradle-plugin"
- }
-
- // 这是Maven的中央仓库,无需配置,直接声明就可以使用
- mavenCentral()
-
- // JCenter中央仓库,实际也是是用的maven搭建的,但相比Maven仓库更友好,通过CDN分发,并且支持https访问。
- // jcenter()
- }
- // dependencies闭包 依赖
- // 是用于声明这个项目依赖于哪些jar
- dependencies {
- implementation 'org.springframework.boot:spring-boot-starter-web'
-
- // implementation 'com.alibaba:druid-spring-boot-starter:1.1.18'
-
- implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
-
- implementation 'org.mybatis:mybatis-typehandlers-jsr310:1.0.2'
-
- implementation 'mysql:mysql-connector-java:5.1.47'
-
- implementation 'com.github.pagehelper:pagehelper-spring-boot-starter:1.2.12'
-
- implementation group: 'com.alibaba', name: 'fastjson', version: "1.2.53"
-
- implementation group: 'commons-io', name: 'commons-io', version: '2.6'
-
- compileOnly 'log4j:log4j:1.2.17'
-
- testCompile group: 'junit', name: 'junit', version: '4.12'
- }
(扩展)对于各种依赖方式的说明
每个依赖jar前面的关键字就是jar的依赖方式
implementation
这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。
api
完全等同于compile指令
compile
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
testCompile
testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。
debugCompile
debugCompile 只在debug模式的编译和最终的debug apk打包时有效。
releaseCompile
releaseCompile 仅仅针对Release模式的编译和最终的Release apk打包
provided
只在编译时有效,不会参与打包,可以在自己的moudle中使用该方式依赖。比如com.android.support,gson这些使用者常用的库,避免冲突。
apk(runtimeOnly)
只在生成apk的时候参与打包,编译时不会参与,很少用。
AS每次新建项目,都会默认在C盘生成并下载gradle相关文件,具体路径一般是:C:\Users\用户\ .gradle,怕C盘空间不够可以修改默认gradle路径
1、关闭Android Studio,复制gradle
复制C:\Users\用户.gradle文件夹下内容,到D:\Android\Gradle
2、配置系统变量
打开计算机系统属性→高级系统设置→环境变量→新建系统变量,添加变量名:GRADLE_USER_HOME,路径:D:\Android\Gradle(以gradle实际保存路径为准)
3、打开Android Studio ,设置gradle路径
在File→Settings→Build,Execution,Deployment→Build Tools→Gradle,修改Gradle user home路径为:D:\Android\Gradle(以gradle实际保存路径为准),这个是Gradle的总文件,下面是他的版本文件设置
Gradle有很多版本,Android Studio怎么知道该用哪个Gradle呢?
AS一个项目所用的Gradle是由我们的工程中下面这个文件决定的:
{your project}/gradle/wrapper/gradle-wrapper.properties
文件内容如下:
- #Tue Jan 30 14:32:27 CST 2024
- distributionBase=GRADLE_USER_HOME
- distributionPath=wrapper/dists
- zipStoreBase=GRADLE_USER_HOME
- zipStorePath=wrapper/dists
- distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.0.2-all.zip
- #distributionUrl=https://services.gradle.org/distributions//gradle/gradle-8.0.2-all.zip
最后一排的distributionUrl
决定了这个项目使用的gradle版本,也就是说不同的项目可以使用不同的gradle版本。
Android Studio打开一个工程时,首先会读取gradle-wrapper.properties
文件,从而知道这个工程需要哪个版本的gradle ,然后就会去保存gradle的文件夹GRADLE_USER_HOME
去找看存不存在这个版本的gradle,不存在则会去distributionUrl
去下载 。
这个是腾讯镜像,下载稳定。
上图中的Wrapper是根据gradle-wrapper.properties
文件配置Gradle,选择Local installations是已经有配置好的文件路径。
还不行的话手动下载gradle-8.0-all.zip将下载的radle-8.0-all.zip复制到上图中一串乱码的文件夹下,注意不要解压。这样我们就跳过了下载gradle这一步。AS运行后会自动解压,下图是解压后的。
local installation 的设置地址如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。