Gradle implementation和api依赖小结

Androd开发在最早的时候是基于eclipse和ADT插件的,当时的项目构建脚本是ant。后面google推出了自己的IDE工具android studio,是基于intellij社区版开发的Android专属IDE,采用了gradle作为构建脚本。gradle安装官方定义为一个基于groovy编译脚本的一个编译系统,我觉得称它为一个基于goovy语音的DSL更合理一点。去年做过一个分享叫gradle in action, 主要系统讲了gradle项目的框架、规则、语法等技术栈,还有如何自定义gradle插件。属于比较宏观的介绍,今天分享的内容则是gradle技术树中的一个子节点,主要是gradle中关于库的依赖管理。一个项目会不可避免要引入第三方库,有时项目太复杂,也会把项目拆成多个项目,以库的形式来引用,这种库的引入和管理就是依赖管理。iOS开发一般使用cocospod来做依赖管理,android开发gradle脚本自带了依赖管理支持,并且借用了java开发多年的积累,直接使用maven仓库。

Maven是一个基于项目对象模型的管理工具。什么是项目对象模型呢?官方文档描述称为maven项目的一个基本单元,通过pom.xml文件描述项目和项目的配置。我们随便找一个maven项目的pom文件看一下。其中三个节点很重要,groupId表示项目所属组织,通常以公司域名倒序,跟jave的包名命名类似,artifactId表示项目名,version表示项目版本号。通过这三个节点可以唯一的定位一个库。存放maven库的地方我们称作maven仓库,主要分为本地仓库和远程仓库,一个maven库存在本地仓库后才能被项目使用,项目在下载库时通常先在本地库寻找,本地库没有时再去远程库下载。远程库通常分为中央仓库和私库,中央仓库是由一些公司或组织维护,全球开发者都能访问和下载的仓库,私库通常是一些公司部署的只用特定用户才能访问到的仓库。比较知名的中央仓库有jcenter和mavencentral,最早android项目模板默认的仓库地址是mavencentral,后面换成了jcenter。 两个仓库的数据基本是互通的,jcenter会自动同步mavencentral的库,属于mavencentral的超集。但是发布到jcenter上的库也支持一键同步到mavencentral.

我们从pom文件中可以看到,依赖库也会有自己的依赖库的,所以当你依赖一个maven库,会递归的把它依赖的库都下载下来并引入到自己的项目,这个设计极大的方便了项目集成难度。以前在使用一个第三方库时经常需要根据编译错误挨个去下载它依赖的库,有的第三方库考虑比较周到把它依赖的库都打了进去,但是你使用时会经常出现各种冲突。使用依赖管理就不用担心这种情况了,因为递归依赖的库冲突时它会选择高版本覆盖低版本库,这就要求高版本的库需要向下兼容,即低版本的库可以用高版本的库替换,绝大多数库都能遵循此规则。

下面我们说下module依赖,一个复杂的项目会通过拆分子项目来方便管理。主项目会依赖子module项目,子module项目之间也会依赖。Android项目和maven项目很相似,但是它并不是maven项目,子module最终只会生成一个aar文件,它的依赖信息会在编译阶段同步到依赖它的module中。当一个子module依赖一个aar和jar时,jar文件会合并到生成的aar源码中,依赖的aar对于生成的aar内容不会有任何影响,只用于编译。但是子module库依赖的是maven库时,它的编译过程为根据依赖树,先编译子module,然后子module生成的aar参与编译父module,并且父module的依赖配置也会和子module的依赖配置先合并后再编译。

在gradle3.4以后,引入了implementation和api替换compile,我们可以初步理解api和原来的compile一样,现在我们重点来看一下implementation,通过查看文档我们知道implementation让module在编译时隐藏自己使用的依赖,但是这个依赖在运行时所有模块可见。这个关键字的引入主要是为了节省编译时间。这里有一个比较反常识的点,就是编译时和运行时使用的库可能不一样。首先子module依赖的库,对父module做了隐藏所以父module看不到,我们可以看一个例子, 子module中api引入一个库,父module中可以直接使用,但是改成implementation后父module却看不到了。这种方式可以对module间做隔离,对于正常开发也是有利了,防止我们使用了子module的依赖库。
我们可以再看一个例子(使用implementation),子module引入一个高版本库,父module引入一个低版本库,我们编译一下可以看到一个报错提示,但是子module引入低版本库父module引入高版本库,编译可以通过,大家能不能想一下两者有什么区别?前者报错原因是,子module依赖高版本库编译了aar,因为依赖隔离,在运行时引入的是父module的低版本库,这样可能因为库不兼容导致crash,所以针对这种情况作了报错。反过来,子module依赖低版本库编译的aar,在运行时引入的是高版本库,因为按照要求所有的库都要向下兼容,所以这种情况不会导致错误发生。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,621评论 1 62
  • 本文原作者为:kale2010 .blog地址:http://www.cnblogs.com/tianzhijie...
    NoValue阅读 3,552评论 0 11
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,711评论 2 59
  • 这周由班委的同学带我们领读了《如何阅读》这本书的前几个章节,莹莹,李程和东明,通过领读让我对这本书的兴趣更浓,也让...
    万物之父阅读 191评论 0 0
  • spree中的促销用于为订单折扣,以及在不为商品增加额外花费情况下为商品增加额外的功能。促销是spree中最复杂的...
    就叫初九吧阅读 607评论 0 1