依赖管理

  • 依赖仓库
  • 预定义依赖仓库
  • 远程仓库
  • 本地仓库
  • 本地依赖
  • 文件依赖
  • 原生依赖库
  • 依赖项目


依赖管理时Gradle最耀眼的特点之一。最佳情况下,你需要的仅仅时在构建文件中添加一行代码,Gradle将会从远程仓库下载依赖,确保你的项目能够使用依赖中的类。Gradle甚至可以做的更多。如果你的项目中有一个依赖,并且其有自己的依赖,那么Gradle将会处理并解决这些问题。这些依赖中的依赖,被称为传递依赖。

依赖仓库

当我们讨论依赖时,通常指的是外部依赖,例如其他开发者提供的依赖库。手动管理依赖会是一个大麻烦。你必须找到该依赖,下载JAR文件,将其拷贝到项目,引用他。通常这些JAR文件在他们的名称中没有版本号,所以你需要添加JAR的版本,以便知道什么时候更新。你还需要确保依赖库中存储在了源代码管理系统,以便团队成员在没有手动下载这些依赖时,也可以使用基于依赖的代码。

使用依赖仓库可以解决这些问题。一个依赖仓库可以被看作时文件的集合。Gradle默认情况下没有为你的项目定义任何依赖仓库,所以你需要在repositories代码块中添加他们。如果使用Android Studio,那么它会为你自动完成。

Gradle支持三种不同的依赖仓库:Maven,Ivy和静态文件或文件夹。在构建的执行阶段,依赖从依赖仓库中被获取出来。Gradle也有本地缓存,所以一个特定版本的依赖只会在你的机器上下载一次。

一个依赖通常是由三种元素定义的:group,name和version。group指定了创建该依赖库的组织,通常时方向域名。name是依赖库的唯一标识。version指定了需要使用依赖库的版本号。使用这三个元素,就可以在dependencies代码块中声明一个依赖了。

预定义依赖仓库

为了方便,Grad了预定义了三个Maven仓库JCenter,Maven Central和本地Maven仓库。为了在构建脚本中包含他们,你需要使用下面几行代码:

repositories{
 mavenCentral()
 jcenter()
 mavenLocal()
 }

MavenCentral和JCenter是两个有名的远程仓库,一般不同时使用他们,通常推荐使用JCenter,其也是Android Studio常见Android项目时默认的依赖仓库。JCenter时Maven Central的超集,所以当你切换仓库时,可以不必修改已经定义的依赖。更重要的时,JCenter不同于Maven Central,他还支持HTTPS。

本地Maven仓库是你已经使用了的所有依赖的本地缓存,你也可以自己添加依赖。默认情况下,依赖仓库可以在一个名为.m2目录文件夹下的主目录中找到。

除了这些预定义的依赖仓库外,你还可以添加其他的公有甚至私有仓库。

远程仓库

一些组织会创建有趣的插件或依赖库,并且更喜欢将他们放在自由的Maven或Ivy服务器上,而不是他们发布到Mvean Central或JCenter。为了在构建中添加这些依赖,你需要在maven代码块中添加URL:

repositories{
 maven{
 url “http://repo.acmecorp.com/maven2” }
 }

与Ivy仓库类似,Apache Ivy是一个依赖管理器,在Ant中十分流行。在Gradle中,这些仓库的格式和Maven仓库相同。在ivy代码块中添加仓库URL的方式如下:

repositories{
 ivy{
 url “http://repo.acmecorp.com/repo’
 }
 }

如果你的团队正在使用自己的仓库,那么你需要有资格访问他们。下面是为一个仓库添加访问凭证的方法:

repositories {
        maven{
            url "http://repo.acmecorp.com/maven2"
            credentials{
                username 'user'
                password 'secretpassword'
            }
        }
        
    }

Maven和Ivy的方式相同,你可以在你的Ivy仓库中添加相同格式的credentials代码块。(不建议在构建配置文件中存储你的凭证。因为构建配置文件是纯文本,其会被迁入源码控制系统。更好的方法是使用一个单独的Gradle属性文件。)

本地仓库

我们可以在自己的硬盘驱动器或者网络驱动器上运行Maven和Ivy仓库。要想在构建中添加本地仓库,你只需配置一个相对或绝对路径URL即可。

新的Android 项目默认情况下有一个Android Support Libraty的依赖。当使用SDK manager来安装Google仓库是,在硬盘驱动器上,会创建两个Maven仓库,分别是ANDROID-SDK/extras/google/m2repository和ANDROID-SDK/extras/android/m2repository。Gradle通过他们获取谷歌提供的依赖包,例如:Android Support Library和Google Pay Services。

当然,你也可以通过使用flatDirs来添加一个常用文件夹作为仓库。下面的代码让你能够在dependency代码块中添加文件夹中的文件:

repositories{
 flatDir{
 dirs ‘arrs’
 }
 }

本地依赖

在某些情况下,你可能仍然需要手动下载JAR文件或原生库。你可能想创建自己的依赖库,这样你就可以在没有将其发布到共有或私有仓库时在多个项目中复用。在这种情况下,你不能使用任何在线资源,而是必须通过其他方式来添加依赖。下面介绍如何使用文件依赖,如何引入原生依赖,以及在项目中如何引入依赖项目。

文件依赖

你可以使用Gradle提供的files方法来添加JAR文件作为一个依赖,如下锁是:

dependencies{
 compile files(‘libs/domoarigato.jar’)
 }

当你有很多个JAR文件时,这种方式变得异常繁琐,一次添加一个完整的文件夹可能会更容易一些:

dependencies{
 compile fileTree(‘libs’)
 }

默认情况下,新建的Android项目会有一个libs文件夹,其会被声明为依赖使用的文件夹。一个过滤器可以保证只有JAR文件会被依赖,而不是简单的依赖文件夹中的所有文件:

dependencies {
 compile fileTree(dir: ‘libs’, include: [’*.jar’])
 }

这意味着所有由Android Studio创建的Android项目,你都可以将JAR文件放置在libs文件夹中,其会自动包含在构建路径和最终的APK中。

原生依赖库

用C或C++编写的可以被编译为特定平台的原生代码。这些依赖库通常包含几个.so文件,可用于所有平台。Android插件默认支持原生依赖库,你所需要做的就是在模块层创建一个jniLibs文件夹,然后为每个平台常见子文件夹,将.so文件放在适当的文件夹中。

如果此约定不生效,那么你可以在构建文件夹中设置相关位置:

android{
 sourceSets.main{
 jniLibs.srcDir ‘src/main/libs’
 }
 }

依赖项目

如果想分享一个使用Android APIs或Android资源的依赖库,那么你需要创建一个依赖项目。依赖项目通常和应用项目类似。你可以使用相同的任务来构建和测试依赖项目,并且他们可以有不同的构建variants。不同之处在于输出。应用项目将生成一个可被安装和运行的APK文件,依赖项目则生成一个.aar文件。该文件可被Android应用项目用作依赖库。

1.创建和使用依赖项目模块

不同于应用插件,构建脚本需要应用Android依赖库插件
apply plugin:‘com.android.library’

在应用中包含依赖项目的方式有两种。一种是在项目中当作一个模块,另一种是常见一个可在多个应用中复用的.aar文件。如果在项目中创建了一个模块作为依赖项目,那么你需要在settings.gradle中添加该模块,在应用模块中将它作为依赖:

Include ‘:app’,’:library’

在这种情况下,依赖模块被称之为依赖库,并且文件夹的名称于此相同。为了在Android模块中使用依赖库,你需要在Android模块的build.gradle文件中添加一个依赖库:

dependencies{
 compile project(‘:library’)
 }

2.使用.aar文件

如果你创建了一个依赖库,并且想在不同的Android应用中复用,那么你可以创建一个.aar文件,然后将其作为一个依赖添加到你的项目中。在构建依赖库时,模块目录下的build/output/aar/文件夹将会生成.aar文件。为了添加一个aar文件作为依赖,你需要在应用模块中创建一个文件夹,复制aar文件都该文件夹下,并添加该文夹作为依赖仓库:

repositories{
 flatDir{
 dirs‘aars’
 }
 }

这使得我们可以添加任何文件到该目录下,并将其作为依赖,具体操作方法如下:

dependencies{
 compile(name:‘libraryname’,ext:‘aar’)
 }

其告知Gradle查找具有特定名称且扩展名为.aar的依赖库。

未完。。。