什么是dependencies闭包及其关键字详解

简介: 项目里的build.gradle导了很多包,在依赖dependencies里有很多不同的关键字,在此分别记录一下。dependencies闭包的整体功能是指定当前项目所有依赖关系:本地依赖、库依赖及远程依赖。本地依赖:可以对本地Jar包或者目录添加依赖关系库依赖:可以对项目中的库模块添加依赖关系远程依赖:可以对jcenter库上的开源项目添加依赖,标准的远程依赖格式是:域名:组织名:版本号

项目里的build.gradle导了很多包,在依赖dependencies里有很多不同的关键字,在此分别记录一下。


dependencies闭包的整体功能是指定当前项目所有依赖关系:本地依赖、库依赖及远程依赖。


本地依赖:可以对本地Jar包或者目录添加依赖关系


库依赖:可以对项目中的库模块添加依赖关系


远程依赖:可以对jcenter库上的开源项目添加依赖,标准的远程依赖格式是:域名:组织名:版本号

implementation fileTree(dir: 'libs', include: ['*.jar']) // 本地依赖
implementation 'com.android.support:appcompat-v7:26.1.0'//远程依赖
implementation 'com.android.support:appcompat-v7:26.1.0'//远程依赖,com.android.support是域名部分,appcompat-v7是组名称,26.1.0是版本号
implementation project(':hello') // 库依赖
testImplementation 'junit:junit:4.12' // 声明测试用列库
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
在gadle3.0之后,默认的依赖由之前的compile更改为implementation

对比一下:

Android Studio 2.X Android Studio 3.X
apk runtimeOnly
provided compileOnly
compile api
没有对应 implementation
debugCompile debugImplementation
releaseCompile releaseImplementation
androidTestCompile androidTestImplementation


debugImplementation(debugCompile) 只在debug模式的编译和最终的debug apk打包时有效。

releaseImplementation(releaseCompile)仅仅针对release 模式的编译和最终的release apk打包。

androidTestImplementation(androidTestCompile) 只在单元测试代码的编译以及最终打包测试apk时有效。

freeddddffdfsdsfsImplementation(freeddddffdfsdsfsCompile)只有freeddddffdfsdsfs 模式下才有效

api (compile)


依赖向上传递


若A api B, B api C,C module对A module可见


对于各个渠道还可以单独依赖属于渠道特有的包,通过渠道名+api/compile指定,比如debugApi、releaseApi、testApi


implementation (新指令: 具备依赖可见性)


依赖不向上传递


若A implementation B, B implementation C,C module对A module不可见


若A implementation B, B api C,C module对A module可见


功能同api,区别仅仅是增加了依赖可见性


对于各个渠道还可以单独依赖属于渠道特有的包,通过渠道名+implementation指定,

比如debugImplementation、releaseImplementation、testImplementation。


compileOnly(provided)


只在编译时有效,不会参与打包


主要是为了方便程序编译通过的,不会打包到apk中,使用场景:android系统有这个API,但编译时需要引入才能构建通过,比如系统的APK依赖framework.jar、gson库等


若A implementation C,打包后apk(A + C);


而A compileOnly C,打包后apk(A);


该指令实质:A module假装依赖了C module通过欺骗编译器编译时检测以避免java.lang.ClassNotFoundException编译报错


使用情形


A implementation C,B implementation C,打包时A module生成aar(A + C),B module生成aar(B + C)


若改成A implementation C,B compileOnlyC,打包时A module生成aar(A + C),B module生成aar(B)


最终apk包(A + B + C),结果一致


虽然aar(B)不真实依赖C module,但B module确实用到了C module的api。


没有运行时错误的原因:aar(A + C)与aar(B)合并生成apk,B module运行时找到并调用aar(A + C)中的C module


runtimeOnly(apk)

只在生成apk的时候参与打包,编译时不会参与,很少用。不能在代码中直接调用依赖包的代码,否则会在编译时出错。



相关文章
|
前端开发
如何利用dnslog探测目标主机杀软
如何利用dnslog探测目标主机杀软
425 0
|
9月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课13 单机版转换为集群版
本文介绍如何将“本地存储实例”转换为“共享存储实例”,依赖于先前搭建的实验环境。主要步骤包括:准备PFS二进制文件、格式化共享盘为pfs文件系统、启动pfsd服务、停库并拷贝数据到pfs内、修改配置文件,最后启动实例。通过这些操作,成功实现了从本地存储到共享存储的转换,并验证了新实例的功能。相关系列文章和视频链接提供了更多背景信息和技术细节。
225 0
|
存储 缓存 安全
ConcurrentHashMap的实现原理,非常详细,一文吃透!
本文详细解析了ConcurrentHashMap的实现原理,深入探讨了分段锁、CAS操作和红黑树等关键技术,帮助全面理解ConcurrentHashMap的并发机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ConcurrentHashMap的实现原理,非常详细,一文吃透!
|
存储 安全 API
深入理解RESTful API设计原则
本文旨在探讨RESTful API设计的基本原则和最佳实践,帮助开发者构建高效、可维护的Web服务。通过分析REST架构的核心概念,如资源、统一接口、无状态通信等,本文将指导读者如何设计符合REST原则的API,以及如何处理常见的设计挑战,如版本控制、错误处理和安全性问题。
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
1166 0
|
算法 安全 网络安全
|
图形学
【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)
【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)
1559 0
|
API 数据库
什么是营销服务?服务营销简易理解
营销服务是企业推广产品、吸引客户和提升销售额的关键手段,包括市场调研、广告、促销和客户服务。线上营销如网络广告和社交媒体推广,线下营销如门店促销和展览会,帮助企业了解市场、塑造品牌形象、增加销量。通过精准营销、优化服务和强化品牌宣传可提升营销效果。AokSend提供高效验证码发信服务,助力企业营销。企业需不断创新营销策略以适应竞争环境。
|
Android开发
Android stdio 无法新建或打开AIDL文件(解决方法)
Android stdio 无法新建或打开AIDL文件(解决方法)
1299 0
|
前端开发 API 开发者
前端 CSS 经典:边框转圈动画效果
前端 CSS 经典:边框转圈动画效果
517 0