大厂Data+Agent 秘籍:腾讯/阿里/字节解析如何提升数据分析智能。 了解详情
写点什么

实现微信小程序编译和运行环境系列 (进阶篇)

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

    阅读完需:约 9 分钟

实现微信小程序编译和运行环境系列(进阶篇)

前言

距离上一篇初始篇过了一段时间,在初始篇里面主要分享了微信小程序工具 和微信小程序的文件组成,以及小程序架构的基本大纲和描述,看了第一篇的小伙伴应该大概知道了微信小程序运行时候各部分文件职能了,如果不太了解的话可以再去看下githubcsdn

进阶篇内容主要从以下几个方面来分享下微信小程序的架构

  • 核心文件 WAService.js WAWebview.js appservice.js 的解析;

  • 和其他文件在逻辑层和渲染层的⚠️注意事项

  • websocket 通信在微信小程序框架中的应用实现;

  • 通过几个案例和部分代码来实现自己的小程序运行环境;

  • 微信小程序云开发和小游戏架构初步分析(后续会持续更新)。

正文

WAService.js 文件

在第一篇里面有讲到 WAService.js 文件是在逻辑层模版页面里面引入的,但是没有给予过多的介绍,


接下来主要分析下 WAService.js 的代码组成,这个文件算是微信小程序基础库文件里面很核心的文件了,所以微信对它的保护应该很到位了,微信通过了压缩,编译,打包后生成的一坨这个 js 文件(如下图):



直接看完全没什么头绪,看着头很重!!


下面只有让我们来一步一步分解它,让它原形毕露


  • 第一步让它变得看起来稍微美一点,毕竟大家都喜欢美一点的人事物,既然有需求那肯定有解决方案,所以给大家推荐一个工具包 js-beautify,可以先让代码看起来比原来漂亮很多。


直接执行命令(不要对他抱太大期望,美化后的不可能让你一步到位,还是要慢慢咔哧咔哧)。


js-beautify ./WAService.js -r
复制代码


美化后的代码:



  • 看着花花绿绿的还是要舒心很多,但是毕竟人家是一个 6 万多行编译后的大物,想看明白不是一件易事,但我们还是要和它死磕来慢慢消耗它,接下里给大家介绍下个我比较笨的一种方案就是一点点有策略性的手动给他反编译过来(中间的过程只有经历后才能明白其中的痛啊),不过看到结果还是蛮欣慰的。


先给大家看下最终大部分解出来的编译文件如下图:





上面的图是通过分析代码还原的一些人看的代码,然后分类的。


在网上我有看到有人说通过一些工具对 WAService.js 进行格式化后进行 debug 来分析,这种方式也是 ok 的但是有一些门槛问题,对于一些同学来说不太方便也不太能处理,因为你没有调试这些文件的运行环境,在微信开发者工具里面你是看不到 WAService.js 文件的更不要说去调试了,如果非要在开发者工具调试的话方法也是有的,要通过修改微信开发者工具客户端的代码才可以但是一般都不知道怎么去修改基础库代码。


下面介绍一个好理解但是有点痛苦的方式,比较清晰的一个操作是在上面我们让它变得美一点了,现在让它变得有条理一些,推荐使用 vscode 格式化后进行方法折叠。



这样一看其实很清晰了我们可以看到这些我们常听说的一些微信对象,WeixinJSBridge、 NativeBuffer、 wxConsole、 WeixinWorker、Reporter、VirtualDom 等对象都打包一起了,


然后看到对象里面有很多个 function(e,t,n)文件对应的就是每个暴露的方法,下面要做的就是把这些方法的代码手动编译过来,可以给大家一个案例演示下。


下图这个是 VirtualDom 对象文件里面的一个方法:


下图的是上面的代码改成我们正常人读的代码


这个过程对你的 js 水平要有一定要求的,如果你基础不扎实和了解怎么应用的话,还原起来可能会很吃力的,如果你可以完整的编译这些文件的话,你的 js 水平完全可以超越大部分人。


可以先给大家简单分析一点非技术层面的一些疑问,具体的技术层面编译过程,可以熟悉 js 整个编译历史,和 es6 转 es5 的方式推荐大家熟悉下 babel 源码,可以有很多收获 由于本人也还比较小白(高手可以忽略这点),大家可以看到:


var i=n(22)我改成了 const DomIndex=require(’./domIndex’)


这个语句语意可能很多人都可以理解,但我为什么把 22 这个文件写成 DomIndex,其实这里面的变量和命名和对应的文件都不是自己想当然的,这个可以在文件中进行分析得到的,具体怎么分析的这里不过多介绍了,内容就太多了有兴趣可以留言讨论。


使用对 WAService.js 文件分析可以看出大致有 : WeixinJSBridge、 NativeBuffer、 wxConsole、 WeixinWorker、 Reporter、 wx、 exparser、 virtualDOMappServiceEngine 等对象组成的。

WAWebview.js 文件

这个大致和 WAService.js 文件分析方式一样,大家感兴趣的可以自行尝试下,留给大家自己研究,理解的肯定比我写出来的要深刻很多。

appservice.js 文件

这个文件分析的结果可以让我们看到一些浮出水面的东西来,但这个过程比较曲折开始。


在微信小程序工具的渲染层和逻辑层里面和微信基础库都没有发现这个文件,说明可能是运行时注入进去的(猜测的)。



后来在 sources 里面有发现这个文件:



但是文件是空的,页面资源和 network 里面都没有找到对应的文件,一时比较绝望,后来就一直瞎折腾半天后,终于在工具包里面 appservice 找到来这个类似文件,让生活注入了一点希望。



但是一打开还是这一坨不是人看的代码,但奈何不看不行啊(阿弥陀佛)



通过分析研究发现,还是发现了一些蛛丝马迹,看到了这个文件里面存在 webstocket 和 http 通信方式,有通信说明就会和外界有关联,于是大胆尝试了在一些通信相关代码的地方,修改了一点代码和添加了日志



标记三就是稍微在原来微信 appservice.js 的基础上进行了一点修改,然后保存,期待这微信开发者工具上面会有一些不一样的烟火🎆,但奈何关了又开,开了又关半天屁的变化都没有,于是就产生了自我怀疑,难道不应该这样吗,但是还是感觉方向是对的,于是打算在试试终极解决方法《重启电脑》,果然当我在打开开发者工具的时候看到了不一样的烟火🎆,


在 console 里面出现了耀眼的光芒,这里应该算一个突破性进展吧!!!



看到 api 和返回的结果,发现这些其实就是微信提供对外的同步 api,可以看到 getSystemInfo 走的其实是同步的方式,那微信还提供了 getSystemInfoSync 说明也是同步的,他们的底层实现都是同步的不知道这个 api 还提供这两个接口有什么意义 没理解, 然后又试了下其他微信提供的同步方法发现都会出现在这里,其他很多异步 api 的不会走这里都是通过 webstocket 走的,这里可以得出结论这些同步 api 请求都是通过/apihelper/assdk 传输的,大家可以自己测试下拦截这个请求会发现更多内容。


至于这个文件和基础库的关联和最核心的 webstocket 的实现和在文章开头说的案例分析和云开发小游戏架构分析相关,我打算放在下几篇《核心篇》里面来一一分享,本来打算放在一起的,但写起来才发现虽然文字不多但考虑东西太多时间要很久,如果放在一起只是大概概括的话会很快少很多省时省力,但是感觉没太大意义可能对一些想了解的同学没有太大帮助,所以我就想通过我中途的过程和遇到的问题来分析可能会好理解一些


2020-04-30 16:302520

评论

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

把家电科技产出摆出来!三家实力一目了然

脑极体

python方法——defaultdict详解

Wjq

Python 字典 3月程序媛福利 3月月更 defaultdict

专注自主研发,加速大数据基础软件国产化进程

星环科技

数据库 大数据 基础软件

数字孪生:如何撑起一个万亿市场的产业变革?

知心宝贝

行业资讯 数字孪生 冬奥 3月月更

网络安全kali web安全 Kali之msf简单的漏洞利用

学神来啦

网络安全 渗透测试 WEB安全 kali kali Linux

金融数据查询增速三倍,服务器成本减半,海尔云链的 OLAP 引擎选型之路

StarRocks

数据库 数据分析 OLAP StarRocks

一日为期,极行千里 ——「企业级零代码黑客马拉松」正式启动报名

明道云

低代码 零代码 企业 黑客马拉松

【愚公系列】2022年03月 Docker容器 Windows11安装Docker Desktop

愚公搬代码

3月月更

英特尔Sierra Forest,市场最需要的能效核至强处理器

科技新消息

重学设计模式——你真的面向对象了吗?

黄林晴

设计模式

技术平台&应用开发专题月 | 如何打造强大的K8S集群

用友BIP

用友 用友iuap

2022官方文档部署MAVEN最新最全

北极的大企鹅

中间件 环境安装 部署与维护

基于冬奥示范效应,数字孪生将助力建筑运维和集会安全运营

易观分析

数字孪生

基于 Apache ShardingSphere 构建高可用分布式数据库

SphereEx

Apache 开源 分布式 ShardingSphere SphereEx

「国产替代」,真的是中国SaaS的发展路径吗?

ToB行业头条

直播预告 | PolarDB-X 动手实践系列——如何在 PolarDB-X 中优化慢 SQL

阿里云数据库开源

数据库 大数据 阿里云 开源 polarDB

2021年第4季度规模达1381.8亿元!跨境电商结合酒店场景将成亮点

易观分析

跨境电商

电商秒杀系统

tony

「架构实战营」

适用于企业的销售自动化CRM系统

低代码小观

销售管理 CRM CRM系统 客户关系管理系统 企业管理软件

在华外企高管谈政府工作报告:共享发展成就 未来机遇可期

科技新消息

GDP Streaming RPC 设计

百度Geek说

后端 RPC Go 语言

【案例】替代进口数仓,星环科技助力北京银行建设新一代大数据平台

星环科技

数据库

Flink 流处理在中信建投证券的实践与应用

Apache Flink

大数据 flink 开源 编程 实时计算

两天两夜,1M图片优化到100kb!

沉默王二

Java

对容器在野安全问题的观测和分析

腾讯安全云鼎实验室

网络安全 容器安全 在野攻击

「前端CI/CD系列」第三篇:如何用建木CI构建前端项目并部署到CDN

Jianmu

开源 前端 CDN 七牛云 建木CI

堪比JMeter的.Net压测工具 - Crank 入门篇

MASA技术团队

C# .net 微软 测试 压测

华为被卡脖子,到底卡的是什么?

坚果

WebGPU小白入门(一): 零基础创建第一个WebGPU项目

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

DPDK uio 分析 丨DPDK的优势及学习总结

Linux服务器开发

Linux服务器开发 DPDK Linux后台开发 高性能网络 网络虚拟化

医疗数字化,星环科技ArgoDB+KunDB统一分布式数据库解决方案来了

星环科技

数据库 医疗安全

实现微信小程序编译和运行环境系列(进阶篇)_大前端_风逝_InfoQ精选文章