当前位置: 首页 > news >正文

Android Studio 的 Gradle 究竟是什么?

本文内容主要分为以下两个部分:

  1. 帮助各位同学初步了解 Gradle、Wrapper

  2. 简要介绍 Android Studio 中与 Gradle 相关的文件,它们之间如何协同配合工作以及相关的参数介绍

PS:本人是刚刚起步学习 Android,如有错误之处,烦请大家指正

话不多说,我们正式开始吧

目录

什么是 Gradle

什么是 Warpper

Gradle 的工作流程

gradlew 与 gradlew.bat 的区别

其余的 Gradle 相关文件

build.gradle(项目级)

常见参数及意义

该文件的作用

build.gradle(模块级)

常见参数及意义

该文件的主要作用

项目级与模块级 build.gradle 的区别

为什么需要多个 build.gradle 文件

setting.gradle


什么是 Gradle

在创建Android 项目时,一般都需要进到这个页面进行配置,我们重点关注一下下面被红框框住的这一行,这是最初与 gradle 相关的配置,其中的重点词汇就是 build、language、Groovy DSL,我们接下来从这三个词汇入手。

  • Gradle 既是一种工具,也是一种语言(Language),它负责项目的自动化构建(build)

  • 与 C++、Java等通用编程语言(GPL)不同,Gradle 是一种基于 Groovy(一种用于JVM的敏捷开发语言)的特定领域语言DSL

  • 通过 gradle,程序员就不需要进行一些复杂的操作,便可以完成项目的编译。

注(小知识):

  1. GPL(General Purpose Language):通用编程语言,是指被设计为各种应用领域服务的编程语言。通常通用编程语言不含有为特定应用领域设计的结构。包括 Objective-C、Java、Python 以及 C 语言等等。

  2. DSL(Domain Specific Language):特定领域语言,是指通过在表达能力上做的妥协换取在某一领域内的高效能力的语言。

什么是 Warpper

  • 定义:wrapper 是 Android Studio 项目中用于管理 Gradle 版本的工具

Gradle 的工作流程

先简单介绍一下这些文件各自的作用:

  • gradle-wrapper.jar :核心执行器,负责下载和运行 Gradle。

  • gradle-wrapper.properties:配置下载的地址和存储位置。

  • gradlew / gradlew.bat:启动脚本,根据操作系统选择执行方式。

接下来我们来看一下这些文件是如何协同工作的,这里我们以 Ubuntu系统举例

当开发者运行 ./gradlew build时,流程如下:

  1. 解析 gradlew 脚本

    1. 根据其中的 CLASSPATH 去寻找 gradle-wrapper.jar (Wrapper 的实现文件)
      CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  2. 读取 gradle-wrapper.properties
    1. 系统会去 gradle-wrapper.properties 中对应 zipStorePath 的文件夹去查找对应的 Gradle 版本,如果没有的话,就根据 distributionUrl 给出的链接去下载对应的版本

  3. 运行指定的 Gradle 任务

    1. 调用 Gradle :gradle-wrapper.jar 会启动解压后的 Gradle,执行用户输入的命令(如 buildassemble)。

    2. 构建项目 :Gradle 读取 build.gradle 文件,执行依赖解析、编译、打包等操作。

根据以上的信息,可以得出以下结论:

  • 通过指定固定版本的 Gradle ,保证了所有开发者在构建项目时都使用相同的 Gradle 版本,从而减少构建差异。

  • 但也有一些缺点,即不同的项目配置文件中配置的版本不一致的话,在开发环境中就会下载各种各样的gradle版本,会占用硬盘空间。

gradlew 与 gradlew.bat 的区别

场景Windows(gradlew.bat)Linux/macOS(gradlew)
运行构建任务gradlew.bat build./gradlew build
权限要求无需额外权限(直接运行)需赋予可执行权限:chmod +x gradlew

其余的 Gradle 相关文件

build.gradle(项目级)
  • 位于项目的根目录,用于配置整个项目的全局位置参数

常见参数及意义
// 配置 Gradle 插件本身的依赖和仓库。
buildscript {ext.kotlin_version = '1.8.0' // 定义全局变量供模块级 build.gradle 使用// 声明依赖库的下载源(如 Google 官方仓库、Maven 中央仓库)。repositories {google() // 使用 Google 的 Maven 仓库mavenCentral() // 使用 Maven Central 仓库}// 声明项目构建所需的工具依赖(如 Android Gradle 插件)(到 repositories 里给出的仓库里去寻找并下载)。dependencies {classpath 'com.android.tools.build:gradle:x.x.x' // Android Gradle 插件版本classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // Kotlin 插件}
}
该文件的作用
  • 统一管理多模块共享的配置(如仓库地址、插件版本)。

  • 通过 ext 定义全局变量,避免重复配置。

build.gradle(模块级
  • 位于模块目录下(如 applibrary 模块),用于配置该模块的构建细节。

常见参数及意义
plugins {alias(libs.plugins.android.application) // 应用模块插件alias(libs.plugins.kotlin.android) // Kotlin 插件alias(libs.plugins.kotlin.compose)
}android {namespace 'com.example.myapplication' // 模块的包名(用于代码引用)compileSdk 36 // 编译时使用的 Android SDK 版本defaultConfig {applicationId "com.example.myapplication" // 应用唯一标识(包名)minSdk 24 // 最低支持的 Android 版本targetSdk 36 // 目标 SDK 版本versionCode 1 // 应用版本号(整数,用于更新判断)versionName "1.0" // 应用版本名称(显示给用户)}testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled false // 是否启用代码混淆// 混淆规则文件proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_11 // 告诉编译器:主代码要使用Java 11的语法和特性targetCompatibility JavaVersion.VERSION_11 // 生成的字节码也要兼容JVM 11版本}kotlinOptions { // 要求Kotlin编译器生成的代码也要兼容Java 11,避免出现版本错位导致的运行时错误。jvmTarget = '11'}buildFeatures {// 开启Jetpack Compose的编译支持,令系统处理@Composable注解生成对应的UI代码。compose true}
}dependencies {/*implementation 是通用依赖,主程序的必需品,所有变体都能用。testImplementation 只在运行本地测试时运行。androidTestImplementation 专门处理运行在真机/模拟器上的测试依赖。debugImplementation 只在 debug 包生效。举个例子:当发布 release 版本时,debugImplementation 里的依赖就像隐身衣一样消失不见,而 testImplementation 的依赖永远不会出现在APK里。*/implementation libs .androidx.core.ktximplementation libs.androidx.lifecycle.runtime.ktximplementation libs.androidx.activity.composeimplementation platform(libs.androidx.compose.bom)implementation libs.androidx.uiimplementation libs.androidx.ui.graphicsimplementation libs.androidx.ui.tooling.previewimplementation libs.androidx.material3testImplementation libs.junitandroidTestImplementation libs.androidx.junitandroidTestImplementation libs.androidx.espresso.coreandroidTestImplementation platform(libs.androidx.compose.bom)androidTestImplementation libs.androidx.ui.test.junit4debugImplementation libs.androidx.ui.toolingdebugImplementation libs.androidx.ui.test.manifest
}

小知识:

  1. plugin 参数

    1. Gradle 并不是专门为 Android 服务,所以 Gradle 它本身是不提供对 Android Stduio 的任何构建功能的。但 Gradle 提供了插件机制,这种插件它提供里大量的任务类型、任务、属性等,而开发者只需要在 build.gradle 中使用 alias(插件名)即可引入该插件包含的所有的功能。

    2. Google 为了开发 Android 应用定制了一个插件 Android Plugin DSL。所以这一行指定了该构件文件应用的插件,Android 项目的构建都需要使用 libs.plugins.android.application 这个插件。

  2. 代码混淆与混淆规则文件

    1. 代码混淆:压缩、优化和混淆代码,减少APK体积并保护代码安全。

    2. 混淆规则文件:保持某些类不被混淆,自定义配置规则等。

    3. 代码混淆就像给代码加密:把类名 A 变成 a、方法名 doSomething 变成 a(),同时移除未使用的代码。这会让反编译后的代码变成天书,保护源码逻辑。

    4. 混淆规则文件就像加密指南:proguard-android-optimize.txt 是 Android 官方预设的安全规则,proguard-rules.pro是你的自定义规则。比如用 -keep class com.example.KeepMe 这行规则,就能让 KeepMe 类保持原样不被混淆。

该文件的主要作用
  • 决定模块的构建规则(如生成 APK/AAR)和功能支持(如 Kotlin、Jetpack Compose)。

项目级与模块级 build.gradle 的区别

配置项根目录 build.gradle模块级 build.gradle
作用范围全局配置,影响整个项目模块私有配置,仅影响当前模块
主要参数buildscript(仓库、插件依赖)android(模块构建参数)、dependencies(模块依赖)
插件类型仅声明构建工具插件(如 Gradle)应用具体插件(如 application、library)
依赖声明项目工具依赖(如 Gradle 插件)模块运行时依赖(如第三方库)

为什么需要多个 build.gradle 文件
  1. 模块化管理 :每个模块(如 app、library)可以独立配置构建参数(如 SDK 版本、依赖库)。例如,app 模块使用 compileSdk 34,而 library 模块使用 compileSdk 33。

  2. 复用与共享配置 :根目录的 build.gradle 统一声明仓库和插件版本等全局参数,避免多模块重复配置。

  3. 依赖隔离 :不同模块可以依赖不同的库版本,避免冲突。

setting.gradle

// 示例
rootProject.name = "My Application"
include ':app'

这里面包含了你的子项目,也就是你项目中的 module,假如刚新建好的项目那么就只包含一个 'app' module。如果你新建了其他 module,它也会包含在这里面。

在构建的初始化阶段,settings.gradle 会提供这次构建项目所要包含的哪些 module。

如果你新建一个 'demo' module 的话,这里就会变成

rootProject.name = "My Application" include ':app',':demo'

好啦,有关 Gradle 就先介绍到这里了,大家有任何疑问欢迎在评论区留言

希望大家生活天天开心,代码越写越好,艾薇巴蒂,我们下期再见啦!

http://www.dtcms.com/a/291363.html

相关文章:

  • Telink BLE 低功耗学习
  • Vue接口平台学习十一——业务流测试
  • AWS Certified Cloud Practitioner 认证考试总结
  • GoLand安装指南
  • docker 容器学习
  • LeetCode 刷题【10. 正则表达式匹配】
  • CCF-GESP 等级考试 2025年6月认证C++六级真题解析
  • OTA升级失败,端口占用bind: Address already in use
  • 酵母杂交技术解析
  • 微服务项目文档
  • ABeam News | 中野洋辅董事长专访:扎根上海二十载,做中日企业的卓越桥梁
  • 【人工智能99问】什么是教师强制?(16/99)
  • Spring Cache 扩展:Redis 批量操作优化方案与 BatchCache 自定义实现
  • 2130、链表最大孪生和
  • rsync报错解决
  • Shopify 知识点
  • 草木知音的认知进化:Deepoc具身智能如何让除草机读懂花园的呼吸
  • 设备监控之数据处理(1)-概述
  • MQ 核心知识点笔记
  • Android开发中卡顿治理方案
  • 用基础模型构建应用(第十章)AI Engineering: Building Applications with Foundation Models学习笔记
  • 如何用纯 HTML 文件实现 Vue.js 应用,并通过 CDN 引入 Element UI
  • 【PHP 流程控制完全指南】
  • 多端适配灾难现场:可视化界面在PC/平板/大屏端的响应式布局实战
  • .NET依赖注入IOC你了解吗?
  • 开发避坑短篇(3):解决@vitejs plugin-vue@5.0.5对Vite^5.0.0的依赖冲突
  • 万界星空科技锂电池MES解决方案
  • Shell判断结构
  • voice模块
  • 【图论】CF——B. Chamber of Secrets (0-1BFS)