Gradle安装与Android Studio设置(想必你也想吐槽一下Gradle吧!!)
温馨提示本文对Gradle的安装与环境变量设置不做具体先容,重点内容是反面Gradle对于init.gradle文件的设置以及Android Studio设置Gradle(不用Wrapper),并不想听废话的直接跳转点击跳转到本文正文部分,前面废话的内容主要是表明Gradle3个文件的设置优先级,也就是后续实例演示时为什么要如许设置?
https://i-blog.csdnimg.cn/direct/623e3e609bcb432aacf319302569fdfe.png
Android Studio
Android Studio 是基于 IntelliJ IDEA 的用于开发 Android 应用的官方集成开发环境 (IDE)。
但是和IDEA差别的是,Android Studio 完全免费,所以不要因为思维惯性傻傻地去搜软件绿色版。
Gradle
Android Studio是基于Gradle的机动构建系统,所以Gradle和ANdroid Studio的关系就像火腿肠和泡面,完善搭档,缺谁谁都难受。
其我第一眼看到Gradle并没有多么畏惧,从它的功能来说,与Java开发的Maven区别不大。
但是,当我使用时,发现它的外在构建逻辑会比Maven更加难理解。
咱们先不说安装过程,先提及几个概念
下面这张图是Gradle官网的先容:
[*] 左边虚线框涉及2个重要概念,setting.gradle文件,build.gradle 文件 ,项目源码本身爱咋写咋写不重要。
[*] 中心虚线框(也就是Gradle本体)会读取setting.gradle文件,build.gradle 文件,并将自身缓存,外部插件与外部依靠都加载到构建流中,然后输出右边虚线框打包后的文件,我们并不需对右边虚线框做过多了解,那一般是运维测试该干的事。
https://i-blog.csdnimg.cn/direct/fe22305b21914131ab8fb82d04904556.png
理解重点
文章开头Gradle先容提及过两个概念,也就是setting.gradle文件,build.gradle文件,以及前文在设置过程中需要设置的init.gradle文件,一共3个重要概念。理解这3个概念后,才是真正学会了Gradle的外在构建逻辑。
1. settings.gradle
作用:
[*]主要用于设置项目的层次结构和多模块项目的模块包含关系。
[*]定义项目的根目录名称和包含的子模块。
常见设置内容:
[*]rootProject.name: 设置根项目的名称。
[*]include: 包含子模块。比方,include 'app', 'lib' 表现项目包含 app 和 lib 两个子模块。
示例:
rootProject.name = 'MyAwesomeProject'
include 'app', 'lib'
2. init.gradle
作用:
[*]用于在Gradle构建开始之前执行一些初始化操作。
[*]通常用于全局设置,好比设置仓库、插件、属性等。
常见设置内容:
[*]设置全局的仓库、插件、属性等。
[*]可以在用户的主目录下放置一个全局的 init.gradle,如许全部的Gradle项目都会应用这些设置。
示例:
allprojects {
repositories {
mavenCentral()
}
}
3. build.gradle
作用:
[*]定义项目的构建脚本,包括依靠、插件、使命等。
[*]每个模块都有本身的 build.gradle 文件。
常见设置内容:
[*]plugins: 声明使用的插件。
[*]dependencies: 声明项目的依靠。
[*]repositories: 声明依靠的仓库。
[*]tasks: 定义自定义使命。
示例:
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.guava:guava:31.0.1-jre'
}
task hello {
doLast {
println 'Hello, World!'
}
}
Gradle安装与设置
这里偷个懒,网上这方面的文章已经很多了,前面的环境设置大差不差,但是对于init.gradle文件的设置五花八门,一连试了好几个博文的,都不太管用。所以我只说最关键的init.gradle的文件设置内容。
// Gradle 全局配置
settingsEvaluated { settings ->
println "Configuring pluginManagement repositories..."
settings.pluginManagement {
repositories {
// 首先尝试使用阿里云 Maven 镜像仓库
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://maven.aliyun.com/repository/spring-plugin" }
// 如果阿里云仓库无法解析,回退到官方仓库
gradlePluginPortal()// Gradle 官方插件仓库
google() // Google 官方 Maven 仓库
mavenCentral() // Maven Central 仓库
}
}
}
buildscript {
repositories {
println "Configuring buildscript repositories..."
// 首先尝试使用阿里云 Maven 镜像仓库
maven { url "https://maven.aliyun.com/repository/google" }
maven { url "https://maven.aliyun.com/repository/central" }
maven { url "https://maven.aliyun.com/repository/public" }
// 如果阿里云仓库无法解析,回退到官方仓库
google()
mavenCentral()
}
allprojects {
println "Configuring repositories for all projects: ${project.name}"
repositories {
// 首先尝试使用阿里云 Maven 镜像仓库
maven { url "https://maven.aliyun.com/repository/google" }
maven { url "https://maven.aliyun.com/repository/central" }
maven { url "https://maven.aliyun.com/repository/public" }
// 如果阿里云仓库无法解析,回退到官方仓库
google()
mavenCentral()
}
}
}
优先级关系
当这些文件中的设置发生冲突时,Gradle会按照以下优先级来决定使用哪个设置:
[*]build.gradle: 优先级最高,因为它是最具体的构建脚本,直接定义了项目的构建行为。
[*]settings.gradle: 优先级次之,主要用于项目结构的设置,不会直接覆盖 build.gradle 中的设置。
[*]init.gradle: 优先级最低,通常用于全局设置,不会覆盖项目级别的设置。
实例展示(这里仅先容groxy语法构建的项目)
[*] 创建一个空视图(Empty Views Activity)项目,留意别用上面的Empty Activity,那是kotlin语法的项目。不拿Android当就业方向的同学最好少碰,否则又多一份学习成本。
https://i-blog.csdnimg.cn/direct/f007db0d492b4df2b674430672c9168c.png
[*] 选择build.gradle的构建语法
https://i-blog.csdnimg.cn/direct/d24b46b9ccb24675ac971070436e02e7.png
[*] 项目创建时默认模板目录结构展示
https://i-blog.csdnimg.cn/direct/9c39992c521a4ae690a28d99838a2050.png
[*] 这时你会发现右下角有弹窗在下载Gradle而且网速慢到出奇,因为此时你并没有对Android Studio的Gradle进行设置。
https://i-blog.csdnimg.cn/direct/885c5282be3f41fe8f34344d549e190a.png
[*] 在setting里找到Gradle的相关设置,(大概2023后版本比较新,每次新建项目我都要改这个,如今还没找到让Android Studio全局克制wrapper下载的方法,知道的朋侪也可以分享一下)
Gradle user home(Gradle下载文件存储位置)
作用:指定下载位置,避免C盘炸裂
Gradle Distribution(Gradle 分发)
作用:指定 Gradle 的版本和来源。
表明:Gradle 是 Android Studio 用于构建项目的工具。Distribution 设置决定了 Gradle 的版本(如 7.0、8.0 等)以及是从本地缓存加载还是从长途仓库下载。
Gradle JDK(Gradle JDK 设置)
作用:指定 Gradle 使用的 JDK 版本。
表明:Gradle 在构建项目时需要一个 JDK 来执行 Java 代码。此设置决定了 Gradle 使用哪个 JDK 版本(如 JDK 11、JDK 17 等)。如果项目需要特定的 JDK 版本,可以通过这里进行设置。通常建议选择与项目兼容的 JDK 版本。
https://i-blog.csdnimg.cn/direct/5ece6f6a0b094c218199dc0223cbdf40.png
6. 修改成下图设置
使用本地的Gradle,JDK不需要用1.8,大多数项目把兼容下限都放到了JDK-17,用Android Studio自带的就好。
https://i-blog.csdnimg.cn/direct/f521e831295b4fdbacce1f4267b54fd1.png
[*] 清空缓存重启Android Studio,会主动弹出一个代理窗口,直接点叉叉或者no关掉它
https://i-blog.csdnimg.cn/direct/39495c8565534d50a3fe85aaa79dacb1.png
[*] 如今我的Gradle已经切换到本地了,但是会报错,就不翻译了,这段说人话就是Gradle优先使用setting.gradle(项目级作用域文件)设置了Maven仓库,但是init.gradle文件(全局级设置文件)也设置了Maven仓库。
吐槽一下:既然项目级设置文件优先于全局级设置文件,那就直接暴力覆盖全局级设置文件就好了,还告诉我干吗?你觉得我刚入门安卓会知道咋干吗?
FAILURE: Build failed with an exception.
* Where:
Initialization script 'D:\development_soft\Gradle\gradle-8.6\init.d\init.gradle' line: 25
* What went wrong:
Build was configured to prefer settings repositories over project
repositories but repository 'maven' was added by initialization script
'D:\development_soft\Gradle\gradle-8.6\init.d\init.gradle'
这里不得不提Gradle的计划哲学了,从团体来看没啥问题,就是比较折腾入门的小白
https://i-blog.csdnimg.cn/direct/5b163661d8504e2995ba47a355f3f8ad.gif
Gradle 不直接覆盖设置的原因是为了确保依靠管理的明确性和一致性,避免因设置冲突导致的不可预测问题。报错的目的是提示开发者手动解决冲突,而不是让 Gradle 主动处理,如许可以提高项目的稳定性和可维护性。
依靠冲突:如果 Gradle 随意覆盖设置,大概会导致项目中某些模块的依靠被意外替换,从而引发编译错误或运行时问题。
可维护性:明确的设置优先级规则可以让开发者清晰地知道哪些设置会见效,避免因设置冲突导致的调试困难。
安全性:在大型项目中,依靠管理是核心部分,Gradle 需要确保设置的明确性和一致性,而不是依靠于“覆盖”这种不可控的行为。
[*]既然报错给我们了,那就老诚实实改咯,点击检察setting.gradle默认模板文件内容,老早之前全局级别的init.gradle就改好了(改它就是为了一劳多逸),除了最下面那两行,全删撤除就好了。
// 插件管理配置块,用于定义插件的来源和管理规则
pluginManagement {
// 定义插件的仓库来源
repositories {
// 配置 Google Maven 仓库
google {
// 使用 content 块限制从 Google Maven 仓库中加载的依赖范围
content {
// 包含以 "com.android.*" 开头的依赖
includeGroupByRegex("com\\.android.*")
// 包含以 "com.google.*" 开头的依赖
includeGroupByRegex("com\\.google.*")
// 包含以 "androidx.*" 开头的依赖
includeGroupByRegex("androidx.*")
}
}
// 配置 Maven Central 仓库
mavenCentral()
// 配置 Gradle 插件门户(用于查找和下载 Gradle 插件)
gradlePluginPortal()
}
}
// 依赖解析管理配置块,用于定义项目依赖的仓库来源和解析规则
dependencyResolutionManagement {
// 设置仓库模式为 FAIL_ON_PROJECT_REPOS
// 这意味着 Gradle 会优先使用 settings-level 的仓库(如 google() 和 mavenCentral()),
// 而忽略项目中单独定义的仓库(除非明确允许)。
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
// 定义依赖的仓库来源
repositories {
// 使用 Google Maven 仓库
google()
// 使用 Maven Central 仓库
mavenCentral()
}
}
rootProject.name = "Hello"
include ':app'
补充知识点:
repositoriesMode 是 Gradle 提供的一种设置方式,用于控制项目中依靠仓库的优先级和使用规则。它有以下三种模式:
PREFER_PROJECT
形貌:优先使用项目中定义的仓库(即在 build.gradle 文件中定义的仓库)。如果项目中没有定义仓库,则会使用 settings.gradle 中定义的仓库。
默认值:是的。
适用场景:适用于团队需要为差别子项目使用特定仓库的场景。
PREFER_SETTINGS
形貌:优先使用 settings.gradle 中定义的仓库,忽略项目中定义的仓库。
默认值:否。
适用场景:适用于需要在大型团队中逼迫使用同一的仓库设置。
FAIL_ON_PROJECT_REPOS
形貌:如果项目中定义了仓库(无论是直接定义还是通过插件定义),则会触发构建错误。
默认值:否。
适用场景:严格逼迫使用 settings.gradle 中定义的仓库,避免项目中意外定义仓库。
[*]留下最后两行,点击右边那个下载的图标
https://i-blog.csdnimg.cn/direct/8108142b13fd49a1b51b9386af4efd3c.png
[*]看构建控制台有没有报错,有问题可以再批评区讨论,我这里因为是在本地仓库已经有缓存了,所以啥也没下,1秒就构建好了
https://i-blog.csdnimg.cn/direct/48e3c3cb011f46af8fa90d6d697e44c8.png
拜拜
随便弄一个假造机(如果是新电脑或者从没用过假造机,第一次运行假造机大概需要在控制面板改点东西,这个网络上有解决办法),运行就成功了
https://i-blog.csdnimg.cn/direct/eff5d6b796944cdfbebfdf42d76cf332.png
提桶跑路
页:
[1]