写点什么

实现微信小程序编译和运行环境系列 (核心篇一)

  • 2020-04-30
  • 本文字数:2086 字

    阅读完需:约 7 分钟

实现微信小程序编译和运行环境系列(核心篇一)

因为一些小伙伴的私信和交流,感觉写的这些内容对别人还是有一些帮忙,所以打算剩下的几篇更新频率会快一些争取一星期一篇,应该还可以在写 4 篇的内容(包含小游戏和云开发服务),可以带你初步了解搭建微信小程序引擎运行环境从头开始的一些过程


核心篇分了几篇来描述,本文先从整体系统层面来概括小程序运行环境时的架构,明白它的整体大致流程,后面会接着更新细节内容


  • 总体架构图解

  • 架构分步详解

  • 启动流程过程

  • 消息通信流程

  • 消息处理机制

正文

总体架构

先给大家展示一张架构大致图


可以看出大致的一个层次结构

  • 展现层 UI Simulator Layer

  • 控制层 Control Layer

  • 消息处理层 Message Handler Layer

  • 服务层 Service Layer

  • 基础设施层 Infrastructure Layer

  • 本地层 Native Layer

  • 操作系统层 OS Layer

展现层 UI Simulator Layer

  • 小程序的页面显示,菜单标题等展示内容

  • 响应用户的事件操作

控制层 Control Layer

  • UI 控制

  • lanuchHome

  • navigateTo

  • redirectTo

  • navigateBack

  • switchTab

  • showShareMenu

  • 其他

  • 消息相互传输分发

  • service 层 和 service 层 间消息转发

  • service 层 和 webview 层 间消息分发

  • webview 层 和 webview 层 间消息分发

  • 消息处理

  • 处理器选择

  • 处理结果收集

  • 消息缓存

服务层 Service Layer

  • 先处理 Message 消息,在各层之间相互转发在返回结果

  • 网络服务 API

  • 存储服务 API

  • 微信数据服务 API

  • 事件跟踪服务 API

  • 小程序配置信息服务 API

  • 渲染状态服务 API

  • 分享服务 API

  • 文件操作服务 API

  • 其他

基础设施层 Infrastructure Layer

  • Log 文件系统

  • 日志文件存储

  • Level DB

  • 数据存储

基本地层 Native Layer

  • 本地层主要负责设备的具体操作

  • 访问相机

  • 访问 GPS

  • 访问通讯录

  • 访问相册

  • 访问文件系统

  • 拨号

  • 其他

操作系统层 OS Layer

  • 主要是运行载体平台

  • Android

  • IOS


以上就是一个大致的架构层级。

下面我们在通过一个小程序启动运行流程来看下,各层架构设计在运行时的细节

还是先给大家看一个图



从图中我们看到核心的控制层和 socket server 服务的交互 ,他就相当于人的中枢运载这各部件相互和谐的工作,下面还是用文字来简述下整个启动流程。


  • 启动流程说明

  • 加载小程序系统配置文件

  • 创建 APPSERVICE webview

  • 根据配置创建 HOME PAGEFRAME WEBVIEW

  • 通知 Socket Server 路由信息

  • Socket Server 转发路由信息到 APPSERVICE

  • APPSERVICE 通知 HOME PAGEFRAME 渲染

  • HOME PAGEFRAME 通知 APPSERVICE 渲染状态

加载小程序系统配置文件

  • 配置信息

  • APP 信息

  • appid

  • Tabbar 信息

  • tabbar 列表

  • tabar 样式

  • Navigator 信息

  • navigate 样式

  • 场景信息

  • 其他信息

创建 APPSERVICE

  • 小程序加载时,先创建 APPSERVICE webview

  • APPSERVICE webview 创建完成后

  • 自动连接到 socket server

  • 获取网络信息

  • 获取粘贴板数据

  • 其他

创建 HOME PAGEFRAME WEBVIEW

  • 基于小程序配置,解析主页路径

  • 创建主页 Webview,创建完成后

  • 自动动连接到 socket server

  • 发布 xWebVideoSupported 到 appservice

  • vdSync 到 appservice

  • GenerateFuncReady 到 appservice

通知 Socket Server 路由信息

  • Home page webview 创建之前,发送 onAppRoute 信息

  • Home page webview 创建后,发送 onAppRouteDone 信息

Socket server 转发路由信息

  • Socket server 转发控制层信息到 appservice

  • onAppRoute

  • onAppRouteDone

Service 通知 Page 渲染

  • Service 以消息的方式,通知 Page 渲染

  • vdSync * webview 信息同步

  • vdSyncBatch * webview 页面选择

  • invokeWebviewMethod * 通知 webiew 更新

Page 通知 Service 渲染状态

  • __DOMReady 消息


这个算是一个微信小程序启动经历的一些过程,只能说参考分析,比较不是开发人员不能准确说做来那些事


可能大家看了上面的内容还是比较模糊,最核心的消息事件是怎么处理的,有那些事件是怎么进行分发的,下面我还是会先来从设计层面先来分析一下


下面还是先看下一个图(整个的消息通信机制)



这个图如果你们深入研究过这块内容的应该都可以看懂 service webview socket 之间的关联,下面我还是会简述一下。

所有的消息类型

  • APPSERVICE_ON_EVENT

  • APPSERVICE_INVOKE

  • APPSERVICE_INVOKE_CALLBACK

  • APPSERVICE_PUBLISH

  • WEBVIEW_ON_INVOKE

  • WEBVIEW_ON_INVOKE_CALLBACK

  • WEBVIEW_PUBLISH


APPSERVICE_ON_EVENT


  • 发送方

  • 控制层

  • 接收方

  • APPSERVICE

  • WEBVIEW

  • 消息处理

  • 无特殊处理


APPSERVICE_INVOKE


  • 发送方

  • APPSERVICE

  • 接收方

  • APPSERVICE

  • WEBVIEW

  • 消息处理

  • 调用 API

  • 返回 APPSERVICE_INVOKE_CALLBACK 消息

  • APPSERVICE_PUBLISH

  • 发送方

  • APPSERVICE

  • 接收方

  • WEBVIEW

  • 消息处理

  • 无特殊处理

  • WEBVIEW_ON_INVOKE

  • 发送方

  • WEBVIEW

  • 接收方

  • WEBVIEW

  • 消息处理

  • 调用 API

  • 返回 WEBVIEW_ON_INVOKE_CALLBACK 消息

  • WEBVIEW_PUBLISH

  • 发送方

  • WEBVIEW

  • 接收方

  • APPSERVICE

  • 消息处理

  • 无特殊处理


在微信开发者工具里面采用的这种无阻塞消息通讯可以更好的处理这些事件之间的关联性和灵活性,这种方式具备的特点:


  • 发送方可以随时向 socket server 发送消息

  • 发送方可以向任意接收方发送消息,无论接收方是否存在

  • 接收方可用时,发送给接收方的消息可以即时送达

  • 消息不丢失


但在我们手机上面使用的微信小程序,微信肯定不是采用这种方式的,应为这种方式最大的问题就是效率和稳定性,在原生上面应该采用桥接的方式


本来打算放一些案例的,后来发现写下来都没有代码本篇比较存粹的讲解下小程序的架构,希望可以帮大家对小程序运行环境理解带来一点小小帮助


2020-04-30 16:301981

评论

发布
暂无评论
发现更多内容

高校企业双向赋能,首届飞桨启航菁英计划圆满结束

百度大脑

人工智能 百度 飞桨

后端开发实战总结 | 签约计划第二季|后端

阿Q说代码

内容合集 签约计划第二季 技术专题合集

Android技术分享| ViewPager2离屏加载,实现抖音上下视频滑动

anyRTC开发者

android 音视频 移动开发 ViewPager 视频滑动

实战篇:Security+JWT组合拳 | 附源码

阿Q说代码

spring security JWT 签约计划第二季 权限验证

看了这么多年西游记,你可知道孙悟空是如何召唤土地公公的吗?

阿Q说代码

Java 观察者模式 签约计划第二季 事件通知机制

Spark从入门到精通

冇先生

如何在 ShardingSphere 中开发自己的 DistSQL

SphereEx

Java 数据库 ShardingSphere database SphereEx

『上线』OpenSEC SIGs 终于成立了!

SphereEx

开源社区 ShardingSphere SphereEx 中文开源 OpenSEC

【量化】股市技术分析利器之TA-Lib(一)

恒生LIGHT云社区

量化投资 量化

WeTest小程序质量专项方案推出,小程序异常监控内测招募中

WeTest

全程干货,用 python 下载某站全部【免抠图片】,图片背景透明,格式PNG

梦想橡皮擦

12月日更

Flink 是如何统一批流引擎的

编程江湖

大数据 flink

「Spark从精通到重新入门(一)」Spark 中不可不知的动态优化

尔达Erda

云计算 大数据 spark 开发者 感悟

Flink CDC 系列 - 构建 MySQL 和 Postgres 上的 Streaming ETL

Apache Flink

大数据 flink 编程 后端 实时计算

还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】

阿Q说代码

Java MapStruct 签约计划第二季 深拷贝与浅拷贝

博文推荐|使用 Pulsar IO 打造流数据管道

Apache Pulsar

Java 开源 架构 云原生 Apache Pulsar

【活动报名】Apache ShardingSphere Dev Meetup 重启!

SphereEx

开源项目 开源社区 ShardingSphere Meetup SphereEx

看了同事写的代码,我竟然开始默默的模仿了。。。

阿Q说代码

策略模式 多态 签约计划第二季 自定义参数解析器 统一验签

IoT Stack 2.0升级物模型及数据交互协议, 大幅提升物联网方案交付速度

百度大脑

人工智能 百度 物联网

秒过!度目智慧通行让常态化防疫更高效

百度大脑

人工智能 人脸识别

用户登录设计之双token设计

CRMEB

对象存储手把手教七 | 存储空间授权策略 Bucket Policy

QingStor分布式存储

分布式系统 对象存储 分布式存储 分布式,

实战篇:断点续传?文件秒传?手撸大文件上传

阿Q说代码

断点续传 签约计划第二季 文件秒传 文件分块 文件合并

语法糖甜不甜?巧用枚举实现“状态”转换限制

阿Q说代码

枚举 签约计划第二季 语法糖 订单状态转换

恒源云(GPUSHARE)_GPU白嫖大法来袭!

恒源云

深度学习 gpu 算力加速

看FusionInsight Spark如何支持JDBCServer的多实例特性

华为云开发者联盟

大数据 SQL语句 FusionInsight Spark JDBCServer 多实例

Linux学习方法《Linux一学就会》Linux系统进程管理

侠盗安全

Linux linux运维 运维工程师 云计算架构师

长连接网关技术专题(六):石墨文档单机50万WebSocket长连接架构实践

JackJiang

websocket 即时通讯 IM 网关

大数据中不同文件格式的比较

吴脑的键客

大数据 云存储

如果还不懂如何使用 Consumer 接口,来公司我当面给你讲!

阿Q说代码

函数式接口 签约计划第二季 consumer 实战讲解 supplier

PackML从会到不会——标签(3)

陈的错题集

标准化 PackML

实现微信小程序编译和运行环境系列(核心篇一)_语言 & 开发_风逝_InfoQ精选文章