Gradle Builds Everthing —— 产物输出
Gradle 打包的时候,还有个最终要的东西 —— 产物,这里的产物包括提供给别的项目的产物,今天我们来讲一讲,产物这个东西。
首先,看下我们前面介绍了的 Configuration 对象,我们看下这个接口声明知道这个对象有 incoming
和 outgoing
两种模式,incoming 我们会用的多一点,就是从这个 Configuration 中获取产物,比如:
dependency {implementation `aa:bb:1.0.0`implementation `cc:dd:1.0.0`
}
那么我们可以使用 project.getConfigurations().maybeCreate("implementation")
获取到 implementation 相关的信息,同时使用 getIncoming()
拿到 ResolvableDependencies 对象,然后可以调用 getFiles()
等直接拿到下载的文件。但是我们前面知道,依赖下载来之后会根据一些规则做一些转换,比如我们使用的 aar 是不能直接参与编译的,需要解压,解出资源,class 文件,R.txt 等参与编译,所以如果我们想获得特定的类型,需要使用 artifactView 获取一个视图。
Outgoing 和 Configuration 的关系
以上是 incoming 的用途,也就是 ResolvableDependencies,我们现在要关注下 outgoing,就是 ConfigurationPublications,这个类用来注册产物信息。
在注册产物前,我们需要先定义一个 Configuration,因为 Configuration 里面配置了 Attributes —— 这个类用来标注产物的一些属性,只有过滤器对应上这个属性之后,我们才能获取到相关的依赖。那么我们首先想想两个项目编译
这样的关系,我们关注到 mylibrary 产出产物,成为 Producer(P),app 消化 mylibrary 的产物,称为 Consumer(C)。
Attribute 的定义
那么这里,我们定义,P 和 C 都有一些属性(Attribute),就像一对男女朋友一样,只有对上眼了才有可能互相选择在一起,他们互相挑选的方式就是使用 Attribute,在默认情况下,只有 Attribute 「相符」的情况下才可以被 C 消费,那么怎么定义相符呢?首先默认的规则是这样的:
如果 P 和 C 都拥有一个 attr name 相同的 attr,一旦 attr 的值不一致,则判断为不匹配。
如果 P 和 C 拥有对方没有的 attr,那么认为他们依然匹配。
P 和 C 的 attr 可以设置一些规则(Rule)来解决冲突和兼容问题,主要是 AttributeCompatibilityRule 和 AttributeDisambiguationRule 这两个类。
C 去找 P 的过程就是仅仅是通过 Attribute 过滤找,没有别的要素,那么知道这个之后,我们想让 C 拿到我们的结果的时候,只要让 P 的 attribute 匹配上就好了。
综上,我们为了不污染 mylibrary
这个项目中其他的 Conguration 的配置(每个 Configuration 事实上就是一系列 配置的集合),我们需要新建一个 Configuration。Android Gradle Plugin 比较喜欢用 "apiElements" 和 "runtimeElements" 代表编译时和运行时的依赖。
我们把 Attribute 放大看全一点:
记住我们刚刚的原则:
默认情况下,如果有相关的属性,值一定是一样的。
我这里截图的是一个 application 工程,所以 AndroidTypeAttr 是 APK,如果是 AAR 的话,值就是 AAR。
我们在 Consumer 里面的 ArtifactView,先获取到引入 mylibrary 的 Configuration 名称,并设置以上的几个 Attr,就能获取到这个产物了。
Outgoing 产物设置
上面我们简单讲了下 Attribute 和 Configuration 之间的关系,后续我会专门开篇讲这个,因此我们先点到为止。下面我们讲讲 Outgoing 的用法:
runtimeConfig.getOutgoing().variants(variants -> variants.create("xxxx-artifact", configurationVariant -> {configurationVariant.artifact(artifactFile, configurablePublishArtifact -> {configurablePublishArtifact.setType("jar"); configurablePublishArtifact.builtBy(bundleArtifact);});}));
其中, configurationPublishAritfact 是 ConfigurablePublishArtifact
这个类,为 artifactFile 这个文件定义了一些,具体可以看下这个类的定义:https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/ConfigurablePublishArtifact.html
其中 setType 是设置这个文件的 artifactType,默认是文件的后缀名,如果我们改成其他 Consumer 的 ArtfactTransfomer 产物类型的话,Consumer 就能省去 Transform 这一步,直接使用我们导出的产物。
所以,从这里我们可以知道,虽然 mylibrary 的最终产物是 aar,但是 app 依赖 mylibrary 的时候,是并不需要 aar 这个产物的,因为在 aar 打包之前,这些产物都已经存在,完全没有必要再解压提取一次。
builtBy
这个是定义了产物的依赖,如果 app 在 task 执行阶段需要提取这个产物的时候,就先要执行 builtBy 的这个 Task。
从这里我们终于知道了 app 的 task 和 mylibrary 的 task 是通过 产物
这条链连在一起的。
结语
我们通过本文知道了 Configuration Outing 的用途,后续会跟大家进行实战项目解说,我们来自定义一个 Configuration 和产物类型,敬请期待。
Gradle Builds Everthing —— 产物输出相关推荐
- (Google I/O '17) Speeding Up Your Android Gradle Builds 在本地的实践
引子 一直以来,由于项目中加入的module太多,全量编译一次公司的安卓项目需要2个小时.后来作死换了一台iMac全量编译一个安卓的项目需要四个多小时.幸亏有高人的指点,参考了2017年Google ...
- Speeding up Gradle builds
Speeding up Gradle builds 转载地址: http://kevinpelgrims.com/blog/2015/06/11/speeding-up-your-gradle-bui ...
- Gradle Builds Everything——Task 实例
作者:阿温先森 上文 讲述了 Gradle 中关于任务的基础概念,本文开始讲述下 Task 是如何定义的. 为了方便,我们的语境分不开 Gradle和 AndroidGradlePlugin,因此此处 ...
- gradle:Creating New Gradle Builds
新建project 在project的rootPath添加一个build.gradle空文件 cmd进入rootPath,运行命令gradle wrapper,会生成一些wrapper文件 运行pro ...
- 压缩Gradle构建 (Squeezing your Gradle builds)
Android studio 来自通过Gradle 做为一个构建和打包android工程的工具,这个强大的工具,非常有用,能够提供很多强大,满足开发复杂android工程.这些工程可能包含不同的mod ...
- Android Studio Gradle输出信息乱码
在更换android studio 版本之后,一般windows 版本在项目构建过程中,gradle 相关的信息输出,会出现乱码,基本上明知是字符编码的问题,但看着就是不爽,例如下面这的情形: ע: ...
- Gradle 2.0 用户指南翻译——第五十章. 依赖管理
本文禁止w3cschool转载! 翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc . 本文翻译所在分支:https://github.com/m ...
- 深入理解Android之Gradle
深入理解Android之Gradle 格式更加精美的PDF版请到:https://pan.baidu.com/s/1GfN6F8sOaKFAdz5y1bn3VQ下载 weibo分享失效,请各位到百度云 ...
- linux中gradle编译慢,6个技巧加速你的gradle编译
近期我们都在讨论build系统,我们看了一些技巧能够让你的Maven build更快. 结论和反映都势不可挡.由于我们提供的技巧,很多其它的人都非常高兴能加快他们完毕自己的项目.如今,让我们看一下怎么 ...
- Gradle 2.0 用户指南翻译——第五十六章. 多项目构建
本文禁止w3cschool转载! 翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc . 本文翻译所在分支:https://github.com/m ...
最新文章
- CSS HACK:IE6、IE7、IE8、Firefox兼容性问题解决方案
- 如何获取文件的完整路径?
- python软件怎么用-如何使用Python编写一个桌面软件系统?步骤有哪些
- 使用Python将Excel中的数据导入到MySQL
- C语言与C++的区别,从7个角度来区分C语言与C++
- spring-security问题记录---Could not decode JSON for additional information: BaseClientDetails
- [2019HDU多校第一场][HDU 6590][M. Code]
- Pacman主题下给Hexo增加简历类型
- E - Palindrome Numbers
- android压缩图片,并将其转化成base64提交到服务器
- 推荐linux输入法,linux中文输入法
【搞定技巧】
- python和ruby性能比较_Ruby和Python的比较
- Android Google Play 支付SDK接入指南
- What Makes a Good Teacher
- iOS性能优化-UI卡顿检测
- Access-Control-Allow-Credentials
- - Statement
- eclipse中遇到的问题(2)
- 张凤莲:换城市工作就一定要转移社保吗?
- STM32F1CAN通讯
热门文章
- ES Transport Client学习
- 代码评审系统 ReviewBoard 和 Gerrit
- 学习笔记(1):Linux操作系统入门培训_Linux/Unix基础培训教程视频课程-01.Linux入门培训之_软硬件平台介绍...
- java百度贴吧一键签到,手机百度贴吧怎么一键签到?手机贴吧一键签到怎么用?
- html中设计对联,js实现很实用的对联广告代码 可自适应高度
- 医疗his系统的优势
- php 缩略图插件,ZblogPHP SF的缩略图插件阿帕奇服务器(.htaccess)的缩略图实现伪静态...
- Fujitsu Lifebook U1010安装XP TabletPC 2005完全攻略
- 全网最有效软考高项十大管理ITTO记忆:宫殿记忆法、主线记忆法、逻辑记忆法、跟踪记忆法、诗词记忆法
- vlc 网页插件的 使用与控制 API