第十章 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权威指南

推荐阅读更多精彩内容