欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gradle for Android(三)——依赖管理(一)

程序员文章站 2022-07-15 09:59:18
...

前言:正如标题所述本节我们一起来讨论AS中的依赖管理和集成第三方开源库时,遇到依赖冲突如何解决的问题。

在使用Eclipse开发的时候我们通常都是将jar包下载下来放到libs目录下,这么做不利于及时的更新jar,每次我们都需要手动去检查jar是否有更新然后下载下载替换,很麻烦。使用Android Studio以后添加依赖就方便多了,我们只需要在配置文件中配置一下要依赖的开源库就可以了,有更新时更改下配置文件构建工具就会帮我们自动将新版本下载好了。

依赖管理是Gradle最闪耀的地方,最好的情景是,你仅仅只需添加一行代码在你的build文件,Gradle会自动从远程仓库为你下载相关的jar包,并且保证你能够正确使用它们。Gradle甚至可以为你做的更多,包括当你在你的工程里添加了多个相同的依赖,gradle会为你排除掉相同的jar包。接下来我们就分别认识一下如何添加依赖和解决依赖冲突。

依赖管理

Android Studio引用第三方库的基本方式

Android Studio引用第三方库很方便,只需要一句代码就可以搞定,几种引用第三方库的方式,总结一下:

方式:1:它就会自动把这个包下载下来,并且引用它。节省git空间,而且修改版本也很方便。

compile 'com.android.support:support-v4:23.3.0'

方式2:引用libs下所有jar包

compile fileTree(dir: 'libs', include: ['*.jar'])

方式3:引用一个jar

compile files('libs/fastjson-1.1.53.android.jar')

方式4:引用一个aar文件,注意并不能像 方式2 那样自动引用全部的aar,而需要对每个aar分别进行引用。

compile(name: 'aar_file_name', ext: 'aar')

方式5:引用库类型的项目

compile project(':xxxsdk')

本地依赖

本地依赖讲的是你可以依赖自己本地下载的一些jar,或者是自己编写的library module或者是一个aar等内容,总之呢就是不需要进行网络下载的。

文件依赖

通过files()方法可以添加文件依赖,如果有很多jar文件,我们也可以通过fileTree()方法添加一个文件夹,除此之外,我们还可以通过通配符的方式添加,如下:

//引用一个jar
compile files('libs/fastjson-1.1.53.android.jar')
//引用libs文件夹下的所有jar
compile fileTree(dir: 'libs', include: ['*.jar'])

这也意味着,在任何一个Android项目中,你都可以把一个jar文件放在到libs文件夹下,其会自动的将其添加到编译路径以及最后的APK文件。

扩展:
依赖指定路径下的全部jar文件。

compile fileTree(dir: '../librarymodule/libs', include: '*.jar')

Native libraries(so)

用c或者c++写的library会被叫做so包,Android插件默认情况下支持native包,你需要把.so文件放在对应的文件夹中:

app
   ├── AndroidManifest.xml
   └── jniLibs
       ├── armeabi
       │   └── nativelib.so
       ├── armeabi-v7a
       │   └── nativelib.so
       ├── mips
       │   └── nativelib.so
       └── x86
           └── nativelib.so      

同时在配置文件中添加:

android{
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

Library projects

如果你想分享一个library,该依赖包使用了Android api,或者包含了Android 资源文件,那么aar文件适合你。依赖库和应用工程是一样的,你可以使用相同的tasks来构建和测试你的依赖工程,当然他们也可以有不同的构建版本。应用工程和依赖工程的区别在于输出文件,应用工程会生成APK文件,并且其可以安装在Android设备上,而依赖工程会生成.aar文件。该文件可以被Android应用工程当做依赖来使用。

这里的依赖工程必须是library类型的。在新建module的时候引用的plugin 就不能是com.android.application了,需要引用如下plugin:

apply plugin: 'com.android.library'

引用的时候在setting文件中include即可。

  include ':app', ':library'

添加这种模块依赖的方式有两种:一种是直接以一个模块的形式引用;一种是打成aar包引用。
方法一:依赖工程引用

 dependencies {
       compile project(':library')
 }

方法二: aar引用
当你构建你的library项目,aar文件将会在 build/output/aar/下生成。把该文件作为你的依赖包,你需要创建一个文件夹来放置它,我们就叫它aars文件夹吧,然后把它拷贝到该文件夹里面,然后添加该文件夹作为依赖库。也可以直接和jar文件放在同一个文件夹下面。配置方法如下:

repositories {
    flatDir {
        dirs 'aars' 
    }
}

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

这个会告诉Gradle,在aars文件夹下,添加一个叫做libraryname的文件,且其后缀是aar的作为依赖。
注意:
如果你的依赖的module中有依赖其他的aar包,你需要在module中添加aar引用,此外,还需在app模块中添加aar,在build.gradle 中配置:

repositories {
        flatDir {
            dirs 'libs', '../YstTelevision/libs','../programdetails/libs'
        }
    }

如上诉代码所示,将module中的libs目录配置到flatDir下面,格式必须是’../模块名/libs’

外部依赖

外部依赖是最普遍的依赖,这些依赖存放在外部仓库中。

仓库管理简介

本质上说,仓库是一种存放依赖的容器,每一个项目都具备一个或多个仓库。在编译的执行阶段,gradle 将会从仓库中取出对应需要的依赖文件,当然,gradle 本地也会有自己的缓存,不会每次都去取这些依赖。

Gradle支持以下仓库格式:

  • Ivy仓库
  • Maven仓库
  • Flat directory仓库

我们来看一下,对于每一种仓库类型,我们在构建中应该如何配置。

在构建中加入Ivy仓库:

我们可以通过URL地址或本地文件系统地址,将Ivy仓库加入到我们的构建中。

如果想通过URL地址添加一个Ivy仓库,我们可以将以下代码片段加入到build.gradle文件中:

repositories {
    ivy {
        url "http://ivy.petrikainulainen.net/repo"
    }
}

如果想通过本地文件系统地址添加一个Ivy仓库,我们可以将以下代码片段加入到build.gradle文件中:

repositories {
    ivy {       
        url "../ivy-repo"
    }
}
在构建中加入Maven仓库:

与Ivy仓库很类似,我们可以通过URL地址或本地文件系统地址,将Maven仓库加入到我们的构建中。

如果想通过URL地址添加一个Maven仓库,我们可以将以下代码片段加入到build.gradle文件中:

repositories {
    maven {
        url "http://maven.petrikainulainen.net/repo"
    }
}

如果想通过本地文件系统地址添加一个Maven仓库,我们可以将以下代码片段加入到build.gradle文件中:

repositories {
    maven {       
        url "../maven-repo"
    }
}

在加入Maven仓库时,Gradle提供了三种“别名”供我们使用,它们分别是:

  • mavenCentral():表示依赖是从Central Maven 2 仓库中获取的。
  • jcenter():表示依赖是从Bintary’s JCenter Maven 仓库中获取的。
  • mavenLocal():表示依赖是从本地的Maven仓库中获取的。

如果我们想要将Central Maven 2 仓库加入到构建中,我们必须在build.gradle文件中加入以下代码片段:

repositories {
    mavenCentral()
}

Maven和Jcenter仓库是很出名的两大仓库。我们没必要同时使用他们,在这里我建议你们使用jcenter,jcenter是maven中心库的一个分支,这样你可以任意去切换这两个仓库。当然jcenter也支持了https,而maven仓库并没有。

本地maven库是你曾使用过的所有依赖包的集合,当然你也可以添加自己的依赖包。默认情况下,你可以在你的home文件下找到.m2的文件夹。除了这些仓库外,你还可以使用其他的公有的甚至是私有仓库。

为了方便,Gradle会默认预定义三个maven仓库:Jcenter和mavenCentral以及本地maven仓库。你可以同时申明它们:

repositories {
       mavenCentral()
       jcenter()
       mavenLocal()
   }
构建中加入Flat Directory仓库:

如果我们想要使用Flat Directory仓库,我们需要将以下代码片段加入到build.gradle文件中:

repositories {
    flatDir {
        dirs 'lib'
    }
}

这意味着系统将在lib目录下搜索依赖,同样的,如果你愿意的话可以加入多个目录,代码片段如下:

repositories {
    flatDir {
        dirs 'libA', 'libB'
    }
}

有些组织,创建了一些有意思的插件或者library,他们更愿意把这些放在自己的maven库,而不是maven中心库或jcenter。那么当你需要是要这些仓库的时候,你只需要在maven方法中加入url地址就好:

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

同样的,Ivy仓库也可以这么做。Apache Ivy在ant世界里是一个很出名的依赖管理工具。如果你的公司有自己的仓库,如果他们需要权限才能访问,你可以这么编写:

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

注意:这不是一个好主意,最好的方式是把这些验证放在Gradle properties文件里。

外部依赖的使用

一个外部依赖可以由以下属性指定:

  • group属性指定依赖的分组(在Maven中,就是groupId)。
  • name属性指定依赖的名称(在Maven中,就是artifactId)。
  • version属性指定外部依赖的版本(在Maven中,就是version)。

小贴士:这些属性在Maven仓库中是必须的,如果你使用其他仓库,一些属性可能是可选的。打个比方,如果你使用Flat directory仓库,你可能只需要指定名称和版本。

我们假设我们需要指定以下依赖:

  • 依赖的分组是foo。
  • 依赖的名称是foo。
  • 依赖的版本是0.1。

在项目编译时需要这些依赖。我们可以将以下代码片段加入到build.gradle中,进行依赖声明:

dependencies {
    compile group: 'foo', name: 'foo', version: '0.1'
}

我们也可以采用一种快捷方式声明依赖:[group]:[name]:[version]。如果我们想用这种方式,我们可以将以下代码段加入到build.gradle中:

dependencies {
    compile 'foo:foo:0.1'
}

我们也可以在同一个配置项中加入多个依赖,传统的方式如下:

dependencies {
    compile (
        [group: 'foo', name: 'foo', version: '0.1'],
        [group: 'bar', name: 'bar', version: '0.1']
    )
}

如果采用快捷方式,那可以是这样:

dependencies {
    compile 'foo:foo:0.1', 'bar:bar:0.1'
}

如果我们要保证我们依赖的库始终处于最新状态,我们可以通过添加通配符的方式,比如:

dependencies {
    //得到最新的生产版本
    compile 'com.android.support:support-v4:22.2.+'
    //得到最新的minor版本,并且其最小的版本号是2.
    compile 'com.android.support:appcompat-v7:22.2+'
    //得到最新的library
    compile 'com.android.support:recyclerview-v7:+'
}

但是我们一般不要这么做,这样做除了每次编译都要去做网络请求查看是否有新版本导致编译过慢外,最大的弊病在于我们使用过的版本很很可能是测试版,性能得不到保证,所以,在我们引用库的时候一定要指名依赖版本。

如果你在你的build.gradle中使用了动态版本,Android studio将会警告你关于动态版本的潜在问题,就像你下面看到的这样:

Gradle for Android(三)——依赖管理(一)

Android studio UI操作依赖库

在使用Android studio中,最简单的添加新依赖包的方法是使用工程结构弹框。从文件按钮中打开界面,导航到依赖包导航栏,然后你就可以看到你当前的依赖包了:

Gradle for Android(三)——依赖管理(一)

当你想添加新的依赖包的时候,可以点击绿色的小按钮,你可以添加其他模块,文件,甚至是上网搜索。

Gradle for Android(三)——依赖管理(一)

使用Android studio的界面让你能够很简单的浏览你项目中的所有依赖,并且添加新的依赖包。你不必在build.gradle中手动的添加代码了,并且你可以直接搜索JCenter库中的依赖资源。

参考文章:
https://segmentfault.com/a/1190000004237922#articleHeader12
http://www.jianshu.com/p/9df3c3b6067a