
Web页面加载流程Trace关键点:
Web网页加载流程拆解 | Trace关键字 |
|---|---|
应用收到点击事件 | DispatchTouchEvent |
Web组件初始化 | NWebImpl|CreateNWeb |
导航 | H:LocalFrame::Navigate| url=https://xxx |
创建URLLoader加载图片资源 | H:URLLoader::URLLoader | url=https://xxx |
启动请求 | H:HttpCacheTransaction::Start | url=https://xxx |
创建HttpStream | H:HttpNetworkTransaction::DoCreateStream |url=https://xxx |
发送请求 | H:HttpNetworkTransaction::DoSendRequestComplete | url=https://xxx |
接收到响应头 | H:HttpNetworkTransaction::DoReadHeadersComplete | url=https://xxx |
开始接收响应体 | H:NavigationBodyLoader::StartLoadingBody |url=https://xxx |
数据接收完成 | H:URLLoader::NotifyCompleted | responseCode | url=https://xxx |
绘制 | H:SingleThreadProxy::ScheduledActionSendBeginMainFrame |
渲染 | NotifyReadyToCommitOnImpl |
完成时延结束 | SkiaOutputSurfaceImplOnGpu::SwapBuffers |
不同于HarmonyOS ArkUI页面,Web页面的所有信息均是通过URL链接获取,在本地解析成DOM结构后渲染为适配当前设备屏幕比例、可操控的页面。全流程分为三大部分:浏览器控制流程,资源下载流程,渲染送显流程。


URLRequest请求一个已匹配缓存项的数据传输流进程HttpStream,并生成一个包含主机名、端口号等信息的socket。
根据DNS域名服务器返回的重定向路径,发送socket,完成与接收方的TCP连接。
URLRequest通过传输接口格式化请求头和请求体后,发送到接收方。接收方会等待并接收响应头,向上传递给接收方的URLRequest并保存cookies。
发送方URLRequest会创建一个数据管道,并将一端传递给接收方。发送方每次会先从管道获取一个新的共享内存,再通过URLRequest写入数据,直到数据全部发送完毕。
服务器端会接收到共享内存的读取请求并依次读取,直到读取完毕全部数据。
在浏览器中输入该网页地址,然后打开网络(Ctrl+U),可以看到图片/视频资源地址为"https://xxx"。

首先将Trace关键字表中的对应关键字放入搜索框,例如“发送请求”:H:HttpNetworkTransaction::DoSendRequestComplete| url=https://xxx (改为对应的图片URL)。
然后在搜索结果中筛选目标,找出任意一次成功复现的节点。
最后放大该时间轴比例,直至可以清晰显示该线程的运行时长及其具体运行时间点。

重复以上步骤,依次搜索“应用收到点击事件”、“发起请求”、“开始接收资源下载数据”、“资源下载完成”、“绘制”、“渲染完成”的Trace关键字,获知以下加载流程全景图:


选中A点时间坐标,拖向B点的时间坐标,即可标记该时间段,并显示其时长。依次标记所需时间段,可知:总时长2s,应用收到点击事件到开始接收响应体耗时137ms,下载全程耗时1.5s,渲染流程单独耗时337ms。由此可知,总时长过长的主要原因是过长的下载耗时。

复制URL到浏览器,可打开下载该图片资源,发现该图片大小为3.2M,明显超出该场景表现所需的图片资源大小,在未经充分加载优化的情况下会导致加载耗时过长。
