Gradle安装与Android Studio设置(想必你也想吐槽一下Gradle吧!!) ...

打印 上一主题 下一主题

主题 1534|帖子 1534|积分 4602

温馨提示

   本文对Gradle的安装与环境变量设置不做具体先容,重点内容是反面Gradle对于init.gradle文件的设置以及Android Studio设置Gradle(不用Wrapper),并不想听废话的直接跳转点击跳转到本文正文部分,前面废话的内容主要是表明Gradle3个文件的设置优先级,也就是后续实例演示时为什么要如许设置?
  

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 文件,并将自身缓存,外部插件与外部依靠都加载到构建流中,然后输出右边虚线框打包后的文件,我们并不需对右边虚线框做过多了解,那一般是运维测试该干的事。

理解重点

文章开头Gradle先容提及过两个概念,也就是setting.gradle文件,build.gradle文件,以及前文在设置过程中需要设置的init.gradle文件,一共3个重要概念。理解这3个概念后,才是真正学会了Gradle的外在构建逻辑。
1. settings.gradle

作用:


  • 主要用于设置项目的层次结构和多模块项目的模块包含关系。
  • 定义项目的根目录名称和包含的子模块。
常见设置内容:


  • rootProject.name: 设置根项目的名称。
  • include: 包含子模块。比方,include 'app', 'lib' 表现项目包含 app 和 lib 两个子模块。
示例:
  1. rootProject.name = 'MyAwesomeProject'
  2. include 'app', 'lib'
复制代码
2. init.gradle

作用:


  • 用于在Gradle构建开始之前执行一些初始化操作。
  • 通常用于全局设置,好比设置仓库、插件、属性等。
常见设置内容:


  • 设置全局的仓库、插件、属性等。
  • 可以在用户的主目录下放置一个全局的 init.gradle,如许全部的Gradle项目都会应用这些设置。
示例:
  1. allprojects {
  2.     repositories {
  3.         mavenCentral()
  4.     }
  5. }
复制代码
3. build.gradle

作用:


  • 定义项目的构建脚本,包括依靠、插件、使命等。
  • 每个模块都有本身的 build.gradle 文件。
常见设置内容:


  • plugins: 声明使用的插件。
  • dependencies: 声明项目的依靠。
  • repositories: 声明依靠的仓库。
  • tasks: 定义自定义使命。
示例:
  1. plugins {
  2.     id 'java'
  3. }
  4. repositories {
  5.     mavenCentral()
  6. }
  7. dependencies {
  8.     implementation 'com.google.guava:guava:31.0.1-jre'
  9. }
  10. task hello {
  11.     doLast {
  12.         println 'Hello, World!'
  13.     }
  14. }
复制代码

Gradle安装与设置

这里偷个懒,网上这方面的文章已经很多了,前面的环境设置大差不差,但是对于init.gradle文件的设置五花八门,一连试了好几个博文的,都不太管用。所以我只说最关键的init.gradle的文件设置内容。
  1. // Gradle 全局配置
  2. settingsEvaluated { settings ->
  3.     println "Configuring pluginManagement repositories..."
  4.     settings.pluginManagement {
  5.         repositories {
  6.             // 首先尝试使用阿里云 Maven 镜像仓库
  7.             maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
  8.             maven { url "https://maven.aliyun.com/repository/spring-plugin" }
  9.             // 如果阿里云仓库无法解析,回退到官方仓库
  10.             gradlePluginPortal()  // Gradle 官方插件仓库
  11.             google()             // Google 官方 Maven 仓库
  12.             mavenCentral()       // Maven Central 仓库
  13.         }
  14.     }
  15. }
  16. buildscript {
  17.     repositories {
  18.         println "Configuring buildscript repositories..."
  19.         // 首先尝试使用阿里云 Maven 镜像仓库
  20.         maven { url "https://maven.aliyun.com/repository/google" }
  21.         maven { url "https://maven.aliyun.com/repository/central" }
  22.         maven { url "https://maven.aliyun.com/repository/public" }
  23.         // 如果阿里云仓库无法解析,回退到官方仓库
  24.         google()
  25.         mavenCentral()
  26.     }
  27.     allprojects {
  28.         println "Configuring repositories for all projects: ${project.name}"
  29.         repositories {
  30.             // 首先尝试使用阿里云 Maven 镜像仓库
  31.             maven { url "https://maven.aliyun.com/repository/google" }
  32.             maven { url "https://maven.aliyun.com/repository/central" }
  33.             maven { url "https://maven.aliyun.com/repository/public" }
  34.             // 如果阿里云仓库无法解析,回退到官方仓库
  35.             google()
  36.             mavenCentral()
  37.         }
  38.     }
  39. }
复制代码
优先级关系

当这些文件中的设置发生冲突时,Gradle会按照以下优先级来决定使用哪个设置:

  • build.gradle: 优先级最高,因为它是最具体的构建脚本,直接定义了项目的构建行为。
  • settings.gradle: 优先级次之,主要用于项目结构的设置,不会直接覆盖 build.gradle 中的设置。
  • init.gradle: 优先级最低,通常用于全局设置,不会覆盖项目级别的设置。
实例展示(这里仅先容groxy语法构建的项目)


  • 创建一个空视图(Empty Views Activity)项目,留意别用上面的Empty Activity,那是kotlin语法的项目。不拿Android当就业方向的同学最好少碰,否则又多一份学习成本。

  • 选择build.gradle的构建语法

  • 项目创建时默认模板目录结构展示

  • 这时你会发现右下角有弹窗在下载Gradle而且网速慢到出奇,因为此时你并没有对Android Studio的Gradle进行设置。

  • 在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 版本。

6. 修改成下图设置
使用本地的Gradle,JDK不需要用1.8,大多数项目把兼容下限都放到了JDK-17,用Android Studio自带的就好。


  • 清空缓存重启Android Studio,会主动弹出一个代理窗口,直接点叉叉或者no关掉它

  • 如今我的Gradle已经切换到本地了,但是会报错,就不翻译了,这段说人话就是Gradle优先使用setting.gradle(项目级作用域文件)设置了Maven仓库,但是init.gradle文件(全局级设置文件)也设置了Maven仓库。
吐槽一下:既然项目级设置文件优先于全局级设置文件,那就直接暴力覆盖全局级设置文件就好了,还告诉我干吗?你觉得我刚入门安卓会知道咋干吗?
  1. FAILURE: Build failed with an exception.
  2. * Where:
  3. Initialization script 'D:\development_soft\Gradle\gradle-8.6\init.d\init.gradle' line: 25
  4. * What went wrong:
  5. Build was configured to prefer settings repositories over project
  6. repositories but repository 'maven' was added by initialization script
  7. 'D:\development_soft\Gradle\gradle-8.6\init.d\init.gradle'
复制代码
这里不得不提Gradle的计划哲学了,从团体来看没啥问题,就是比较折腾入门的小白

Gradle 不直接覆盖设置的原因是为了确保依靠管理的明确性和一致性,避免因设置冲突导致的不可预测问题。报错的目的是提示开发者手动解决冲突,而不是让 Gradle 主动处理,如许可以提高项目的稳定性和可维护性。
   依靠冲突:如果 Gradle 随意覆盖设置,大概会导致项目中某些模块的依靠被意外替换,从而引发编译错误或运行时问题。
可维护性:明确的设置优先级规则可以让开发者清晰地知道哪些设置会见效,避免因设置冲突导致的调试困难。
安全性:在大型项目中,依靠管理是核心部分,Gradle 需要确保设置的明确性和一致性,而不是依靠于“覆盖”这种不可控的行为。
  

  • 既然报错给我们了,那就老诚实实改咯,点击检察setting.gradle默认模板文件内容,老早之前全局级别的init.gradle就改好了(改它就是为了一劳逸),除了最下面那两行,全删撤除就好了。
  1. // 插件管理配置块,用于定义插件的来源和管理规则
  2. pluginManagement {
  3.     // 定义插件的仓库来源
  4.     repositories {
  5.         // 配置 Google Maven 仓库
  6.         google {
  7.             // 使用 content 块限制从 Google Maven 仓库中加载的依赖范围
  8.             content {
  9.                 // 包含以 "com.android.*" 开头的依赖
  10.                 includeGroupByRegex("com\\.android.*")
  11.                 // 包含以 "com.google.*" 开头的依赖
  12.                 includeGroupByRegex("com\\.google.*")
  13.                 // 包含以 "androidx.*" 开头的依赖
  14.                 includeGroupByRegex("androidx.*")
  15.             }
  16.         }
  17.         // 配置 Maven Central 仓库
  18.         mavenCentral()
  19.         // 配置 Gradle 插件门户(用于查找和下载 Gradle 插件)
  20.         gradlePluginPortal()
  21.     }
  22. }
  23. // 依赖解析管理配置块,用于定义项目依赖的仓库来源和解析规则
  24. dependencyResolutionManagement {
  25.     // 设置仓库模式为 FAIL_ON_PROJECT_REPOS
  26.     // 这意味着 Gradle 会优先使用 settings-level 的仓库(如 google() 和 mavenCentral()),
  27.     // 而忽略项目中单独定义的仓库(除非明确允许)。
  28.     repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  29.     // 定义依赖的仓库来源
  30.     repositories {
  31.         // 使用 Google Maven 仓库
  32.         google()
  33.         // 使用 Maven Central 仓库
  34.         mavenCentral()
  35.     }
  36. }
  37. rootProject.name = "Hello"
  38. include ':app'
复制代码
补充知识点:
repositoriesMode 是 Gradle 提供的一种设置方式,用于控制项目中依靠仓库的优先级和使用规则。它有以下三种模式:
PREFER_PROJECT
   形貌:优先使用项目中定义的仓库(即在 build.gradle 文件中定义的仓库)。如果项目中没有定义仓库,则会使用 settings.gradle 中定义的仓库。
默认值:是的。
适用场景:适用于团队需要为差别子项目使用特定仓库的场景。
  PREFER_SETTINGS
   形貌:优先使用 settings.gradle 中定义的仓库,忽略项目中定义的仓库。
默认值:否。
适用场景:适用于需要在大型团队中逼迫使用同一的仓库设置。
  FAIL_ON_PROJECT_REPOS
   形貌:如果项目中定义了仓库(无论是直接定义还是通过插件定义),则会触发构建错误。
默认值:否。
适用场景:严格逼迫使用 settings.gradle 中定义的仓库,避免项目中意外定义仓库。
  

  • 留下最后两行,点击右边那个下载的图标

  • 看构建控制台有没有报错,有问题可以再批评区讨论,我这里因为是在本地仓库已经有缓存了,所以啥也没下,1秒就构建好了

拜拜

随便弄一个假造机(如果是新电脑或者从没用过假造机,第一次运行假造机大概需要在控制面板改点东西,这个网络上有解决办法),运行就成功了

提桶跑路

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表