移动应用遗留系统重构(4)-分析篇,这份1307页Android面试全套真题解析

77 阅读4分钟

结合该4层架构、已有的代码,以及业务的后续演化,团队设计的新架构如下

分析工具

ArchUnit

有了架构设计后,我们就能识别代码的边界,这里我们可以通过Archunit进行边界约束描述。我们可以得到2条通用的守护规则。

  1. 垂直方向,下层模块不能反向依赖上层
  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)- 重构方法篇。

系列链接

移动应用遗留系统重构(1)- 开篇

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub可以见;

Android架构视频+BAT面试专题PDF+学习笔记

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。