当前位置: 首页 > 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.lryc.cn/news/595541.html

相关文章:

  • 力扣刷题 -- 100.相同的树
  • 4.Java创建对象有几种方式?
  • repmgr+pgbouncer实现对业务透明的高可用切换
  • ANSYS 2025 R1软件下载及安装教程|附安装文件
  • 【实战】Dify从0到100进阶--文档解读(10)参数提取HTTP节点
  • 2025年一区SCI-回旋镖气动椭圆优化算法Boomerang Aerodynamic Ellipse-附Matlab免费代码
  • IFN影视官网入口 - 4K影视在线看网站|网页|打不开|下载
  • 【智能协同云图库】智能协同云图库第二期:基于腾讯云 COS 对象存储—开发图片各功能模块
  • next.js刷新页面时二级菜单展开状态判断
  • 234、回文链表
  • lesson20:Python函数的标注
  • CMake与catkin_make的find_package()命令使用说明
  • 基于Vue与CloudBase AI Toolkit的色觉识别Web应用开发报告:VibeCoding新范式实践
  • 14.7 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀
  • 工业仪表识别(一)环境安装
  • 数据结构-哈希表(一)哈希函数、哈希表介绍、优缺点
  • 人工智能之数学基础:事件间的关系
  • Js进阶案例合集
  • doker centos7安装1
  • 大模型中的Actor-Critic机制
  • 直播专用域名租用全解析:开启直播新境界
  • 计算机史前时代:从原始计数到机械曙光
  • 什么是GNN?——聚合、更新与循环
  • 计算机发展史:集成电路时代的微缩革命
  • 2025 最好的Coze入门到精通教程(上)
  • 时序顶会基础创新知识点-小波变换篇上
  • 设计系统搭建:大型 Pad 应用的协同开发解决方案
  • 优测发布IoT云联解决方案,赋能生态应用创新跨端体验!
  • 一文详解REST风格
  • WSL如何安装docker?