企业级 Android 模块化平台设计建议

这篇文章是应对各个公司所谓的:架构组,基础组,移动横向组,这样的部门在开发与日常工作时提升效率的一些建议(这些问题都是在我本人曾经的工作中遇到的),同时也适用于模块化开发的场景。

本文将以模块化开发的场景作为切入点(基础架构组请将每个组件理解为一个独立模块) 首先,模块化开发这个普通的技术点我不打算再讲了,而且随着移动端技术越来越成熟,也没必要再去讲一些过时的东西了。
如果你还不懂什么是模块化开发,可以查看我2016年写的博客:《Android业务组件化开发实践https://kymjs.com/code/2016/10/18/01/

首先,这是一篇有门槛的文章,如果你们是只有两三个人的团队,那建议还是别折腾了,太浪费时间。如果是比较大的团队而且项目模块化已经完成了的,那还是可以考虑一下的,毕竟可以节省出来不少模块间联调与跨模块沟通的时间。

模块间联调

事实上我们的模块独立性已经做的非常好了,可以做到每个模块的增删,代码零改动,一行都不需要改。原理请见这篇文章:《优雅移除模块间耦合https://xiaozhuanlan.com/topic/9843071526
但不可避免的,还是有三四个强业务模块,必须依赖全局Service才能工作的。
还有就是某些模块虽然不依赖外部模块,但需要一些全局信息,例如id用户名这种。但是如果使用mock数据,又会增大工作量,开发不愿意做。
解决办法其实很简单,Android Studio是支持工程compile module的。如何做?来看张图:

setting.gradle文件中,可以指定一个project位置,这里就可以将一个外部工程中的模块导入到APP工程中了。

顺带一提,也有另一种实现方案是直接将工程中的module单独作为一个git仓库,然后在外层(工程级)仓库的.gitignore中配置忽略掉module。这样在本地看来就是一个工程级仓库中包含了多个module仓库。这种方式也可以达到目的,但我个人不推荐使用这种方式。

让模块引用与aar引用互斥

解决了前一个问题,在模块联调与源码修改的时候是非常方便了的。但是实际开发中,如果你直接这么做,一定会碰到有类冲突的情况。
举一个例子:
base模块是每个模块都会依赖的,此刻base被打为了一个aar包,在使用的时候直接compile
login模块依赖了base模块。
此时如果我想调试base模块,用上面的方法把base的源码导入,就会发生,项目中不仅依赖了base的源码,同时还引入了baseaar,就会造成类冲突。

top Created with Sketch.