构建依赖项是成功构建项目所需的外部组件。构建可以依赖于 库、插件、子项目、Android SDK、工具(例如 Kotlin 和 Java 编译器)、开发环境(如 Android Studio)以及 Gradle 本身。
每个依赖项本身可能需要其他依赖项。我们将这些称为传递依赖项,并且可以快速增加应用使用的总依赖项。当您想要升级依赖项时,无论是库、工具还是 Android SDK,该升级都可能级联,从而升级许多其他依赖项。
通常,这不会造成任何问题,因为许多库都遵循称为 语义版本控制 的方案。这些库限制了它们进行的更改类型,以确保与较低版本兼容。
语义版本控制遵循 major.minor.patch
格式。例如,在版本号 4.8.3 中,4 是 major
版本,8 是 minor
版本,3 是 patch
版本号。当 major
部分发生变化时,库的 API 或行为可能存在重大更改。这可能会影响您的构建或应用行为。
当 minor
(新功能)或 patch
(错误修复)部分发生变化时,库开发者会告诉您库仍然兼容,并且不应影响您的应用。
务必注意此类更改,并且有几个 依赖项升级工具 可以提供帮助。
构建中的关系
Android 构建包含以下之间的关系
- 源代码 - 您控制的代码和资源
- 库依赖项 - 项目和子项目在构建时包含的外部库或模块
- 工具 - 将您的源代码转换为应用或库的编译器、插件和 SDK
源代码
您的源代码是您在应用或库中编写的 Kotlin 或 Java 代码。(有关使用 C++ 的详细信息,请参阅 Android NDK。)
源代码依赖于库(包括 Kotlin 和 Java 运行时库)和 Android SDK,并需要其相应的 Kotlin 或 Java 编译器。
一些源代码包含需要额外处理的注释。例如,如果您正在编写 Jetpack Compose 代码,则会添加诸如 @Composable
之类的注释,这些注释需要由 Compose Kotlin 编译器插件 处理。其他注释可能由 Kotlin 符号处理器 (KSP) 或单独的 注释处理工具 处理。
库依赖项
库包含作为应用程序一部分引入的字节码。这可能是 Java JAR、Android 库 (AAR) 或构建中的子项目。许多库遵循语义版本控制,这可以帮助您了解在升级时它们何时保持兼容(或不兼容)。
库可能依赖于其他库以实现重用,称为传递依赖。这减少了您必须显式管理的依赖项;您指定直接使用的依赖项,Gradle 会将它们与这些传递依赖项一起引入。请注意,当您升级直接依赖项时,它们可能会升级这些传递依赖项。
有时库可能在运行时(minSdk
)或编译时(compileSdk
)需要 Android SDK 的最低版本。当库使用 Android SDK 或其提供的 JDK API 中包含的功能时,这是必要的。应用程序的有效minSdk
是应用程序及其所有直接和传递库依赖项请求的最高minSdk
。
使用某些库可能需要使用特定的 Gradle 插件。这些辅助插件通常会安装 Kotlin 符号处理器或其他注释处理器,这些处理器生成代码或修改源代码的编译以支持您使用库功能。例如,Jetpack Room 包含注释和 KSP,将其转换为生成的代码以检索和修改数据库中的数据。Jetpack Compose 需要 Compose 编译器插件来修改带注释的函数,以管理该函数如何以及何时重新运行。
工具
Gradle |
Gradle 是一个构建工具,它读取您的构建文件并生成您的应用程序或库,并且还公开了一个 API 供插件扩展其功能。Gradle 在一个或多个 Java 虚拟机上运行多个进程,其 Java 插件调用 JDK 内部的 Java 工具。 |
Gradle 插件 |
Gradle 插件通过定义新任务和配置来扩展 Gradle。将插件应用于您的构建会启用特定的构建功能,这些功能在您的构建脚本中配置为数据。对于 Android 构建,最重要的 Gradle 插件是Android Gradle 插件 (AGP)。 |
编译器 |
Kotlin 或 Java 编译器将您的源代码转换为可执行字节码。Kotlin 编译器公开了插件 API,使外部分析和代码生成可以直接在编译器内部运行,访问解析的代码结构。 |
编译器插件 |
编译器插件在 Kotlin 编译器内部执行分析和代码生成,同时 Kotlin 编译器正在分析您的代码,并且在您将它们的 Gradle 插件应用于构建时安装。 |
Android SDK |
Android SDK 包含特定版本的 Android 的 Android 平台和 Java API 及其相应的工具。这些工具可帮助您管理 SDK、构建应用程序以及与 Android 设备通信和模拟。 每个版本的 Android SDK 都提供源代码可以访问的特定 Java API,以及反糖化支持,以便在早期版本的 Android 上使用这些 API。 |
JDK |
Java 开发工具包,包含编译 Java 源代码和运行 Java 应用程序的 Java 库和可执行文件。在 Android 构建中,有几个 JDK 在起作用。有关更多详细信息,请参阅Android 构建中的 Java 版本。 |
Gradle 范围
Gradle 将库依赖项分组到不同的范围(在 Gradle API 中称为配置),允许您指定要在构建的不同部分使用的不同库依赖项集。例如,您可能不希望在发布的应用程序或库中包含 JUnit 等测试库,但在构建和执行单元测试时需要它们。您还可以使用范围将符号或注释处理器添加到代码分析中。
例如,AGP 定义了implementation
和api
范围,这是您指定是否应将依赖项公开给子项目的用户的途径。有关在 Android 构建中使用的这些范围和其他范围的说明,请参阅配置依赖项。
在构建文件的dependencies
块中添加库依赖项,作为group:artifact:version
字符串
Kotlin
// In a module-level build script // explicit dependency strings ("group:artifact:version") dependencies { implementation("com.example:library1:1.2.3") api("com.example:library2:1.1.1") }
Groovy
// In a module-level build script // explicit dependency strings ("group:artifact:version") dependencies { implementation 'com.example:library1:1.2.3' api 'com.example:library2:1.1.1' }
或在版本目录中
# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"
[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }
[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }
并在构建文件中指定生成的变量
Kotlin
// In a module-level build script // Using a version catalog plugins { alias(libs.plugins.example.plugin) } dependencies { implementation(libs.example.library) }
Groovy
// In a module-level build script // Using a version catalog plugins { alias(libs.plugins.example.plugin) } dependencies { implementation libs.example.library }