工具和库的依赖关系

构建依赖项是成功构建项目所需的外部组件。构建可以依赖于 库、插件、子项目、Android SDK、工具(例如 KotlinJava 编译器)、开发环境(如 Android Studio)以及 Gradle 本身。

每个依赖项本身可能需要其他依赖项。我们将这些称为传递依赖项,并且可以快速增加应用使用的总依赖项。当您想要升级依赖项时,无论是库、工具还是 Android SDK,该升级都可能级联,从而升级许多其他依赖项。

通常,这不会造成任何问题,因为许多库都遵循称为 语义版本控制 的方案。这些库限制了它们进行的更改类型,以确保与较低版本兼容。

语义版本控制遵循 major.minor.patch 格式。例如,在版本号 4.8.3 中,4 是 major 版本,8 是 minor 版本,3 是 patch 版本号。当 major 部分发生变化时,库的 API 或行为可能存在重大更改。这可能会影响您的构建或应用行为。

minor(新功能)或 patch(错误修复)部分发生变化时,库开发者会告诉您库仍然兼容,并且不应影响您的应用。

务必注意此类更改,并且有几个 依赖项升级工具 可以提供帮助。

构建中的关系

Android 构建包含以下之间的关系

  • 源代码 - 您控制的代码和资源
  • 库依赖项 - 项目和子项目在构建时包含的外部库或模块
  • 工具 - 将您的源代码转换为应用或库的编译器、插件和 SDK
Build dependencies and their relationships
图 1. 构建关系

源代码

您的源代码是您在应用或库中编写的 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 定义了implementationapi 范围,这是您指定是否应将依赖项公开给子项目的用户的途径。有关在 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
}