案例：使用Frame模板分析应用卡顿问题
====================

本案例介绍如何判断应用存在卡顿帧，再通过调用栈和trace信息分析应用运行逻辑，找出应用卡顿的原因。

应用卡顿分析基础功能请参考[Frame分析](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-insight-session-frame)。

#### 分析步骤

分析应用卡顿类问题步骤如下：

1.  确认是否存在卡顿帧。
2.  若存在卡顿帧，根据调用栈和trace等信息进一步确定问题点。

#### 分析Frame数据

#### \[h2\]分析应用是否存在卡顿

1.  框选Frame泳道，窗口下方的**Statistics**区域中会以进程维度对选定时间段内的Frame信息进行统计，当Jank Count大于0时，说明存在卡顿帧。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/5c/v3/iT8Weq_5RvSH8Gv9T5HvkA/zh-cn_image_0000002624994319.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=75D5785D85A9C2FF44E7977EFCB6E3D4D1DB6F7B12DB58CBD5F266EF2C52F4C4 "点击放大")
    
2.  找到**Statistics**区域中存在卡顿帧的进程，点击进程名称后方跳转按钮，跳转到**Frame List**区域。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/55/v3/p-zoaYazSduODJRMFIEQ0g/zh-cn_image_0000002624994309.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=16728D9D3726686095CDED4F4CD40245F6EF03D30B0230878B161BD9BF27C99A "点击放大")
    
3.  Frame List区域会展现该进程对应的Frame列表。在Frame List区域中对卡顿丢帧类型（Jank Type）进行升序排序，单击Frame List页签中任意一卡顿帧，直接跳转到该帧且泳道上该帧被反选。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/e1/v3/YfTo-h2NRsWTc2P05SR5cw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=A13BDD17A355571F69CF9B4D97B6470563A063CC611DF42F189A680FA3C440FB)
    
    *   在带**RS Frame**和**App Frame**标签的子泳道中，正常完成渲染的帧显示为绿色，出现卡顿的帧显示为红色。
    *   AppDeadlineMissed：App侧的卡顿。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ee/v3/vy1pfZU0TLGYZzMx_pfo9g/zh-cn_image_0000002594474952.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=9ED7679DD4E94266836945CC151E094EAE0C0B60275A598CDDB53CE4C0CE1878 "点击放大")
    
4.  点选该卡顿帧，窗口下方的**Details**区域中显示卡顿帧的关键信息。右侧应用进程前方跳转按钮可以跳转到应用进程Trace。
    
    *   Expected Duration：一帧绘制的期望耗时。与fps的大小有关，如fps为120，对应的Vsync周期为8.3ms，即App侧/Render Service侧的帧耗时，一般需要在8.3ms以内。
    *   Actual Duration：一帧绘制的实际耗时。
    
    如下图，可以看到该帧的期望耗时为8ms 330μs，实际耗时为44ms54μs，远远超过了期望耗时，因此被识别为卡顿帧。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ad/v3/CRKb7F9jSZKp4D_TN4dGJw/zh-cn_image_0000002594474950.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=F03C615FD5CD06D8A7E2A582EA4BAD6E59D9090807B72C8497C5D4A4EFA4DE59 "点击放大")
    
5.  框选该异常帧时间范围，结合**ArkTS Callstack**泳道、**Callstack**泳道和**Trace**等信息进一步分析异常点。

#### \[h2\]案例：分析应用卡顿原因

1.  找到并框选要分析的异常帧，查看**ArkTS Callstack**泳道分析ArkTS侧耗时函数。优先查看主线程调用栈，即线程号与进程号一致的ArkVM子泳道。可以看到ArkTS侧一些方法的耗时。
2.  查看下图调用栈，除(program)外，其他调用栈耗时小于一帧绘制的期望耗时8.3ms（被调优的设备fps为120），因此该卡顿帧主要分析调用栈(program)的耗时。
    
    (program)代表程序执行进入纯Native代码阶段，该阶段无ArkTS代码执行，也无ArkTS调用Native或者Native调用ArkTS情况，一般很难通过这里分析出有效的信息，需要切换到Callstack泳道看具体的调用栈信息。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8f/v3/8r12eD1PTOu9UXPKHQpbIg/zh-cn_image_0000002625074457.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=6AB972D0714E7203E556ECA7C6DC911E490AC5E3F930ABF06006127462128C96 "点击放大")
    
3.  切换到**Callstack**泳道，查看Callstack泳道的主线程（线程号与进程号一致）子泳道，滑动观察下方Heaviest Stack区域“%”列中占比最大的函数调用栈，Category中亮色代表开发者调用栈，灰色代表系统调用栈，可以看出下图中耗时主要在系统侧的so，无法识别具体异常原因，接下来进一步分析应用进程Trace。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ed/v3/0SjwEFLRSXi1EvBgzVqYHw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=06ABFD075924961D85DC45D07B09F0D74F9209E326DC313011503277F639D589)
    
    也可通过底部的“Call Trees”选择框来隐藏系统调用栈，减少干扰信息。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/f1/v3/slrpxCNsR52-xnc_Xd6iVQ/zh-cn_image_0000002625074455.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=9F6322A2B0E64D2EF65A36C3F8068CDD9A1CBAB6025E23980B81D15F16E6BDAC "点击放大")
    
4.  切换到应用进程Process泳道，查看主线程（线程号与进程号一致）。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7b/v3/1d2PCaeUSOKDzWAIkGEMyw/zh-cn_image_0000002625074461.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=6223CE071718C4023CFEBA4C789C73AE17F5BAB12D11D9302C23B7CB97B9F086 "点击放大")
    
5.  窗口下方详情区可查看到Trace统计信息列表，逐层展开耗时最长的Trace，定位到主要耗时是在3次H:CreateImagePixelMap。接下来进一步分析这3次H:CreateImagePixelMap耗时的原因。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/26/v3/9VtZ72h3TUmpShK9G-Sn2g/zh-cn_image_0000002594634876.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=D4127508A952E56722AA9652BD9AF3517934E52C413864DCC375B651159FF2CA "点击放大")
    
6.  H:CreateImagePixelMap和图片加载相关，再结合业务代码查看，可以看到是因为同步加载网络图片，建议修改为异步加载。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c7/v3/wiwGq5YsTve46T2jiABtqg/zh-cn_image_0000002625074459.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=4504425ADF734A96B7E87AC65BEDD2A9D5214A64A9A45C2A6E6116198A594C03 "点击放大")
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/4e/v3/y2SnZAQqSDqQiJTIq5I7WQ/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073912Z&HW-CC-Expire=86400&HW-CC-Sign=1DF66C538B80F1522E04D69CB64CFD960C071C20C933651C97A4140D343A7DEC)
    
    一般情况下，图片加载流程会异步进行，以避免阻塞主线程，影响UI交互。不建议图片加载较长时间时使用同步加载。