dependencies和api 的区别:
- implementation可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。
使用这个配置,可以显著提升构建时间,因为它可以减少重新编译的 module 的数量。建议,尽量使用这个依赖配置,会将依赖输出到(aar或apk)
- 如果使用api,一个module发生变化,这条依赖链上所有的module都需要重新编译,而使用implemention,只有直接依赖这个module需要重新编译。
会将依赖打包到输出(aar 或a pk)
- compileOnly
不会打包到输出(aar 或 apk)。这可以减少输出的体积,只在编译时需要,在运行时可选的情况,很有用。
- runtimeOnly
Gradle添加依赖只打包到 apk,运行时使用,但不会添加到编译路径
依赖的三种方式
- 本地 library 模块依赖
dependencies {
implementation project(":mylibrary")
}
- 本地二进制依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//如果只想依赖单个特定本地二进制库,可以如下配置:
implementation files('libs/foo.jar', 'libs/bar.jar')
}
- 远程二进制依赖
//等价于implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
implementation 'com.example.android:app-magic:12.3'
查看依赖树
展开 AppName -> Tasks -> android,然后双击运行 androidDependencies。运行完,就会在 Run 窗口打出依赖树了。
屏幕快照 2020-10-26 上午10.38.38.png强制使用某个版本
如果某个依赖项是必需的,而又存在依赖冲突时,此时没必要逐个进行排除,可以使用force属性标识需要进行依赖统一。当然这也是可以全局配置的:
dependencies {
compile('org.hibernate:hibernate:3.1') {
//如果出现冲突,gradle会选择目前版本作为最终版本
force = true
}
}
compile('com.zhyea:ar4j:1.0') {
force = true
}
configurations.all {
resolutionStrategy {
force 'org.hamcrest:hamcrest-core:1.3'
}
}
为某个变种的版本指定一个语言资源和屏幕密度
android {
...
productFlavors {
dev {
...
resConfigs "en", "xxhdpi"
}
}
网友评论