优秀框架源码分析系列(一)让解耦更轻松!多进程组件化框架-ModularizationArchitecture

栏目: Android · 发布时间: 6年前

内容简介:今天开始,我将陆续推出一系列的Android相关的优秀开源项目源码分析系列文章,每一期选取一个框架来进行分析解构。帮助大家更好的了解优秀框架的设计思想。分析的方式会选择从源码本身进行讨论,学习其设计思想,取长补短,每一个设计都有它值得学习的地方,大家各取所需,我相信,无论是成功的经验,还是失败的教训,都是一样有价值的。ModularizationArchitecture是一套Android彻底组件化框架。它主要提供了以下几个功能:每个独立进程的组件,均需包含如下几个部分:

今天开始,我将陆续推出一系列的Android相关的优秀开源项目源码分析系列文章,每一期选取一个框架来进行分析解构。帮助大家更好的了解优秀框架的设计思想。分析的方式会选择从源码本身进行讨论,学习其设计思想,取长补短,每一个设计都有它值得学习的地方,大家各取所需,我相信,无论是成功的经验,还是失败的教训,都是一样有价值的。

ModularizationArchitecture概述

ModularizationArchitecture是一套Android彻底组件化框架。它主要提供了以下几个功能:

  • 进程间,进程内组件间的路由通信机制
  • 进程间,进程内组件行为功能的封装机制
  • 组件的加载(初始化)、卸载机制
  • 提供组件化核心基类

工程结构

macore
maindemo
musicdemo
picdemo
webdemo

组件的框架

每个独立进程的组件,均需包含如下几个部分:

Logic
Provider
Action
RouterConnectService

如果是非独立进程的组件,则只需包含如下几个部分:

Logic
Provider
Action

组件化内核之macore

macore 提供了框架基础,为组件化提供基础功能。

组件间通信机制

组件间通信采用了C/S架构,跨进程通信采用了Binder调用。其核心是通过 LocalRouterWideRouter 两个类来实现。

路由器( LocalRouterWideRouter

本地组件间通信通过 LocalRouter 来完成,进程间组件通信是通过WideRouter来完成。如果是跨进程模式, WideRouter 则独自运行在一个路由进程中。查看 macore 中的 MaApplication.java 中的 startWideRouter() 方法和 AndroidManifest.xml 不难发现, macore 运行后会创建一个 com.spiny.ma.widerouter 的进程。

这里分别给出 LocalRouterWideRouter中route 方法的逻辑图,以便更好的理解。

LocalRouter.route()

优秀框架源码分析系列(一)让解耦更轻松!多进程组件化框架-ModularizationArchitecture

WideRouter.route()

优秀框架源码分析系列(一)让解耦更轻松!多进程组件化框架-ModularizationArchitecture

路由器守护服务(LocalRouterConnectService、WideRouterConnectService)

路由器守护服务用来实现 LocalRouterWideRouter 的双向互联。

LocalRouter 作为组件的路由,既负责向WideRouter发送组件内部的跨进程调用,又负责接收来自 WideRouter 的跨进程调用。当其负责接收外部调用时,是作为C/S架构中的 Service 存在的,所以这个服务通过 LocalRouterConnectService 来提供。 WideRouter 通过 LocalRouterConnectService 向该组件发送请求,它是组件向外界提供能力的桥梁。

正如刚才说到的, WideRouter 本身提供的对外功能就是为各个组件中转请求,实际上,它提供的就是一种路由服务,从这个层面上来讲,它也是一个组件。所以它也需要一个 Service 向外提供服务,即 WideRouterConnectService ,其它的 LocalRouter 通过连接到这个服务,与 WideRouter 建立通信通道。

在多应用多产品开发场景日益普遍的今天,在多个应用内同时引入ma框架,由多个WideRouter组成更大的组件化网络,也不失为一种策略。尤其是当我们要对产品进行平台化演进时,将众多的基础功能服务以一个App的形式提供出去,暴露多种服务供其他应用调用的时候,组件化思想会为多模块,多应用并行开发提供可能。

组件生命周期

组件生命周期管理器(BaseApplicationLogic)

设计了一个包含类似 Application 一样的生命周期管理类,每一个组件都实现一个这样的生命周期管理类,负责处理组件本身的初始化和去初始化动作。使用组件时,将这个生命周期类与应用的 Application 类进行绑定,这样组件的生命周期就和应用的生命周期绑定了。

组件其他辅助类

Wrapper

  • PriorityLogicWrapper :在多组件的生命周期管理上,组件的加载可能需要维护一定的顺序以保证逻辑的正确性。PriorityLogicWrapper对管理器进行了包装,增加了一个优先级属性,这样,程序员只需要在最开始指定好优先级,就不用担心在后续的维护过程中因过失而使初始化失序。

  • ConnectServiceWrapper :承载继承自LocalRouterConnectService的类。所有组件中实现的LocalRouterConnectService扩展类,都将在macore组件中被ConnectServiceWrapper包装起来。可能就是为了写起来方便吧。

Action、Provider

  • MaAction :所有Action的基类。组件可以通过继承它实现自己对外提供的服务。
  • MaProvider :所有Provider的基类。
  • MaActionResult :服务调用在组件间传递的返回的结果类。
  • ErrorAction :当请求的服务不存在或不可用时,默认返回的错误。

RouterRequest、RouterResponse

  • RouterRequest :由调用方创建的,服务调用的请求封装类。其内部实现了类似消息池一样的数组。以保证对象创建更高效。
  • RouterResponse :对调用结果的包装类,承载了调用的返回情况。其中包含了字符串化的MaActionResult。

MaApplication

扩展自 Application 的类,将组件化框架的基础组件初始化框架封装在其中。这样,框架的使用者无需关心框架的初始化细节,而只需要关注组件本身的生命周期即可。

主程序(Host)实现

Host 是整个应用的 Application 实现部分,其他组件都是以 Library 的方式存在的。 Host 负责对其他组件进行注册,并将应用的生命周期和 macore 进行绑定。这些都在 MyApplication 中实现。

@Override
public void initializeAllProcessRouter() {
     WideRouter.registerLocalRouter("com.spinytech.maindemo",MainRouterConnectService.class);
        WideRouter.registerLocalRouter("com.spinytech.maindemo:music",MusicRouterConnectService.class);
        WideRouter.registerLocalRouter("com.spinytech.maindemo:pic",PicRouterConnectService.class);
}

@Override
protected void initializeLogic() {
        registerApplicationLogic("com.spinytech.maindemo",999, MainApplicationLogic.class);
        registerApplicationLogic("com.spinytech.maindemo",998, WebApplicationLogic.class);
        registerApplicationLogic("com.spinytech.maindemo:music",999, MusicApplicationLogic.class);
        registerApplicationLogic("com.spinytech.maindemo:pic",999, PicApplicationLogic.class);
}

@Override
public boolean needMultipleProcess() {
    return true;
}
复制代码

Host 同时也是一个组件,其对外也同样提供服务。所以,它也对应实现了 Logic , Provider 以及一系列 Action 。由于开启了多进程模式,所以也实现了 RouterConnectService ,它扩展自 LocalRouterConnectService

其他组件

工程下还包含了其他几个示例组件:musicdemo、picdemo、webdemo。

其中musicdemo和picdemo均为单独运行在一个进程中的组件,而webdemo与maindemo运行在一个进程中。当我们需要新开发某个组件的时候,只需要按组件的实际功能实现 ActionProvider 以及 Logic 即可。如果是跨进程组件,还需要扩展实现 LocalRouterConnectService

总结

组件化提出已经很久了,它可以从很多方面解决我们实际项目开发中的问题,无论是技术上的实现问题,还是人员组织结构和项目分工上,都提供了很好的方式。换句话说,因为在架构上解决了耦合问题,使得项目开发的组织上也可以很轻松的实现解耦,不失为一举两得。在此,我们再重复一下组件化框架解决的几大问题:

  • 代码解耦
  • 代码隔离(可见性)
  • 组件(功能模块)单独调试
  • 集成调试
  • 组件(功能模块)生命周期管理
  • 组件间数据通信

源码地址

下面是项目的源码地址:

ModularizationArchitecture源码

我读了一遍后,做了些简单的Bug修复,下面这个是我fork后的地址:

修改后的ModularizationArchitecture

最后,感谢Spiny Wang的优秀开源框架


以上所述就是小编给大家介绍的《优秀框架源码分析系列(一)让解耦更轻松!多进程组件化框架-ModularizationArchitecture》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

实战移动互联网营销

实战移动互联网营销

江礼坤 / 机械工业出版社 / 2016-1 / 79.00

移动互联网的兴起,又为企业带来了新的挑战与机遇!越来越多的人,看到了移动互联网的价值与前景,但是在具体操作时,移动互联网具体如何玩?企业如何向移动互联网转型?如何通过移动互联网做营销?等等一系列问题,接踵而至。虽然目前相关的资料和文章很多,但是都过于零散,让人看完后,还是无从下手。而本书旨在成为移动互联网营销领域标准的工具书、参考书,为大家呈现一个系统、全面的移动互联网营销体系。让大家从思维模式到......一起来看看 《实战移动互联网营销》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试