文章来源:Google
Android中的Gradle构建系统使将外部库或其他库模块加入到构建依赖中变得很容易,这个依赖的库可以位于你的机器上或者远程仓库,而且这些依赖的库声明的任何可迁移依赖也会自动被包含进来。
本文主要讲述了如何在你的Android项目中使用依赖库,包含行为细节和Android Gradle插件的特定配置,注意你的Android项目中仅能使用下述的依赖库配置。
依赖类型
如果需要在项目中加入依赖,可以在build.gradle
文件中的dependencies
模块中加入像compile
这样的依赖配置。
例如,下面的build.gradle
是一个app加入不同类型的依赖库的例子:
apply plugin: 'com.android.application'
android { ... }
dependencies {
// Dependency on a local library module
compile project(":mylibrary")
// Dependency on local binaries
compile fileTree(dir: 'libs', include: ['*.jar'])
// Dependency on a remote binary
compile 'com.example.android:app-magic:12.3'
}
其中每一个都声明了一个不同类型的依赖,如下:
本地库模块依赖
compile project(':mylibrary')
这个声明了一个对名为 "mylibrary" (这个库的名字必须和settings.gradle
文件中定义在include
后的这个库模块相对应上)的Android库模块的依赖。这条声明要求构建系统将这个库模块和你的app模块一起编译且要在apk中引入对应的aar
文件。
本地库依赖
compile fileTree(dir: 'libs', include: ['*.jar'])
因为Gradle读取的路径是相对于build.gradle
文件的,这个声明的意义是要求构建系统将 模块名称/libs
目录中的所有jar
文件加入到依赖库中。
同样,你也可以按如下方式将单独的jar
文件加入到依赖库中。
compile files('libs/foo.jar', 'libs/bar.jar')
远程库依赖
compile 'com.example.android:app-magic:12.3'
这实际上是下述的缩写:
compile group: 'com.example.android', name: 'app-magic', version: '12.3'
这声明了一个对包含在“com.example.android”命名空间组内的“app-magic”库的12.3版本的依赖。
注意:类似这样的远程库要求Gradle应该能找到你声明的远程库,如果这个库在本地已经不存在了,那么在构建需要(例如当你点击__Sync Project with Gradle Files 或者运行一次项目构建)时Gradle会将它从远程地址拉下来。
库依赖配置
在dependencies
块中,你可以使用几种不同的配置(例如上述的compile
)来声明一个对库的依赖,不同的依赖配置给Gradle提供了如何使用库的不同的说明,下面的列表描述了你可以在Android项目中针对库依赖使用的每一种配置。
注意:尽管针对Java Gradle插件的依赖配置和下述相同,但不能用到Android项目中,除非配置兼容了针对Android Gradle插件。
如果你正在使用Android Gradle 插件 3.0.0或更高版本,你应该使用新的implementation, api, compileOnly, and runtimeOnly
以来配置,这些和下述配置相同,但他们通过让你限制Gradle是否对其他模块的依赖提高了多模块项目的构建速度,了解更多,请查阅 Android Gradle 3.0.0 插件 中的使用新依赖项配置。
compile
为编译类路径和apk加入依赖库
apk
仅为apk加入依赖库(不为编译类路径加入依赖库)
注意:你仅仅能使用apk
加入对jar
文件的依赖,不能加入库模块或aar
库的依赖
provided
仅为编译类路径加入依赖库(不为apk加入依赖库)。当你创建了Android模块,并且需要在编译时加入这个模块,但运行时不一定需要,则可以使用这个配置。就是说,如果你使用这个配置,那么你的库模块必须包含一个运行时的条件来检查这个依赖库是否可用,然后优雅地改变行为以便这个库不可用时应用仍能运行。这样可以通过不加入那些不那么核心的短暂依赖来减少最终apk的大小。
还有一种情况可以使用这个配置,在Android app模块中加入jar
文件依赖,在编译时需要这个依赖库,然后放心地认为其在运行时可以使用(且你不想将它复制到apk中)。或者你使用provided
配置编译了jar
文件依赖库,但还使用了apk
编译了另外一个jar
文件库到apk中,这两个库有相同的API。
注意:如果你正在创建Android app模块,你不能使用provided
依赖aar
库,只能依赖jar
库,而在Android库模块中,你可以使用provided
依赖aar
库和jar
库。
默认情况上述配置适用于你的项目主源集,这样即可适用于所有构建类型中。如果你只想在指定的构建类型源集或测试源集中声明一个依赖库,你必须将配置名称首字母大写且将构建类型或测试源集作为前缀。
例如,为“free”产品风味加入compile
依赖(使用远程库),应如下所示:
dependencies {
freeCompile 'com.google.firebase:firebase-ads:9.8.0'
}
另外,如果要为带有构建类型和产品风味的源集加入依赖,必须要在configurations
块中初始化配置名,下面的例子是为“freeDebug”源集加入apk
依赖配置(使用本地库依赖)
configurations {
// Initializes a placeholder for the freeDebugApk dependency configuration.
freeDebugApk {}
}
dependencies {
freeDebugApk fileTree(dir: 'libs', include: ['*.jar'])
}
下述是为本地测试或单元测试加入compile
依赖:
dependencies {
// Adds a remote binary dependency only for local tests.
testCompile 'junit:junit:4.12'
// Adds a remote binary dependency only for the instrumented test APK.
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}
如果你的库模块提供了多个变体,你可以为不同的app变体加入不同的库变体:
dependencies {
// Adds the 'debug' varaint of the library to the debug varaint of the app
debugCompile project(path: ':my-library-module', configuration: 'debug')
// Adds the 'release' varaint of the library to the release varaint of the app
releaseCompile project(path: ':my-library-module', configuration: 'release')
}
如果你是用的是Android Gradle 3.0.0 或更高版本,插件会自动地为app匹配不同的相对应于加入的本地库模块依赖的变体。就是说,不用像上述那样特别指定模块依赖。详细请看Android Gradle 3.0.0中的使用风味维度进行变体感知依赖项管理。
远程库
当你的依赖不是本地库或fileTree
,Gradle会在你的build.gradle
文件中的repositories
块中指定的任何一个线上仓库中寻找这个库。
默认情况下,Android Studio会在顶级build.gradle
文件中声明JCenter作为仓库位置,如下:
allprojects {
repositories {
jcenter()
}
}
如果你需要从Maven中心仓库获取依赖的库,那么可以加入mavenCentral()
,或者为本地仓库使用mavenLocal()
:
allprojects {
repositories {
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"
}
}
}
Google 的 Maven 仓库
下述是 Google Maven 仓库中最常用的几个可用的Android库:
- Android Support Library
- Architecture Components Library
- Constraint Layout Library
- Android Test Support Library
- Databinding Library
- Android Instant App Library
- Android Wear
- Google Play services
- Firebase
你可以在 Google Maven 仓库目录 中查看所有可用库(具体看下面的Programmatic access)。
如果要将这些库的某一个加入到你的构建中,先要将 Google Maven 库加入到顶级build.gradle
文件中:
allprojects {
repositories {
google()
// If you're using a version of Gradle lower than 4.1, you must instead use:
// maven {
// url 'https://maven.google.com'
// }
// An alternative URL is 'https://dl.google.com/dl/android/maven2/'
}
}
然后在dependencies
块红加入需要的库。例如,appcompat
库如下所示:
dependencies {
compile 'com.android.support:appcompat-v7:27.0.2'
}
然而,如果你尝试用上面这个库的旧版本然后依赖失败了,那么说明这个库在Maven库中不可用,你需要从离线库中获取你需要的库。
代码获取
Google的Maven库:maven.google.com/master-index.xml
任何组的信息:maven.google.com/group_path
/group-index.xml
例如android.arch.lifecycle
组:maven.google.com/android/arch/lifecycle/group-index.xml
其他下载POM和JAR文件地址:maven.google.com/group_path/library/version/library-version.ext
例如:maven.google.com/android/arch/lifecycle/compiler/1.0.0/compiler-1.0.0.pom
SDK Manager的离线库
有些库无法从Google Maven中获取可用的(通常是旧版本的库),这时候就必须要从SDK Manager中下载Google离线库包。
可以和正常的库一样将这些库加入到dependencies
块中.
离线库都存在android_sdk/extras/
中。