最近一段时间,看到了一些Android项目组件化相关的文章,同时,因工作需要对Java Spring框架进行了初步的学习,他贯穿整个应用系统的面向接口编程思想来解决业务逻辑和其他各层的松耦合问题的方案让我感受颇深,尤其是其通过控制反转(IoC)技术促进低耦合,面向切面的编程思想等,使程序员能够编写更简洁、易于管理的代码。借此机会,我对当前Android项目的整体架构进行了思考和优化,主要目的是为了解决代码的耦合度高,复用率低,过于脆弱(修改一个地方,会导致看上去没有关系的另一个地方发生故障),从代码架构层面提升代码可扩展性、灵活性、可插入性、可复用性。
一、整体开发框架
首先来看一下当前项目的整体开发框架,主要分为四个部分:持续集成、脚手架、公共Lib以及组件/微服务,如下图所示。
二、持续集成
持续集成是一种软件开发的实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽早地发现问题。
对于Android程序开发来说,首先开发人员在开发工程中每天都要根据最新的代码构建安装包供测试进行评测,或产品人员体验最新的功能等。打包还要区分不同的版本,例如debug、release,线上和测试,混淆和非混淆等,并且对于上线包来说,还要集成不同渠道的安装包。整个集成过称是一个简单、耗时重复的过程,减少这个重复的过程可以节省时间和工作量。通过自动化的持续集成可以将这些重复的动作都变成自动化,让开发人员的时间更多投入到需要动脑经和更有价值的事情上面。
其次,持续集成系统自动检测有新代码进行构建,能够尽早发现集成过程中的问题。如果再将针对于软件的自动化测试与集成系统关联,能够尽可能早发现软件中存在的问题,提升软件质量,降低软件在开发过程中的风险。
一般使用Jenkins系统搭建持续集成的环境,关于持续集成环境的搭建,网上有很多教程,这里就不再细说了。下图是一个项目的持续集成构建环境。
三、脚手架
在实际的开发过程中,从零开始建立项目的结构时一件让人头疼的事情,所以各种脚手架工具应运而生。通过脚手架,能够快速搭建一个完整的项目结构,开发者只需要在生成的项目结构基础上进行开发即可,还可以定制项目所需要的基础模块,非常简单高效。对于脚手架的使用,可以针对项目的具体需求开展。
四、公共Lib
公共Lib就是公共代码库,就是将软件中多个模块公用的一些基础代码进行抽象封装,其他业务组件会直接引用该公共代码库中的代码文件进行扩展使用,主要目的还是为了提高代码的复用率。例如在我们的代码中,将于界面相关的代码抽取为一个uilib,该lib中实现了ui上面一些公用的代码功能,其他业务组件要实现ui界面时,都会引入该库,在该库封装了Activity、Fragment、Adapter等的基本行为,如果我要实现一个具有列表形式的页面,只需要继承uilib中的基础类,需要很少的代码就能实现需要的功能。公共代码库如下图所示:
公共代码库的根本目的是为了减少冗余代码,提高代码的复用率。使用公共代码库需要直接引入该库,继承或直接使用公共库中的代码,它会与业务代码产生耦合。如果项目中的某一部分代码模块具有这个特点,就可以把该部分代码抽取为一个公共代码库。
五、组件/微服务
组件/与微服务主要是为了降低代码的耦合度,但他们具有不同的意义。OOP是面向对象编程思想,就是把各功能封装为独立模块,各个模块按照面向对象程序设计思想进行实现。AOP是面向切面编程,它的意思是在各个独立的模块间,在特定的切入点进行hook,将共同的逻辑添加到模块中而不影响原有模块的独立性。Android中,有实现AOP的三大神器:
(1)APT:在代码编译期间生成.java文件;
(2)AspectJ:在.java编译为.class的时候,进行代码注入;
(3)Javassit:修改已经编译好的class文件。
各个工具操作时机如下图所示:
1、组件
组件我把它