关键字 | 泳道 | 说明 |
|---|---|---|
DispatchTouchEvent xxx type=1 | 应用主线程 | 应用收到手指离开屏幕的事件 |
H:ProxyMain::BeginMainFrame | 应用包名:render | 开始一帧的渲染 |
H:EvaluateScript | 应用包名:render | js编译与执行 |
H:ResourceFetcher::requestResource | 应用包名:render | 子资源请求发起 |
SkiaOutputSurfaceImplOnGpu::SwapBuffers | CompositorGpuTh | Web页面渲染输出 |
H:Task Perform | OS_TaskWorker | 执行taskpool.execute调用时设置的任务 |
H:Napi execute | - | 调用Napi接口函数 |
H:Napi complete | - | Napi接口函数执行完成,执行回调函数 |
以点击某Web应用页面分享按钮生成页面截图响应慢为例,具体定位过程如下:

点击render线程最左侧Running状态,通过WakeUp From Tid不断找唤醒线程,发现最终唤醒线程为应用主线程,可知render线程进行js编译与执行是由主线程触发的。


点击上图中跳转箭头找到OS_TaskWorker线程,该线程有执行PackToFile完成后的回调函数,PackToFile表示将图片数据编码进文件。

通过上图中H:Napi complete, name:PackToFile处左侧runnable状态找到执行PackToFile的线程,可看到PackToFile耗时1.28s左右,图片分辨率为3375x7825。

根据runnable状态查找执行PackToFile的线程的唤醒线程,发现唤醒线程为OS_TaskWorker线程,同时线程有执行screenshot截图,耗时为673ms左右。

通过Running状态发现OS_TaskWorker线程的唤醒线程为应用主线程,可知应用收到点击事件之后,会通过taskpool执行生成截图的任务,首先截图,然后将截图数据编码到文件,保存到沙箱目录,最后通知到Web侧执行js代码,请求沙箱中的图片资源并将图片显示在Web页面中,该过程耗时主要集中在截图和数据编码到文件部分。
而图片编码处H:DoEncode部分,通过调用栈发现耗时主要集中在将图片编码进png格式文件。

截图、图片编码进png格式文件耗时较多是因为绘制、编码的图片分辨率较大,达到了3375x7825。
import { taskpool } from '@kit.ArkTS';
import { BusinessError } from '@ohos.base';
@Concurrent
async function generalScreenShot(): Promise<PixelMap | undefined> {
let pixelMap : PixelMap | undefined = undefined;
// 耗时操作模拟生成截图
for (let i = 0; i < 100000; i++) {
console.info(`number:${i}`);
}
return pixelMap;
}
@Entry
@Component
struct DemoPage {
@State isLoading: boolean = false;
build() {
RelativeContainer() {
Button('分享')
.id("shareButton")
.onClick(() => {
this.isLoading = true;
taskpool.execute(generalScreenShot).then(() => {
this.isLoading = false;
// 显示分享界面
}).catch((error: BusinessError) => {
console.error(`Failed to execute task: errCode is ${error.code}, errMessage is ${error.message}`);
});
})
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
LoadingProgress()
.color(Color.Blue)
.width(50)
.height(50)
.visibility(this.isLoading ? Visibility.Visible : Visibility.None)
.alignRules({
top: { anchor: 'shareButton', align: VerticalAlign.Bottom },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
}