前言
- 依赖管理是Gradle最闪耀的地方,你仅仅需要添加一行代码在配置文件中,Gradle会自动从远程仓库为你下载相关的jar包,并且保证你能正确使用它们。
- Gradle甚至可以为你做的更多,当你在工程里添加了多个相同的依赖,Gradle会为你排除掉相同的jar包。
仓库
仓库可以认为是一些文件的集合体,需要把仓库配置到repositories方法体内(AndroidStudio默认会生成),如下所示:
123repositories {jcenter()}gradle支持三种不同的仓库:Maven、Ivy、文件夹,在你执行build构建时,依赖包会从远程仓库下载,同时gradle会为你在本地保留缓存,因此一个特定版本的依赖只需要下载一次。
- 一个依赖需要定义三个元素:group、name和version,group代表创建该依赖的组织名(通常是包名)、name是依赖包的唯一标识,version是该依赖的版本号,如下所示:1234dependencies {compile 'com.google.code.gson:gson:2.3'compile 'com.squareup.retrofit:retrofit:1.9.0'}
仓库预定义
Gradle会默认预定义三个maven仓库:jcenter、mavenCentral、mavenLocal仓库。你可以同时申明它们:
12345repositories {mavenCentral()jcenter()mavenLocal()}建议使用jcenter,jcenter是mavenCentral的一个分支,且支持https,而maven仓库不支持https。
- mavenLocal是你曾使用过的所有依赖包的集合,你也可以添加自己的依赖包,默认情况下,你可以在你的home文件下找到.m2的文件夹。
远程仓库
有的公司(大公司一般都是这样),创建了一些自己的插件或者库,他们更想将这些库放到自己的maven库中(处于安全等考虑),那么在使用这一类的仓库时,你只需要在maven方法中加入url地址:
123456789repositories {maven {url "http://repo.acmecorp.com/maven2"credentials {username 'user'password 'secretpassword'}}}上面的credentials是可选的,加上它表示需要有权限才能访问。
本地依赖
- 有些时候,我们自己会写一些公共库(比如网络库),这样可以复用到不同的项目中。这种情况下,你不必将库上传到公有或者私有库中,也不需要网络去下载他们。
文件依赖
如果你想为你的工程添加jar文件作为依赖:
123dependencies {compile files('libs/domoarigato.jar')}但是如果有很多jar需要导入时,可以将他们都放入libs中,这时候可以这样导入:
123dependencies {compile fileTree('libs')}AndroidStudio创建的工程默认会有如下的配置,这样其实你可以将你需要的jar,放到libs目录即可。
123dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])}
native包(so包)
用c或者c++写的library会被叫做so包。Android插件默认情况支持native包,需要将so文件放在对应的文件夹中:
1234567891011app├── AndroidManifest.xml└── jniLibs├── armeabi│ └── nativelib.so├── armeabi-v7a│ └── nativelib.so├── mips│ └── nativelib.so└── x86└── nativelib.so这里再介绍点不相干的东西,从上面我们看到so文件被放到4个不同的文件夹中,那么他们代表了什么意思呢,其实他们代表了不同的CPU架构:ARMv5、ARMv7(从2010年),x86(从2011年起)、MIPS(从2012年起)、ARMV8、MIPS64、X86_64(从2014年起),每一种又对应一个ABI。
- ABI全称是Application Binary Interface(应用程序二进制接口),即二进制文件(so文件)如何运行在相应的系统平台上,对应的ABI:armeabi、armeabi-v7a、x86、mips、arm64-v8a、mips64、x86_64。
aar文件
- 如果你想分享一个library,该依赖使用了Android Api或者包含了Android资源文件,那么用aar就非常合适。
创建和使用依赖工程模块
- 需要使用插件:1apply plugin: 'com.android.library'
有两种方法去使用一个依赖工程:
第一种方法是在工程中,直接将它作为一个模块使用。这种方式需要在setting.gradle中为其添加模块:
1234567// 比如我们的工程叫libraryinclude ':app', ':library'// 在使用的时候,在依赖中进行引用dependencies {compile project(':library')}第二种方法是创建一个aar文件比如是aarFile1,这样其他应用也可以复用这个aar了。具体步骤如下:
- 当构建library项目时,会生成aar文件在build/output/aar/
- 创建一个文件夹放置它,比如aars
- 将aar文件拷贝到aars目录中
接下来你有两种方式来引用这个aars目录:
12345678910repositories {flatDir {dirs 'aars'}}// 还可以指定某个aardependencies {compile(name:'aarFile1', ext:'aar')}// 这相当于告诉Gradle,在aars文件夹下,添加一个叫做aarFile1的文件,其后缀为aar的依赖。
依赖的概念
配置
- 我们有5种配置:compile、apk、provided、testCompile、androidTestCompile,下面分别来说明下他们的意义:
- compile 是默认的那个,其含义是包含所有的依赖包,即存在apk包中。
- apk 是apk中存在,但是不会加入到编译中,用的较少。
- provided 提供编译支持,但是不会写入到Apk中。
- testCompile 和 androidTestCompile 会添加额外的library支持针对测试。
动态版本
- 在一些场景,你可能想使用最新的依赖包去构建你的app或者library,实现它的最好方式就是动态版本,如下:12345dependencies {compile 'com.android.support:support-v4:22.2.+'compile 'com.android.support:appcompat-v7:22.2+'compile 'com.android.support:recyclerview-v7:+'}
- 第一行,告诉gradle需要得到最新的生产版本(build)。
- 第二行,告诉gradle想得到最新的minor版本,且最小版本号是2.
- 第三行,告诉gradle,要得到最新的library
- 这里普及下版本号的知识,比如一个版本号是:5.45.6.234,那么从左到右依次是:主版本号(major)、次版本号(minor)、内部版本号(build)、修订版本(Revision)
- 不过使用动态版本,可能会造成版本兼容性问题,需要谨慎使用。