组件化之路

Catalogue   

Android项目架构发展史

在说组件化之前,有必要讲讲Android项目的设计发展过程,也有必要讲讲在移动端兴起之前,其他语言是如何做项目架构设计的。

写代码最基础的一个准则就是分层,分层有利于扩展。比如我们的计算机就分为硬件、驱动、系统层、应用层,网络被分为物理层、数据链路层、网络层、传输层、应用层。
而写代码中最著名的分层思想就是MVC。MVC模式最早由Trygve Reenskaug在1978年提出,MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,
并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。软件系统透过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。

运用MVC,我们会把代码分为视图(View)、模型(Model)、控制器(Controller),不同层也可以向上抽象,比如抽离出通用的视图,达到复用的效果。

Android中,我们是如何进行重构优化的呢?

  • 封装代码
    • 封装Http请求,使用自己内部的一套接口,具体实现可以是OKHttp,其他库也都做类似封装;
    • 封装BaseActivity、BaseFragment、BaseView,将一些比如uiHandler、模版方法放到基类里;封装通用的UI控件;
    • 封装常用工具方法,比如字符串处理、文件处理、时间处理、线程池等;
  • 模块化
    • 将以上封装的代码放到单独的module,并存储到单独仓库,单独部署到代码中心;
    • 根据业务的不同,划分不同的module,比如分享module、媒体处理module、图片处理module、事件总线module、支付module、IM module等等;
  • 代码分层
    • MVP:添加一层Presenter,将业务逻辑的操作放到这一层,释放Activity、Fragment中的压力;
    • MVVM:划分层次更细,并基于最新的LiveData等技术,降低了OOM的可能性;
    • 使用Dagger、WMRouter、Hilt等技术实现模块间通讯,主要还是降低模块之间的耦合性;
  • 插件化
    • 进一步解耦不同业务;
    • 降低包体积;
    • 动态更新;
  • 跨端技术
    • Hybrid:由Native通过JSBridge等方法提供统一的API,然后用Html5+JS来写实际的逻辑;
    • React Native:Facebook发起的开源的一套新的APP开发方案,使用JS+部分原生语法来实现功能;
    • Flutter:Google出品,高性能的跨端方案;

组件化的好处

  • 业务解耦
  • 提高开发效率
  • 提升编译速度
  • 提高代码复用性

如何实现组件化

获取不同组件实例对象

我们可以把需要暴露出的对象通过接口的方式暴露给其他组件使用,内部通过某种方式建立与接口的联系,当使用时,可以动态创建该对象。行话叫依赖注入。

Dagger、ARouter、WMRouter、Hilt等为我们提供了相关功能,其内部原理类似,基于标注,建立关联关系。当然,里面还有很多需要注意的点,比如有时候需要的单例对象,
有时候需要考虑到生命周期。大家可以根据自己的需要选择不同的实现方式。

组件间页面跳转

我们要跳转到一个新的页面,一般都是通过startActivity(context, XXXActivity.class)进行跳转的。不同的组件具体实现是不会彼此依赖的,
也就是说在A组件中是拿不到B组件的对应Activity的。我们可以采用的方案有:

隐式跳转

使用这个方式,需要很多配置,比较麻烦。

接口封装

比如,在B组件中,我们提供的接口层,添加一个startHomePage(Params params)方法,A组件中通过接口获取对应实例调用这个方法,这个方法的具体实现在B组件内部。

路由方法

ARouter、WMRouter都提供了基于标注的方式,实现的页面跳转。我们只需要在对应Activity的头部进行标注设置,在使用框架提供的工具方法进行跳转即可。
这里实现的原理是基于Java的标注解析器,保存相应关系。

参考