安卓项目运用模块化对代码进行抽取

最近公司项目有个这样的需求。就是原有的智能巡检项目是区分内部使用版本和外部使用版本的,但代码都是一样的只是服务器地址不同而已,但后面的需求只想针对一个版本进行改动。所以就衍生出一个版本代码管理的问题。到底是用不同的代码分支管理内外部版本还是用同一个代码分支在代码内部区分管理不同版本。现对这两种方式的方案优缺点进行分析。

方案一:用不同代码分支进行版本管理

优点:针对不同需求只需要按需求完成功能。
缺点:会多出很多代码分支,不好管理。针对一些共通调整比如机型适配相关代码需要对每个代码分支的代码进行调整。

方案二:同一个代码分支通过标志位进行控制管理

实现方法:通过全局设置标志位进行控制,对相应版本通过标志位设置相应的业务逻辑。
优点:只有一份代码维护起来比较容易
缺点:相对方案一除了完成需求功能点还需要在代码中定多个标志位去区分不同版本的需求,而且需求功能点深入到业务代码中造成代码可读性差。

上述2种方案缺点可以说十分明显,基本不做考虑。

方案三:同一个代码分支以分模块的方式进行处理

这是目前智能巡检项目结构:

实现思路:

将现有app模块修改成library,重命名为business。作为一个基础公用业务模块供上层调用。新建2个app模块,将不同的业务逻辑抽取到对应app模块进行处理。然后运行相应的app模块就可以实现各自的业务功能。

调整后的智能巡检项目结构:

具体实现方法

考虑到模块的单向依赖特性及及需求变化可能涉及到所有功能。所以这里对应用的整条链进行抽取。并将相关依赖注入提取到app模块。
将原有业务作为基类放到business模块中,app模块中新增登录,主页面,任务,勘测功能包。


登录模块

清单文件中配置LoginInActivity为启动页面,继承business模块的LoginActivity,其他业务逻辑都和LoginActivity相同,唯一不同点是依赖注入自己模块的LoginInFragment,如果登录模块有业务变动便可在子类中进行处理。


LoginInFragment页面只是处理跳转到自己模块的主页面


主页面,任务,勘测模块

这三个模块中代码及作用与登录模块类似,这里不做赘述。

杆塔模块

以本期需求为例,杆塔fragment处理点击控件从原有的单选框变成多选框的逻辑。

为何需要对项目整条链都进行抽取?

1.考虑到需求的变动可能涉及到任何模块,如果只抽取勘测模块代码,下次需求变动涉及登录逻辑,还是得进行抽取。
2.因为模块的单向依赖特性,如果不进行整条链抽取,下层代码无法访问上层代码,无法进行页面跳转。
原有的跳转逻辑是通过反射的方式进行:


虽然通过这种方式也可以实现功能,但并不合适。主要弊端有:
1.影响代码的可读性。
2.额外消耗资源,影响性能。(使用反射性能较低,解释操作,最好只运用在对灵活性和扩展性能要求高的系统框架上。(1:无论通过字符串获取Class,Method,Field都需要JVM的动态链接机制动态进行解析和匹配。2:每一次反射调用都会造成Java安全机制进行额外的安全性验证,造成性能开销。3:反射代码使得许多JVM的运行时优化无法进行)
3.无法得到编译期 的代码安全保障,有些错误只有在运行期才能发现。
4.破坏了类的封装性,可以通过反射获取这个类的私有属性和方法。

模块优化

考虑到现在business模块包含内容还是太多,尤其是每次添加无人机适配相关代码都需要对每个项目进行适配代码添加,非常麻烦。所以考虑抽取出一个dji模块,专门对无人机机型,镜头相关代码进行处理。网络作为基本每个项目都不可或缺的部分这里也考虑进行抽取。最后调整后的结构如下:


你可能感兴趣的:(安卓项目运用模块化对代码进行抽取)