第十章 Android Gradle多项目构建

Android的多项目和其他基于Gradle构建的多项目是差不多,比如Java多项目、Groovy多项目,他们本身都是Gradle的多项目构建,唯一的区别是项目本身属性,比如这个项目是Java库、那个是Android App项目等等。

这一章我们简单的介绍下Android不同类型的项目,他们如何设置,如何引用以及库项目如何单独发布,像因多项目导致的65535等问题我们已经在上一章节做了介绍,这里就不再重复了。

10.1 Android项目区别

Android的项目一般分为 库项目、应用项目、测试项目,Android Gradle根据他们分别有3种插件
com.android.library、com.android.application、com.android.test。

库项目一般和我们的Java库非常相似,它比Java多的是一些Android特有的资源等配置。一般一些具有公用特性的类、资源等可以抽象成一个库工程,这样他们就可以被其他不用的项目引用;还有一种情况,比如我们的工程非常负责,我们可以根据我们业务,把我们的工程分成一个个的库项目,然后通过一个主的应用项目引用他们,组合起来,就是我们最终的产品->一个复杂的App了。

应用项目,一般只有一个,它可以打包成我们可发布的Apk包,如果工程太复杂,就像上面说的,它会引用很多的库项目,以便组成一个最终的App发布。应用项目有时也会有多个,比如我们发布了不同特色的App,但是他们又是同类产品,比如QQ的标准版、轻聊版,他们是同类产品,只不过轻聊版更简洁,去除了很多冗余的功能,这时候我们就可以创建两个应用项目,让他们引用不用的库项目,然后再分别根据需求做出相应的调整,就可以生成两个不同的App,满足不同人群的要求。

测试项目是我们为了对我们的App进行测试而创建的,比如测试Activity、Service、Application等等,他是Android基于Junit提供的一种测试Android项目的框架方法,让我们可以方便的对我们的Android App进行测试,保证质量。

10.2 Android多项目设置

多个项目的设置和Gradle的多项目是一样的,Android也是基于Gradle的,所以项目其实是Gradle的概念,项目自身的特性才是每个领域的细分和定义,比如Android项目、Java项目等等。

定义一个工程,包含很多项目,在Gradle中,项目的结构没有那么多的限制,不像我们用Eclipse+Ant构建的时候,路径都限制的很多,比如只能在根目录下等等,在Gradle中就没有这么多限制了,你可以通过文件夹组织你不同的项目,最终只要在setting.gradle里配置好这些项目即可。比如如下的项目结构:

严格的说应该是四个项目,还有一个根项目MyProject。根项目会有一个setting.gradle配置文件,每个项目里都有一个build.gradle文件,所以他们的结构为:

这就是一个完成的工程了,里面只要再加上一些Java文件、资源等等,就可以编译运行了,我们看下setting.gradle配置文件,也是非常简单的。

就是指定这几个项目,有时候如果项目的路径太深,我们可以用如下方法指定配置:

通过如上方法我们直接指定项目的目录即可。这样我们整个多项目配置的架子算是搭好了,增减项目可以模拟这个框架。

10.3 库项目引用和配置

多项目配置好之后,就要引用他们,尤其是库项目,不然我们多项目协作开发还有什么意义呢?一般引用的都是库项目,所以这里我们着重讲库项目引用。

Android库项目引用和Gradle的其他引用是一样的,都是通过dependencies:

这样我们就引用了这个lib库项目,就是这么简单,沿用了Gradle的依赖来进行关系,关于Gradle依赖可以请参考我们前面章节讲的。

需要特别说明的是Android App项目不光可以引用Android Lib项目,还可以引用Java Lib项目哦,这个看我们的需求,Android Lib是打包成一个aar包,Java Lib是打包成一个jar包,如果我们里面有资源,就是用Android Lib,如果没有并且是纯Java的可以考虑Java Lib。

引用Android库项目是引用的一个库项目发布出来的aar包,默认情况下,Android库项目发布出来的包都是release的,当然我们可以通过配置来改变它,比如改成默认发布的是debug的

这样我们就改成发布的是debug版本的aar包了,我们可以通过如上方式配置不同的发布版本,只要我们配置的这个名字是合法存在的即可--也就是Assemble任务能够打包出来的aar包。比如你配置了多个flavor,那么我们发布的就可以针对不同的flavor+buildtype配置,比如:

这样我们就发布了flavor1Debug这个aar包以供其他的的项目引用。

有朋友可能要问了,如果想同时发布多个版本的aar包以供不同的项目引用怎么办?比如我们要做一个产品,他们有不同的版本,但是都是一个产品,比如一个专业版,一个标版,他们有一些区别,不光是在App项目里体现,在我们的库工程里也要体现(比如库工程里针对这两种版本的资源不一样),这时候我们需要针对不同的版本,引用不同的发布的aar包。这是可以做到的,默认情况下是不能同时发布多个aar包的,我们可以开启。

这时候就是告诉Android Gradle插件我们这个库工程要同时发布不同的aar,这时候Android Gradle就会生成多个aar以供被其他项目引用,下面看下我们怎么分别引用他们。

看到这里大家看明白了把,对于lib这个库项目,我们先配置成可以同时发布多个aar,然后我们在其他引用工程里做如上示例的引用,比如flavor1这个渠道包就引用flavor1这个渠道对应的lib1库的release aar包;flavor2这个渠道就引用flavor2这个渠道对应的lib1库的release aar包。

以上这些引用都是在项目立直接引用,下一节我们讲如何发布我们的aar包到Maven中心库,以供其他项目引用。

10.4 库项目单独发布

项目直接依赖一般适用于关联比较紧密、不可复用的项目,对于这类项目我们可以直接基于源代码项目的依赖,有时候我们会有一些项目,可以被其他项目所复用,比如我们的公共组件库,工具库等等,这类就可以单独发布出去,被其他项目使用,就像我们引用jcenter上的类库一样方便,这一节我们就讲如何把库项目单独的发布到我们自己的Maven中心库.

要搭建自己的Maven私服,推荐使用Nexus Repository Manager,版本选择2.xx,下载地址: http://www.sonatype.com/download-oss-sonatype ,我这里选择的是2.12.1版本,我们选择nexus-2.12.1-01-bundle.tar.gz包下载解压,然后找到nexus-2.12.1-01\bin\jsw这个目录,可以看到有很多以操作系统和cpu架构命名的文件夹,你可以根据你的系统选择进入相应的文件夹运行start-nexus脚本即可启动Nexus,启动之后,我们在浏览器里打开 http://localhost:8081/nexus/ 即可访问,注意看右上角有个Log In链接,点击可以登陆管理Nexus,默认的用户名是admin,密码是admin123。关于Nexus的搭建和使用,非常简单,大家可以Google下相关文章,很容易的就会入门使用,这里不再多讲。

有了部署好的Nexus Maven中心库之后,我们就可以把我们的项目发布到我们的中心库了,要想通过Maven发布,首先我们得在build.gradle中应用maven插件:

apply plugin: 'com.android.library'
apply puugin: 'maven'

应用过之后,我们需要配置Maven构建的三要素,他们分别是group:artifact:version。

apply plugin: 'com.android.library'
apply puugin: 'maven'

version  '1.0.0'
group 'ory.flysnow.widget'

group和version比较方便,直接指定即可。对于version还有一个概念-快照版本SNAPSHOT,比如配置成1.0.0-SNAPSHOT,这时候我们在发布的时候就会发布到我们的snapshot中心库里,每次发布版本号不会变化,只会在版本号后之后按顺序号+1,比如1.0.0-1,1.0.0-2,1.0.0-3等等,类似于这样的,我们引用的时候版本号写1.0.0-SNAPSHOT即可,Maven会帮我们下载最新(序号最大的)的快照版本,这种方式适用于联调测试的时候,每次修复好测试的问题就发布一个快照版本,直到没有问题为止,然后再放出release版本,正式发布。

配置好group和version之后,我们来配置发布配置,比如发布到到哪个Maven库,使用的用户名和密码多少,发布什么格式的存档,它的artifact是什么等等:

如上所示,我们配置了uploadArchives,指定对应的mavenDeployer配置,这里配置了两个发布的Maven库,一个是release版本的,一个是snapshot版本的,并同时配置了他们的密码以及URL,URL是nexus maven提供的,可以打开Nexus网页版,点击右侧的repositorys菜单查看,里面配置了很多库,我们也可以新增一些自己的repository。

发布到Nexus Maven库之后,我们就可以像引用jcenter中的类库一样引用他们,要使用他们,我们首先得配置我们的仓库,因为我们新增了一个我们自己的私有Maven库,这个使用要告诉Gradle,不然它不知道这个私有Maven仓库的存在。

这样配置后,我们就可以在我们的依赖配置里引用刚刚发布的aar包啦

刚刚我们讲了我们可以发布快照版本,那么我们如何引用呢?因为快照版本的仓库和Release的不一样,所以我们还得要新增一个快照版本的仓库。

引用的时候时候把dependencies依赖换成如下这样即可:

这样所以解决了问题,但是会配置两个Maven库,而且他们非常相似,那么能不能用一个Maven库代替呢?答案是可以的,Nexus Maven为我们提供了一种group类型的repository,这种类型的repository可以同时集成好几个repository,把他们统一当成一个group来对外发布,比如Nexus内置的public group,就包含里release和snapshot,现在我们可以把Maven库的配置改为

这样就方便简洁多了,你可以在Nexus里配置public这个分组所管理的repository,可以增减,看你的需求,也可以新建其他group类型的repository来用,比如根据你们公司的事业部来创建不同的group给他们使用,很好的分离开了不同权限、不同业务需求的repository。

10.5 小结

有了前面几章的知识,这一章的理解简单的多,因为多项目其实就是不同项目的组合,前面我们已经针对单个项目的不同的配置,所以多项目要做的其实就是针对这些项目,采用Gradle的方式管理组合起来即可。

这一章节比较重要的新知识点就是库项目的单独发布,发布到Maven中心库,学会里这个,发布到其他如jcenter库就非常简单了,他们是类似的,你只要在jcenter注册好账号,得到发布的地址即可配置发布。


本文属自学历程, 仅供参考
详情请支持原书 Android Gradle权威指南

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,133评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • #在生活中如何改变自己 ##我们中间的各种事情让你繁杂不堪 我们总会看到好多的事情不会如人意。所以我们该如何制造自...
    f46b0f4e2bc8阅读 326评论 0 1
  • 参考目标: 1份肉2份豆制品3份“新鲜”水果4份谷物/薯5份蔬菜,深绿色叶菜最好6杯水 今日总结: 食物种类:23...
    静趣_儿童心理师阅读 181评论 0 0
  • 常被人说,“白日做梦”,“想法是挺好”,“你得现实一些” 这就是我们这一类人,二十多岁,正是鼓起帆,准备出海的年纪...
    商山君的小火炉阅读 911评论 0 2