1.5 通过代码添加依赖

2016-11-22  本文已影响0人  GuoYiheng

首先明确两个概念:依赖 (dependencies)发行 (publications).

我们的工程里的文件并不都是我们自己"生产"的,那些出于需要而导入的文件叫作"依赖 (dependencies)",Gradle要想构建并运行我们的工程就必须能找到这些文件.

与依赖对应,由我们的工程产出的文件被叫作"发行 (publications)",这些文件通过Gradle构建和上传.

多个依赖构成的一组被叫作配置(configuration).Android工程主要有三种配置:

compile:
编译时需要的依赖,默认的依赖配置,Gradle会把这些依赖添加到类路径(classpath)和应用的APK文件里.
apk:
运行时需要的依赖,Gradle会打包到APK文件里.只有JAR格式的依赖可以这样配置,其他库模块依赖或AAR依赖不可以这样配置.
provided:
编译时需要的依赖,但是Gradle不会打包到APK文件里.如果只是编译时需要,运行时不需要的某种依赖,这样配置会减小我们APK文件的大小.只有JAR格式的依赖可以这样配置,其他库模块依赖或AAR依赖不可以这样配置.

在上面三种配置基础上,我们可以再进行一些更详细的配置描述,比如针对编译时依赖,可以有testCompile(本地测试),androidTestCompile(apk测试),fullReleaseCompile(完全发布版本),fullDebugCompile(完全调试版本)等变体.

通过插件可以添加额外的配置,也可以自定义配置.


之前我们已经提到,安卓应用有两个build.gradle文件,除了为整个工程(Project)服务的build.gradle文件,还有一个是为模块(Module)服务的,它位于app子目录里.在这个为模块服务的build.gradle文件里,有一个dependencies代码块,我们的应用所需的依赖就在这个代码块里声明:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile project(":mylibrary")
    testCompile 'junit:junit:4.12'
}

基本语法[1]

1.添加一个远程依赖(Remote binary dependencies)的需要写出依赖的:(group),名(name)以及版本号(version)**:

testCompile group:'junit',name:'junit',vesion:'4.12'

除了上面标准的声明依赖(dependency)的方法,也可以直接通过冒号(colon)group,name以及version隔开来引用依赖库,这也是Android Studio里默认的格式:

testCompile 'junit:junit:4.12'

如果将版本号写成:

testCompile 'junit:junit:4.+'

就是告诉Gradle可以使用所有大于等于4.0的JUnit来进行测试[2].

2.如果是直接向配置添加一个本地文件集合(set)作为依赖(Local binary dependencies),可以通过在dependencies代码块里通过files或者fileTree语句来添加:

compile files('libs/a.jar','libs/b.jar')
compile fileTree(dir:'libs',include:['*.jar'])

3.也可以自己创建一个本地Android依赖库模块(Module dependencies):

compile project(":mylibrary")

这句是说添加了一个名为mylibrary的本地依赖库,在构建我们的app时会对这个依赖进行编译并添加到我们的app里.

同步工程文件

Android Studio会监控Gradle构建文件,一旦发生改变就会自动提醒我们.比如,在dependencies代码块里添加下面的语句:

compile 'org.xutils:xutils:3.3.36'

Studio就会弹出黄色警示条,提醒我们"Sync Now".点击"Sync Now"Studio就会自动下载xutils依赖并同步我们的工程文件:

G1
也可以通过点击Tools=>Android=>Sync Project with Gradle Files来同步:
G2

传递依赖

传递依赖(transitive dependencies)是指那些引用了其他依赖的依赖,因此在使用这些依赖时,除了它们本身,还需要导入它们所需要的依赖.
在标准的Java工程中,使用
dependencies命令就可以看到传递依赖.Android工程里使用androidDependencies**命令替代:

D:\Androidworkspace\***工程名***>gradlew androidDependencies

Incremental java compilation is an incubating feature.                                                                                                           
:app:androidDependencies                                                         
debug
\--- com.android.support:appcompat-v7:24.2.1
     +--- com.android.support:support-v4:24.2.1
     |    +--- com.android.support:support-compat:24.2.1
     |    |    \--- LOCAL: internal_impl-24.2.1.jar
     |    +--- com.android.support:support-media-compat:24.2.1
     |    |    +--- LOCAL: internal_impl-24.2.1.jar
     |    |    \--- com.android.support:support-compat:24.2.1
     |    |         \--- LOCAL: internal_impl-24.2.1.jar
     |    +--- com.android.support:support-core-utils:24.2.1
     |    |    +--- LOCAL: internal_impl-24.2.1.jar
     |    |    \--- com.android.support:support-compat:24.2.1
     |    |         \--- LOCAL: internal_impl-24.2.1.jar
     |    +--- com.android.support:support-core-ui:24.2.1
     |    |    +--- LOCAL: internal_impl-24.2.1.jar
     |    |    \--- com.android.support:support-compat:24.2.1
     |    |         \--- LOCAL: internal_impl-24.2.1.jar
     |    \--- com.android.support:support-fragment:24.2.1
     |         +--- LOCAL: internal_impl-24.2.1.jar
     |         +--- com.android.support:support-compat:24.2.1
     |         |    \--- LOCAL: internal_impl-24.2.1.jar
     |         +--- com.android.support:support-media-compat:24.2.1
     |         |    +--- LOCAL: internal_impl-24.2.1.jar
     |         |    \--- com.android.support:support-compat:24.2.1
     |         |         \--- LOCAL: internal_impl-24.2.1.jar
     |         +--- com.android.support:support-core-ui:24.2.1
     |         |    +--- LOCAL: internal_impl-24.2.1.jar
     |         |    \--- com.android.support:support-compat:24.2.1
     |         |         \--- LOCAL: internal_impl-24.2.1.jar
     |         \--- com.android.support:support-core-utils:24.2.1
     |              +--- LOCAL: internal_impl-24.2.1.jar
     |              \--- com.android.support:support-compat:24.2.1
     |                   \--- LOCAL: internal_impl-24.2.1.jar
     +--- com.android.support:support-vector-drawable:24.2.1
     |    \--- com.android.support:support-compat:24.2.1
     |         \--- LOCAL: internal_impl-24.2.1.jar
     \--- com.android.support:animated-vector-drawable:24.2.1
          \--- com.android.support:support-vector-drawable:24.2.1
               \--- com.android.support:support-compat:24.2.1
                    \--- LOCAL: internal_impl-24.2.1.jar

debugAndroidTest
\--- com.android.support.test.espresso:espresso-core:2.2.2
     +--- com.android.support.test:rules:0.5
     |    \--- com.android.support.test:runner:0.5
     |         \--- com.android.support.test:exposed-instrumentation-api-publish:0.5
     +--- com.android.support.test:runner:0.5
     |    \--- com.android.support.test:exposed-instrumentation-api-publish:0.5
     \--- com.android.support.test.espresso:espresso-idling-resource:2.2.2

debugUnitTest
No dependencies

release
\--- com.android.support:appcompat-v7:24.2.1
     +--- com.android.support:support-v4:24.2.1
     |    +--- com.android.support:support-compat:24.2.1
     |    |    \--- LOCAL: internal_impl-24.2.1.jar
     |    +--- com.android.support:support-media-compat:24.2.1
     |    |    +--- LOCAL: internal_impl-24.2.1.jar
     |    |    \--- com.android.support:support-compat:24.2.1
     |    |         \--- LOCAL: internal_impl-24.2.1.jar
     |    +--- com.android.support:support-core-utils:24.2.1
     |    |    +--- LOCAL: internal_impl-24.2.1.jar
     |    |    \--- com.android.support:support-compat:24.2.1
     |    |         \--- LOCAL: internal_impl-24.2.1.jar
     |    +--- com.android.support:support-core-ui:24.2.1
     |    |    +--- LOCAL: internal_impl-24.2.1.jar
     |    |    \--- com.android.support:support-compat:24.2.1
     |    |         \--- LOCAL: internal_impl-24.2.1.jar
     |    \--- com.android.support:support-fragment:24.2.1
     |         +--- LOCAL: internal_impl-24.2.1.jar
     |         +--- com.android.support:support-compat:24.2.1
     |         |    \--- LOCAL: internal_impl-24.2.1.jar
     |         +--- com.android.support:support-media-compat:24.2.1
     |         |    +--- LOCAL: internal_impl-24.2.1.jar
     |         |    \--- com.android.support:support-compat:24.2.1
     |         |         \--- LOCAL: internal_impl-24.2.1.jar
     |         +--- com.android.support:support-core-ui:24.2.1
     |         |    +--- LOCAL: internal_impl-24.2.1.jar
     |         |    \--- com.android.support:support-compat:24.2.1
     |         |         \--- LOCAL: internal_impl-24.2.1.jar
     |         \--- com.android.support:support-core-utils:24.2.1
     |              +--- LOCAL: internal_impl-24.2.1.jar
     |              \--- com.android.support:support-compat:24.2.1
     |                   \--- LOCAL: internal_impl-24.2.1.jar
     +--- com.android.support:support-vector-drawable:24.2.1
     |    \--- com.android.support:support-compat:24.2.1
     |         \--- LOCAL: internal_impl-24.2.1.jar
     \--- com.android.support:animated-vector-drawable:24.2.1
          \--- com.android.support:support-vector-drawable:24.2.1
               \--- com.android.support:support-compat:24.2.1
                    \--- LOCAL: internal_impl-24.2.1.jar

releaseUnitTest
No dependencies

可以看到,debugrelease版本都使用到了appcompat-v7支持库(Android Support libraries),而它又引用了Android SDK内置jar包里的support-v4库.
Gradle提供了采用(include)和排除(exclude)单独库的语法.默认情况下,Gradle开启了自动添加传递性依赖(transitive dependency)的功能,可以通过使用transitive flag来关闭这个功能:

dependencies {
    runtime group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.0.1',
     transitive: false
}

transitive flag设为false可以阻止Gradle下载传递性依赖,如果想添加就只能自己手动添加了.
也可以使用exclude语句排除传递性依赖:

dependencies {
    androidTestCompile('org.spockframework:spock-core:1.0-groovy-2.4') {
        exclude group: 'org.codehaus.groovy'
        exclude group: 'junit'
    }
}

上面的代码里,spock-core工程排除了Groovy依赖和JUnit库.

如果只是需要一个jar模块,而不添加其他依赖,则可以如下设置:

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.4@jar
    compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.4', ext: 'jar'
}

上面的代码中,上下两句效果是一样的,只是第一句是采用了简写的语法,使用<@>符号指出想要添加jar包,第二句是标准语法,使用的是ext (extension)关键字.

1.6 展示怎样通过Android Studio IDE添加依赖.
1.7 讨论仓储(repository)
4.5 讨论一个模块依赖其他模块的情况


  1. Gradle采用的Groovy语言既支持单引号引用字符串也支持双引号引用字符串,两者唯一的差别是双引号引用字符串支持内插(interpolation)和替换(substitution).
    与Java不同,Groovy语言句末不用添加分号(semicolon)

  2. 这种写法降低了构建的确定性(deterministic) 和可复性(reproducible),因此不建议这样写版本号.

上一篇下一篇

猜你喜欢

热点阅读