添加构建依赖项

Android Studio 中的 Gradle 构建系统允许您将外部二进制文件或其他库模块作为依赖项包含在您的构建中。依赖项可以位于您的机器上或远程存储库中,它们声明的所有传递依赖项也会自动包含在内。本页介绍了如何在您的 Android 项目中使用依赖项,包括有关 Android Gradle 插件 (AGP) 特定行为和配置的详细信息。有关 Gradle 依赖项的更深入的概念指南,您还应该参考 Gradle 依赖项管理指南 - 但请记住,您的 Android 项目必须仅使用本页定义的 依赖项配置

添加库或插件依赖项

添加和管理构建依赖项的最佳方法是使用版本目录,这是新项目默认使用的方法。本节介绍了用于 Android 项目的最常见配置类型;有关更多选项,请参考 Gradle 文档。有关使用版本目录的应用程序示例,请参见 Now in Android。如果您已经设置了构建依赖项(没有使用版本目录)并且拥有多模块项目,我们建议您 迁移

有关添加和管理原生依赖项(不常见)的指南,请参见 原生依赖项

在以下示例中,我们在项目中添加了 远程二进制依赖项Jetpack Macrobenchmark 库)、本地库模块依赖项 (myLibrary) 和插件依赖项(Android Gradle 插件)。以下是在项目中添加这些依赖项的一般步骤

  1. 在版本目录文件中名为 libs.versions.toml(位于 Project 视图中的 gradle 目录或 Android 视图中的 Gradle Scripts 下)的 [versions] 部分中,为所需的依赖项版本添加别名。

    [versions]
    agp = "8.3.0"
    androidx-macro-benchmark = "1.2.2"
    my-library = "1.4"
    
    [libraries]
    ...
    
    [plugins]
    ...
    

    别名可以包含连字符或下划线。这些别名会生成嵌套值,您可以在构建脚本中引用它们。引用从目录名称开始,即 libs.versions.toml 中的 libs 部分。当使用单个版本目录时,我们建议您保留默认值“libs”。

  2. libs.versions.toml 文件的 [libraries](对于远程二进制文件或本地库模块)或 [plugins](对于插件)部分中,为依赖项添加别名。

    [versions]
    ...
    
    [libraries]
    androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-macro-benchmark" }
    my-library = { group = "com.myapplication", name = "mylibrary", version.ref = "my-library" }
    
    [plugins]
    androidApplication = { id = "com.android.application", version.ref = "agp" }
    

    某些库在已发布的物料清单 (BOM) 中可用,该清单对库族及其版本进行分组。您可以在版本目录和构建文件中包含 BOM,并让它为您管理这些版本。有关详细信息,请参见 使用物料清单

  3. 在需要依赖项的模块的构建脚本中添加对依赖项别名的引用。在从构建脚本引用别名时,将别名的下划线和连字符转换为点。我们的模块级构建脚本将如下所示

    Kotlin

    plugins {
      alias(libs.plugins.androidApplication)
    }
    
    dependencies {
      implementation(libs.androidx.benchmark.macro)
      implementation(libs.my.library)
    }
    

    Groovy

    plugins {
      alias 'libs.plugins.androidApplication'
    }
    
    dependencies {
      implementation libs.androidx.benchmark.macro
      implementation libs.my.library
    }
    

    插件引用在目录名称后包含 plugins,版本引用在目录名称后包含 versions(版本引用不常见;有关版本引用的示例,请参见 具有相同版本号的依赖项。)库引用不包含 libraries 限定符,因此您不能在库别名的开头使用 versionsplugins

配置依赖项

dependencies 块中,您可以使用多种不同的依赖项配置(如前面显示的 implementation)来声明库依赖项。每个依赖项配置都为 Gradle 提供有关如何使用依赖项的不同指令。下表描述了您可以在 Android 项目中用于依赖项的每个配置。

配置 行为
implementation Gradle 将依赖项添加到编译类路径并将依赖项打包到构建输出中。当您的模块配置 implementation 依赖项时,它让 Gradle 知道您不希望该模块在编译时将依赖项泄漏到其他模块。也就是说,该依赖项不会提供给依赖于当前模块的其他模块。

使用此依赖项配置而不是 api 可以显着提高构建速度,因为它减少了构建系统需要重新编译的模块数量。例如,如果 implementation 依赖项更改了其 API,Gradle 将仅重新编译该依赖项以及直接依赖于它的模块。大多数应用程序和测试模块应该使用此配置。

api Gradle 将依赖项添加到编译类路径和构建输出中。当模块包含 api 依赖项时,它让 Gradle 知道该模块希望将该依赖项传递地导出到其他模块,以便在运行时和编译时都可供它们使用。

谨慎使用此配置,仅在您需要传递地导出到其他上游使用者时使用。如果 api 依赖项更改了其外部 API,Gradle 将重新编译所有在编译时访问该依赖项的模块。大量 api 依赖项会导致构建速度显着下降。除非您希望将依赖项的 API 公开到单独的模块,否则库模块应改为使用 implementation 依赖项。

compileOnly Gradle 仅将依赖项添加到编译类路径(即不会将其添加到构建输出中)。当您创建 Android 模块并需要在编译期间使用该依赖项时,这很有用,但它在运行时是可选的。例如,如果您依赖于仅包含编译时注释的库(通常用于生成代码,但通常不包含在构建输出中),则可以将该库标记为 compileOnly

如果您使用此配置,则您的库模块必须包含运行时条件来检查依赖项是否可用,然后优雅地更改其行为,以便在未提供依赖项时仍然可以正常运行。这有助于通过不添加不重要的瞬态依赖项来减小最终应用程序的大小。

注意:您不能将 compileOnly 配置与 Android 存档 (AAR) 依赖项一起使用。

runtimeOnly Gradle 仅将依赖项添加到构建输出中,以便在运行时使用。也就是说,它不会添加到编译类路径中。这在 Android 上很少使用,但在服务器应用程序中经常使用以提供日志记录实现。例如,库可以使用不包含实现的日志记录 API。该库的使用者可以将其添加为 implementation 依赖项,并包含一个 runtimeOnly 依赖项,用于实际的日志记录实现。
ksp
kapt
annotationProcessor

这些配置提供在代码编译之前处理注释和其他符号的库。它们通常会验证您的代码或生成额外的代码,从而减少您需要编写的代码量。

要添加此类依赖项,您必须使用 kspkaptannotationProcessor 配置将其添加到注释处理器类路径中。使用这些配置通过将编译类路径与注释处理器类路径分离来提高构建性能。如果 Gradle 在编译类路径中找到注释处理器,它会停用 编译避免,这会对构建时间产生负面影响(Gradle 5.0 及更高版本会忽略在编译类路径中找到的注释处理器)。

Android Gradle 插件假设依赖项是注释处理器,如果其 JAR 文件包含以下文件

META-INF/services/javax.annotation.processing.Processor

如果插件检测到编译类路径上的注释处理器,它会产生构建错误。

ksp 是 Kotlin 符号处理器,由 Kotlin 编译器运行。

kaptapt 是在 Kotlin 或 Java 编译器执行之前处理注释的独立工具。

在决定使用哪种配置时,请考虑以下事项

  • 如果处理器可用作 Kotlin 符号处理器,请将其用作 ksp 依赖项。有关使用 Kotlin 符号处理器的详细信息,请参见 从 kapt 迁移到 ksp
  • 如果处理器不可用作 Kotlin 符号处理器
    • 如果您的项目包含 Kotlin 源代码(但也可能包含 Java 源代码),请 使用 kapt 来包含它。
    • 如果您的项目仅使用 Java 源代码,请使用 annotationProcessor 来包含它。

有关使用注释处理器的更多信息,请参见 添加注释处理器

lintChecks

使用此配置来包含包含您希望 Gradle 在构建 Android 应用程序项目时执行的 lint 检查的库。

请注意,包含 lint.jar 文件的 AAR 将自动运行该 lint.jar 文件中定义的检查;您不需要添加显式的 lintChecks 依赖项。这使您可以在单个依赖项中定义库和关联的 lint 检查,从而确保在使用者使用您的库时运行您的检查。

lintPublish 在 Android 库项目中使用此配置来包含您希望 Gradle 编译到 lint.jar 文件中并在您的 AAR 中打包的 lint 检查。这会导致使用您的 AAR 的项目也应用这些 lint 检查。如果您以前使用 lintChecks 依赖项配置在发布的 AAR 中包含 lint 检查,您需要将这些依赖项迁移到改为使用 lintPublish 配置。

Kotlin

dependencies {
  // Executes lint checks from the ":checks" project at build time.
  lintChecks(project(":checks"))
  // Compiles lint checks from the ":checks-to-publish" into a
  // lint.jar file and publishes it to your Android library.
  lintPublish(project(":checks-to-publish"))
}

Groovy

dependencies {
  // Executes lint checks from the ':checks' project at build time.
  lintChecks project(':checks')
  // Compiles lint checks from the ':checks-to-publish' into a
  // lint.jar file and publishes it to your Android library.
  lintPublish project(':checks-to-publish')
}

为特定构建变体配置依赖项

所有前面的配置都将依赖项应用于所有构建变体。如果您希望为特定 构建变体 源集或 测试源集 声明依赖项,则必须将配置名称大写并加上构建变体或测试源集的名称作为前缀。

例如,要仅使用 implementation 配置将远程二进制依赖项添加到您的“free”产品风味中,请使用以下命令

Kotlin

dependencies {
    freeImplementation("com.google.firebase:firebase-ads:21.5.1")
}

Groovy

dependencies {
    freeImplementation 'com.google.firebase:firebase-ads:21.5.1'
}

但是,如果您希望为组合了产品风味和构建类型的变体添加依赖项,则必须初始化配置名称

Kotlin

// Initializes a placeholder for the freeDebugImplementation dependency configuration.
val freeDebugImplementation by configurations.creating

dependencies {
    freeDebugImplementation(project(":free-support"))
}

Groovy

configurations {
    // Initializes a placeholder for the freeDebugImplementation dependency configuration.
    freeDebugImplementation {}
}

dependencies {
    freeDebugImplementation project(":free-support")
}

要为本地测试和仪器测试添加 implementation 依赖项,如下所示

Kotlin

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation("junit:junit:4.12")

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
}

Groovy

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation 'junit:junit:4.12'

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

但是,某些配置在这种情况下没有意义。例如,由于其他模块无法依赖于 androidTest,因此如果您使用 androidTestApi 配置,您会收到以下警告

WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with
'androidTestImplementation'.

依赖项顺序

您列出依赖项的顺序表示每个依赖项的优先级:第一个库的优先级高于第二个库,第二个库的优先级高于第三个库,依此类推。此顺序在 资源合并清单元素合并 到您的应用程序中时非常重要来自库的。

例如,如果您的项目声明以下内容

  • LIB_ALIB_B 的依赖(按此顺序)
  • 以及 LIB_A 依赖于 LIB_CLIB_D(按此顺序)
  • 以及 LIB_B 也依赖于 LIB_C

那么,扁平依赖项顺序将如下所示

  1. LIB_A
  2. LIB_D
  3. LIB_B
  4. LIB_C

这确保了 LIB_ALIB_B 都可以覆盖 LIB_C;以及 LIB_D 的优先级仍然高于 LIB_B,因为 LIB_A(它依赖于它)的优先级高于 LIB_B

有关如何合并来自不同项目来源/依赖项的清单的更多信息,请参见 合并多个清单文件

Play Console 的依赖项信息

在构建您的应用程序时,AGP 会包含描述编译到您的应用程序中的库依赖项的元数据。在上传您的应用程序时,Play Console 会检查此元数据,以针对您的应用程序使用的 SDK 和依赖项的已知问题提供警报,并在某些情况下提供可操作的反馈以解决这些问题。

数据经过压缩,使用 Google Play 签名密钥加密,并存储在发布应用程序的签名块中。我们建议保留此依赖项文件,以确保安全且积极的用户体验。您可以通过在模块的 build.gradle.kts 文件中包含以下 dependenciesInfo 块来选择退出。

android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

有关我们政策和依赖项潜在问题的更多信息,请参见我们的支持页面上的 在您的应用程序中使用第三方 SDK

SDK 洞察

当以下问题适用时,Android Studio 会在版本目录文件和项目结构对话框中显示针对 Google Play SDK 指数 中的公共 SDK 的 lint 警告

  • SDK 被其作者标记为已过时。
  • SDK 违反 Play 政策。

这些警告是信号,表明您应该更新这些依赖项,因为使用过时版本可能会阻止您将来发布到 Google Play Console。

在没有版本目录的情况下添加构建依赖项

我们建议使用版本目录来添加和管理依赖项,但简单的项目可能不需要它们。以下是一个不使用版本目录的构建文件的示例

Kotlin

plugins {
    id("com.android.application")
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation("com.example.android:app-magic:12.3")
    // Dependency on a local library module
    implementation(project(":mylibrary"))
}

Groovy

plugins {
    id 'com.android.application'
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation 'com.example.android:app-magic:12.3'
    // Dependency on a local library module
    implementation project(':mylibrary')
}

此构建文件在“com.example.android”命名空间组中声明了对“app-magic”库的版本 12.3 的依赖项。远程二进制依赖项声明是以下内容的简写

Kotlin

implementation(group = "com.example.android", name = "app-magic", version = "12.3")

Groovy

implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

构建文件还声明了对名为“mylibrary”的Android 库模块的依赖关系;此名称必须与在您的 settings.gradle.kts 文件中使用 include: 定义的库名称匹配。构建应用时,构建系统会编译库模块并将生成的编译内容打包到应用中。

构建文件还声明了对 Android Gradle 插件 (com.application.android) 的依赖关系。如果有多个模块使用同一个插件,则所有模块的构建类路径上只能有一个版本的插件。与其在每个模块构建脚本中指定版本,不如在根构建脚本中包含带有版本的插件依赖关系,并指示不应用它。添加 apply false 会告诉 Gradle 注意插件的版本,但不将其用于根构建。通常,根构建脚本除此 plugins 块外为空。

Kotlin

plugins {
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

Groovy

plugins {
    id ‘com.android.application’ version ‘8.3.0-rc02’ apply false
}

如果只有一个模块的项目,您可以在模块级构建脚本中明确指定版本,并将项目级构建脚本保留为空。

Kotlin

plugins {
    id("com.android.application") version "8.3.0"
}

Groovy

plugins {
    id 'com.android.application' version '8.3.0-rc02'
}