首先明确两个概念:依赖 (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依赖并同步我们的工程文件:

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

传递依赖
传递依赖(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
可以看到,debug和release版本都使用到了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 讨论一个模块依赖其他模块的情况
网友评论