ITPub博客

首页 > 应用开发 > IT综合 > 电商直播系统源码模块自加载的常见方案

电商直播系统源码模块自加载的常见方案

IT综合 作者:云豹科技晓彤 时间:2021-10-10 16:53:14 0 删除 编辑

背景

在 电商直播系统源码模块化架构中后,子Module 间相互解耦,作为独立的模块运行。如果 子Module 也需要进初始化的操作,那么电商直播系统源码该如何做呢?可能你会说,直接在 壳App Application的onCreate函数进行初始化就可以了,但这样会带来一些新的问题:

  1. 我们并不需要 壳App 去关注模块内部的业务,所以每个模块的初始化应该由自身管理;
  2. 并不是所有子模块的初始化,都需要在 Application onCreate() 时去进行加载,这样会极大影响应用的启动速度。所以每个模块的初始化应该按需加载;

常见方案及优缺点

1、ContentProvider

实现原理:每个 子Module 内部自定义 ContentProvider ,在应用 Application 的 onCreate 函数执行前,电商直播系统源码就会自动的顺序调用 子Module 的 ContentProvider 的 onCreate 函数,也就实现了 子Module 的自加载功能。例如 WorkManager 也是根据这个原理,其内部声明了 ContentProvider 来实现这种自加载方案。

ContentProvider.png

优点:

  1. 模块间充分解耦,代码边界独立

弊端:

  1. ContentProvider 的启动是有性能损耗的,在子模块较多(业务逻辑较多的 App,可能会有几十个 子Module )的情况下,有一定的性能损耗;
  2. 需要继承 ContentProvider 类并在 AndroidManifes 中声明,代码不够简洁和优雅;
  3. 无法控制初始化的时机,在应用启动时就会初始化所有的子模块,而初始化本身可能就是一件比较重的业务逻辑;

2、ARouter

实现原理:通过路由的方式,实现子Module的初始化。

preload.png

定义通用IPreloadProvider接口

interface IPreloadProvider: IProvider {
    fun preload()
}

在电商直播系统源码主module中进行初始化调用

fun ARouter.preload(context: Context, path: String) {
    val preloadProvider = this.build(path).navigation(context.applicationContext) as IPreloadProvider
    preloadProvider.preload()
}

优点:

  1. 在多数场景下,我们都会使用 ARouter 来进行模块化设计,而ARouter天然支持这种路由调用的方法,简单好用;
  2. 代码边界独立,壳App 与 子Modoule 间不需要代码上的直接依赖;

弊端:

  1. 壳App需要关心 子Module 的业务,设计上有一定的耦合;
  2. 初始化的代码块容易膨胀,且各个 子Module 的初始化代码均在一起,后续难以阅读和维护;

3、App Startup

Startup1.png

Startup2.png

优点:

  1. App Startup 是 为了解决因 App 启动时运行多个 ContentProvider 会增加 App 的启动时间的问题,使用了一个 InitializationProvider 管理多个依赖项,消除了每个库单独使用 ContentProvider 成本,减少初始化时间;
  2. App Startup 可以自动初始化 AndroidManifest.xml 文件中 InitializationProvider 下面的 声明要初始化的模块,并允许自定义模块初始化顺序;
  3. App Startup 提供了一种延迟初始化模块的方法,减少 App 初始化时间;

弊端:

  1. 使用时需要修改 AndroidManifest 文件,使用不够简洁;
  2. 子Module 功能比较独立,且很多情况不需要即时加载(不需要在应用启动就进行初始化的动作),如果使用延迟加载的话,又需要使用代码主动执行初始化操作,那么势就必存在对应的引用。而我们的 子Module 依赖其实是建议使用 runtimeonly ,减少代码上的直接依赖;
  3. 无法解决 需要时加载这种需求;
  4. 加载时序是在 Application onCreate 之前,依赖的通用库此时可能并未被加载成功;

4、方案总结

所以,我们需要一个电商直播系统源码的模块自加载方案,能够解决上面的问题,且能满足各种场景的需求:

  • 代码简洁,使用方便,逻辑清晰;
  • 子Module 的预加载或者预启动,由 子Module 自身来管理,避免与其他模块的逻辑耦合;
  • 加载时机可以控制,能做到即时加载或者懒加载,避免产生性能损耗;
  • 不产生额外的性能损耗(可接受范围内);

声明:本文由云豹科技转发自少冰半糖柠檬茶博客,如有侵权请联系作者删除


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70002045/viewspace-2795235/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
音视频软件开发相关知识科普账号

注册时间:2021-06-11

  • 博文量
    163
  • 访问量
    60333