添加构建依赖项

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 依赖项配置将 lint 检查包含在已发布的 AAR 中,则需要将这些依赖项迁移到改用 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'
}