温馨提示

本文对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官网的介绍:

  1. 左边虚线框涉及2个重要概念,setting.gradle文件build.gradle 文件 ,项目源码自己爱咋写咋写不重要。

  2. 中间虚线框(也就是Gradle本体)会读取setting.gradle文件build.gradle 文件,并将自身缓存,外部插件外部依赖都加载到构建流中,然后输出右边虚线框打包后的文件,我们并不需对右边虚线框做过多了解,那一般是运维测试该干的事。

在这里插入图片描述

理解重点

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

1. settings.gradle

作用:

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

常见配置内容:

  • rootProject.name: 设置根项目的名称。
  • include: 包含子模块。例如,include 'app', 'lib' 表示项目包含 applib 两个子模块。

示例:

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会按照以下优先级来决定使用哪个配置:

  1. build.gradle: 优先级最高,因为它是最具体的构建脚本,直接定义了项目的构建行为。
  2. settings.gradle: 优先级次之,主要用于项目结构的配置,不会直接覆盖 build.gradle 中的配置。
  3. init.gradle: 优先级最低,通常用于全局配置,不会覆盖项目级别的配置。

实例展示(这里仅介绍groxy语法构建的项目)

  1. 创建一个空视图(Empty Views Activity)项目,注意别用上面的Empty Activity,那是kotlin语法的项目。不拿Android当就业方向的同学最好少碰,不然又多一份学习成本。
    在这里插入图片描述

  2. 选择build.gradle的构建语法
    在这里插入图片描述

  3. 项目创建时默认模板目录结构展示
    在这里插入图片描述

  4. 这时你会发现右下角有弹窗在下载Gradle而且网速慢到出奇,因为此时你并没有对Android Studio的Gradle进行配置。
    在这里插入图片描述

  5. 在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自带的就好。
在这里插入图片描述

  1. 清空缓存重启Android Studio,会自动弹出一个代理窗口,直接点叉叉或者no关掉它
    在这里插入图片描述

  2. 现在我的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的设计哲学了,从整体来看没啥问题,就是比较折腾入门的小白
请添加图片描述

Gradle 不直接覆盖配置的原因是为了确保依赖管理的明确性和一致性,避免因配置冲突导致的不可预测问题。报错的目的是提醒开发者手动解决冲突,而不是让 Gradle 自动处理,这样可以提高项目的稳定性和可维护性。

依赖冲突:如果 Gradle 随意覆盖配置,可能会导致项目中某些模块的依赖被意外替换,从而引发编译错误或运行时问题。
可维护性:明确的配置优先级规则可以让开发者清楚地知道哪些配置会生效,避免因配置冲突导致的调试困难。
安全性:在大型项目中,依赖管理是核心部分,Gradle 需要确保配置的明确性和一致性,而不是依赖于“覆盖”这种不可控的行为。

  1. 既然报错给我们了,那就老老实实改咯,点击查看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 中定义的仓库,避免项目中意外定义仓库。

  1. 留下最后两行,点击右边那个下载的图标
    在这里插入图片描述
  2. 看构建控制台有没有报错,有问题可以再评论区讨论,我这里因为是在本地仓库已经有缓存了,所以啥也没下,1秒就构建好了
    在这里插入图片描述

拜拜

随便弄一个虚拟机(如果是新电脑或者从没用过虚拟机,第一次运行虚拟机可能需要在控制面板改点东西,这个网络上有解决办法),运行就成功了
在这里插入图片描述
提桶跑路🤣🤣🤣🤣🤣🤣🤣🤣
请添加图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐