本文是对上次公众号发文《微信小程序逆向源码深度揭秘》 的扩展,着重探究小程序包的主要内容构成。
任何事物都是有生命周期的,小程序包也不例外,为了方便理解,我们暂且叫它【小程序包的生命周期】。其实本没有这个概念,只是为了本文的理解才引入了这么一个概念。
这里大致归纳为以下几个阶段。
这里需要注意的是:同一小程序分开发版、体验版、正式版,几个包都是独立,互相隔离的,并且缓存(优先加载)在本地。普通用户看到的只是正式版。
# 用户初次打开小程序时发生了什么?
在小程序启动时,微信会为小程序展示一个固定的启动界面,界面内包含小程序的图标、名称和加载提示图标。
微信会做以下工作:
关于文件结构这里不再赘述(不是本文关注重点)
这里简要提一下微信小程序包的文件格式,注意是『微信』哦。
格式:文件头+文件名+文件内容起始地址及长度
注意:
0xbe
开头,所以如果你拿了抖音的小程序包来解是没用的接着我们回过来来看看解包后文件的主要构成,这里还是拿开源中国的小程序开刀吧。
为了辅助理解,我们先修改源码中的 wuWxapkg.js
文件,L34(34行)后面追加下面的代码
console.log(`No.${i+1}:`, info.name);
然后执行以下命令得到日志
node wuWxapkg.js -o osc.wxapkg
执行命令后可以在命令行看到包内文件名列表
通过观察文件名列表我们可以看出:
包内主要包含
①静态资源->static/**、图片、svg......
②app-config.json
③app-service.js
④page-frame.html
⑤页面html文件->pages/**.html、其它组件或者页面的html
关键文件作用整理如下:
文件名 | 作用 |
---|---|
app-config.json | 小程序完整的配置,包含我们通过app.json里的所有配置,综合了默认配置 |
app-service.js | 各页面的JS代码 |
page-frame.html | 小程序视图(渲染页面)的模板文件,所有的页面都使用此加载渲染,且所有的WXML都拆解为JS实现打包到这里 |
**.html | 其它页面的html |
主包一般都是2M左右大小,也有特别的会达到4M+
未列进来的文件:
文件名 | 作用 |
---|---|
WAService.js | 逻辑层基础库文件,提供逻辑层基础能力 |
WAWebview.js | 视图层基础库文件,提供视图层基础能力 |
WAConsole.js | 控制台基础库 |
解出来之后如果得到包含这几个文件的内容,就说明解的不是主包。
我们顺带看看微信开发者工具源码中的 pageframe.html
在mac系统下可以通过『微信开发者工具』上右键菜单点击显示包内容来找到这个模板文件,文件路径:
/Applications/wechatwebdevtools.app/Contents/Resources/package.nw/html
部分内容一览:
部分即是模板字符串,会在执行过程中被动态替换
注:以上内容仅是博主学习了相关资料结合个人理解整理所得,不免会有疏漏的地方,如有更好的发现,欢迎交流。