菜鸟Android进阶之gradle依赖管理
首先,Android中的依赖主要分为本地依赖、仓库依赖以及工程模块依赖,接下来我将详细的讲解一下这三种情况。
- 本地依赖
本地依赖主要分为三类:jar包、so包、aar包
jar包
jar包通常由我们 拷贝到当前module的libs文件夹下。
如果只依赖一个jar包,那么我们可以这样
dependencies {
compile files('libs/domoarigato.jar')
}
如果我们依赖多个jar包,那么我们可以这样
compile fileTree(dir: 'libs', include: '*.jar')
通过将libs文件夹整体添加为依赖,避免了对libs中的jar包一个个手动添加。
so包
通过c/c++写的库称为so包,通常我们将so包放在jniLibs或者libs文件夹下(需要自己创建).
如果我们存放在libs目录下,则在模块的build.gradle中android根目录下添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
之后在dependences中加入
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
如果保存在jniLibs中,则只需要在android根目录下添加
sourceSets {
main {
jniLibs.srcDirs = ['jniLibs']
}
aar包
对于aar包,通常我们将他们放在创建的aars包下,之后在module的buikd.gradle中加入
repositories {
flatDir {
dirs 'aars'
}
}
通过这样添加aars文件夹作为项目的依赖库
之后在dependences中加入
dependencies {
compile(name:'libraryname', ext:'aar')
}
在已经添加依赖库的前提下,在直接通过如上方式使用依赖。
- 仓库依赖
gradle常用仓库包括maven、lvy和文件夹。其中最常用的是maven,而文件夹也就是上面的aar实例中添加的aars文件夹。
而为什么需要仓库,从字面意思理解,仓库是用来放东西的,这里自然是用来放依赖的。比如,maven远程仓库中包含了很多我们常用的依赖包,添加maven远程仓库后 ,在项目需要下载某一个maven仓库中的依赖包时,则 可以通过访问仓库来下载。这样避免了我们手动添加的繁琐和易错。
maven仓库
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
通常在整个项目的build.gradle中添加整体的远程仓库,如上。其中jcenter是maven其中的一个分支。
gradl中预定义了三个maven仓库:maven仓库、jcenter仓库、本地maven仓库
此外,如果使用其他的maven库,而不是中心maven或者jcenter,则需要在maven方法中加入URl地址
如果设置了权限的话,则需要在其中加入用户名和密码repositories { maven { url "http://repo.acmecorp.com/maven2" credentials { username 'user' password 'secretpassword' } } }
说了这样多,那么远程仓库中下载的依赖包,最后保存在哪里呢,默认保存在C:\Users\xxx\.gradle\caches\modules-2\files-2.1,xxx是你当前电脑的使用者的路径。
而这些依赖包下载一次后就缓存在这里不再下载。
有时候一个项目会依赖很多module,此时如何给整个工程添加这些module呢?首先在setting.gradle中定义module路径,如下之后添加include ':ccWebSDK',此时该module已经添加到整个项目下project(':ccWebSDK').projectDir = new File('Framework/SkyJavaLibrary/WebSDK')
但有的时候我们其他module会依赖其他module,此时又该如何添加依赖呢?其实很简单,在需要添加依赖的module的build.gradle中添加compile project(':ccWebSDK')这样就可以使得该module依赖CCWebSDK。