6.3 配置构建 - 加入构建依赖

文章来源: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库:

你可以在 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/中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容