利用 Android Studio 中的 Gradle 构建系统,您可以轻松地将外部二进制文件或其他库模块作为依赖项添加到您的构建中。这些依赖项可位于您的计算机上或远程代码库中,并且它们声明的所有传递依赖项也会自动包含在内。本页介绍了如何在您的 Android 项目中使用依赖项,包括有关 Android Plugin for Gradle 特有的行为和配置的详细信息。
如需向您的项目添加依赖项,请在 build.gradle
文件的 dependencies
代码块中指定依赖项配置,如 implementation
。
例如,应用模块的以下 build.gradle
文件包含三种不同类型的依赖项:
apply plugin: 'com.android.application'
android { ... }
dependencies {
// Dependency on a local library module
implementation project(":mylibrary")
// Dependency on local binaries
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Dependency on a remote binary
implementation 'com.example.android:app-magic:12.3'
}
其中每种依赖项配置都请求不同种类的库依赖项,如下所示:
本地库模块依赖项
implementation project(':mylibrary')
对上述代码说明:这声明了对一个名为“mylibrary”(此名称必须与在您的
settings.gradle
文件中使用 include: 定义的库名称相符)的 Android 库模块的依赖关系。在构建您的应用时,构建系统会编译该库模块,并将生成的编译内容打包到 APK 中。
本地二进制文件依赖项
implementation fileTree(dir: 'libs', include: ['*.jar'])
对上述代码说明:Gradle 声明了对项目的
module_name/libs/
目录中 JAR 文件的依赖关系(因为 Gradle 会读取build.gradle
文件的相对路径)。
或者,您也可以按如下方式指定各个文件
implementation files('libs/foo.jar', 'libs/bar.jar')
远程二进制文件依赖项
implementation 'com.example.android:app-magic:12.3'
这实际上是以下代码的简写形式:
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
在 dependencies
代码块内,您可以从多种不同的依赖项配置中选择其一(如上面所示的 implementation
)来声明库依赖项。每种依赖项配置都向 Gradle 提供了有关如何使用该依赖项的不同说明。下表介绍了您可以对 Android 项目中的依赖项使用的各种配置。此表还将这些配置与自 Android Gradle 插件 3.0.0
起弃用的配置进行了比较。
项目 | 行为 |
---|---|
implementation | 使用此依赖项配置代替 api 或 compile (已弃用)可以显著缩短构建时间,因为这样可以减少构建系统需要重新编译的模块数。例如,如果 implementation 依赖项更改了其 API ,Gradle 只会重新编译该依赖项以及直接依赖于它的模块。大多数应用和测试模块都应使用此配置。 |
api | 当一个模块包含 api 依赖项时,会让 Gradle 了解该模块要以传递方式将该依赖项导出到其他模块,以便这些模块在运行时和编译时都可以使用该依赖项。 |
compileOnly | 如果您创建 Android 模块时在编译期间需要相应依赖项,但它在运行时可有可无,此配置会很有用。 |
runtimeOnly | Gradle 只会将依赖项添加到构建输出,以便在运行时使用。也就是说,不会将其添加到编译类路径。此配置的行为类似于 apk(现已弃用)。 |
annotationProcessor | 如需添加对作为注解处理器的库的依赖,您必须使用 annotationProcessor 配置将其添加到注解处理器的类路径。这是因为,使用此配置可以将编译类路径与注释处理器类路径分开,从而提高构建性能。如果 Gradle 在编译类路径上找到注释处理器,则会禁用避免编译功能,这样会对构建时间产生负面影响(Gradle 5.0 及更高版本会忽略在编译类路径上找到的注释处理器)。 |
lintChecks | 使用此配置可以添加您希望 Gradle 在构建项目时执行的 lint 检查。 |
lintPublish | 在 Android 库项目中使用此配置可以添加您希望 Gradle 编译成 lint.jar 文件并打包在 AAR 中的 lint 检查。这会使得使用 AAR 的项目也应用这些 lint 检查。如果您之前使用 lintChecks 依赖项配置将 lint 检查添加到已发布的 AAR 中,则需要迁移这些依赖项以改用 lintPublish 配置。 |
已弃用的配置(在 AGP 1.0–4.2 中可用)
项目 | 行为 |
---|---|
apk | Gradle 只会将依赖项添加到构建输出,以便在运行时使用。也就是说,不会将其添加到编译类路径 |
compile | Gradle 会将依赖项添加到编译类路径和构建输出。 将依赖项导出到其他模块 |
provided | Gradle 只会将依赖项添加到编译类路径(也就是说,不会将其添加到构建输出) |
当您的依赖项不是本地库或文件树时,Gradle 会在 build.gradle
文件的 repositories
代码块中指定的所有在线代码库中查找相关文件。各个代码库的列出顺序决定了 Gradle 在这些代码库中搜索各个项目依赖项的顺序。例如,如果从代码库 A 和 B 均可获得某个依赖项,而您先列出了代码库 A,则 Gradle 会从代码库 A 下载该依赖项。
默认情况下,新的 Android Studio 项目会将 Google 的 Maven
代码库和 JCenter
指定为项目的顶级 build.gradle
文件中的代码库位置,如下所示:
allprojects {
repositories {
google()
jcenter()
}
}
如果您要从 Maven
中央代码库获取某些内容,则添加 mavenCentral()
;对于本地代码库,则使用 mavenLocal()
:
allprojects {
repositories {
google()
jcenter()
mavenCentral()
mavenLocal()
}
}
或者,您也可以按如下方式声明特定的 Maven 或 Ivy 代码库:
allprojects {
repositories {
maven {
url "https://repo.example.com/maven2"
}
maven {
url "file://local/repo/"
}
ivy {
url "https://repo.example.com/ivy"
}
}
}
依赖项的列出顺序指明了每个库的优先级:第一个库的优先级高于第二个,第二个库的优先级高于第三个,依此类推。在合并资源或将清单元素从库中合并到应用中时,此顺序很重要。
例如,如果您的项目声明以下内容:
LIB_A
和 LIB_B
(按此顺序)LIB_A
依赖于 LIB_C
和 LIB_D
(按此顺序)LIB_B
也依赖于 LIB_C
那么,扁平型依赖项顺序将如下所示:
LIB_A
LIB_D
LIB_B
LIB_C
这可以确保 LIB_A
和 LIB_B
都可以替换 LIB_C
;并且 LIB_D
的优先级仍高于 LIB_B
,因为 LIB_A
(依赖前者)的优先级高于 LIB_B
。
一些直接依赖项可能具有自己的依赖项。此类依赖项称为“传递依赖项”。Gradle 将会自动为您收集并添加这些传递依赖项,无需您手动逐一加以声明。Android Plugin for Gradle
提供了一项任务,用来列出 Gradle 为给定模块解析的依赖项。
debugRuntimeClasspath - Dependencies for runtime/packaging
+--- :mylibrary (variant: debug)
+--- com.google.android.material:material:1.0.0@aar
+--- androidx.appcompat:appcompat:1.0.2@aar
+--- androidx.constraintlayout:constraintlayout:1.1.3@aar
+--- androidx.fragment:fragment:1.0.0@aar
+--- androidx.vectordrawable:vectordrawable-animated:1.0.0@aar
+--- androidx.recyclerview:recyclerview:1.0.0@aar
+--- androidx.legacy:legacy-support-core-ui:1.0.0@aar
...
debugAndroidTest
debugAndroidTestCompileClasspath - Dependencies for compilation
+--- androidx.test.ext:junit:1.1.0@aar
+--- androidx.test.espresso:espresso-core:3.1.1@aar
+--- androidx.test:runner:1.1.1@aar
+--- junit:junit:4.12@jar
如需运行该任务,请按以下步骤操作: