美文网首页
1.5 通过代码添加依赖

1.5 通过代码添加依赖

作者: GuoYiheng | 来源:发表于2016-11-22 22:13 被阅读0次

    首先明确两个概念:依赖 (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),因此不建议这样写版本号.

    相关文章

      网友评论

          本文标题:1.5 通过代码添加依赖

          本文链接:https://www.haomeiwen.com/subject/zeelpttx.html