结合该4层架构、已有的代码,以及业务的后续演化,团队设计的新架构如下
分析工具
ArchUnit
有了架构设计后,我们就能识别代码的边界,这里我们可以通过Archunit进行边界约束描述。我们可以得到2条通用的守护规则。
- 垂直方向,下层模块不能反向依赖上层
- 横向方向,组件之间不能存在相互的依赖
转化为ArchUnit的测试用例如下:
@ArchTest public static final ArchRule architecture_layer_should_has_right_dependency =layeredArchitecture() .layer("Library").definedBy("..cloud.disk.library..") .layer("PlatForm").definedBy("..cloud.disk.platform..") .layer("FileBundle").definedBy("..cloud.disk.bundle.file..") .layer("DynamicBundle").definedBy("..cloud.disk.bundle.dynamic..") .layer("UserBundle").definedBy("..cloud.disk.bundle.user..") .layer("AllBundle").definedBy("..cloud.disk.bundle..") .layer("App").definedBy("..cloud.disk.app..") .whereLayer("App").mayOnlyBeAccessedByLayers() .whereLayer("FileBundle").mayOnlyBeAccessedByLayers("App") .whereLayer("DynamicBundle").mayOnlyBeAccessedByLayers("App") .whereLayer("UserBundle").mayOnlyBeAccessedByLayers("App") .whereLayer("PlatForm").mayOnlyBeAccessedByLayers("App","AllBundle") .whereLayer("Library").mayOnlyBeAccessedByLayers("App","AllBundle","PlatForm");
当然这个用例的执行是失败的,因为我们基本的包结构还没有调整。但有了架构守护测试用例,我们就可以逐步把代码移动到对应的Package中,直到守护用例运行通过为止。
接下来我们先运用IDE工具进行基础的包结构调整,调整后的结构如下
调整后运行ArchUnit测试运行结果如下
这些异常的提示就是我们需要处理的异常依赖。但是ArchUnit的这个提示比较不不友好,接下来我们介绍另外一种分析异常依赖的方式,使用Intellij Dependencies 。
Intellij Dependencies
我们选择对应的Package,选择Analyze菜单,点击Dependencies,可以找出该Package所依赖的相关类。
我们选择dynamic Package进行分析后,发现根据现有的架构约束,存在横向的Bundle依赖需要进行解除依赖。
我是在实际重构过程中,我们可以频繁借助该功能验证耦合解除情况,并且同时通过ArchUnit测试做好守护。
详细代码见Cloud Disk
总结
这一篇我们分享了如何借助工具进行异常依赖的分析。当我们有了未来的架构设计后,可以借助ArchUnit进行架构测试守护,通过Intellij的Dependendencies 我们可以方便以Package或者Class为单位进行依赖分析。
当我们已经分析出需要处理的异常依赖,接下来我们就可以逐步进行重构。下一篇,我们将给大家分享实践总结的一些重构套路,移动应用遗留系统重构(5)- 重构方法篇。
系列链接
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
详细整理在GitHub可以见;
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。