Openharmony性能分析之打电话卡顿8s
一、关键字: 打电话慢;接听电话慢;卡顿 二、问题描述 设备型号:黄鹂 系统版本:OpenHarmony 5.0 代码版本:OpenHarmony-5.0 问题现象:使用商用手机,给黄鹂测试机打电话,卡顿8s,测试机弹callui界面。 三、原因分析 3.1
一、关键字:
打电话慢;接听电话慢;卡顿
二、问题描述
设备型号:黄鹂
系统版本:OpenHarmony 5.0
代码版本:OpenHarmony-5.0
问题现象:使用商用手机,给黄鹂测试机打电话,卡顿8s,测试机弹callui界面。
三、原因分析
3.1 正常机制
测试机收到modem呼叫,2S内弹出callui界面。
3.2 异常机制
测试机收到modem呼叫,卡顿7s才弹出callui界面。
3.2.1分析trace,callui卡顿7s,主要阻塞两个阶段:InComingCall耗时5s+启动页面阻塞1.2s。
放大trace发现启动callui页面卡顿1.2s,为foundation进程的AppMgrServiceInner::NotifyMemMgrPriorityChanged方法阻塞1.2s导致。
3.2.2 分析InComingCall耗时5s原因:
分析代码查看InComingCall 形成业务段打点
InComingCall 开始点modem来电回调。
InComingCall trace结束点为call_manager内部电话号处理结束后。
通过一层层加trace,查找最终阻塞函数:
最终阻塞点在spamCallAdapterPtr_->WaitForDetectResult()等待了5s
WaitForDetectResult等待骚扰拦截hap服务反馈结果
超时5s 骚扰拦截hap服务没有反馈结果,初步怀疑拦截hap没有拉起
constexpr int16_t WAIT_TIME_FIVE_SECOND = 5; SpamCallAdapter::SpamCallAdapter() { timeWaitHelper_ = std::make_unique<TimeWaitHelper>(WAIT_TIME_FIVE_SECOND); }
在执行WaitForDetectResult请求骚扰拦截com.spamshield服务之前,在DetectSpamCall中有请求连接拉起服务。
- 分析日志,确认为骚扰拦截hap没有拉起,连接失败原因:骚扰拦截hap没有预置,需要厂商自己定制。
社区骚扰拦截需求:https://gitee.com/openharmony/telephony_call_manager/pulls/134811-05 17:14:31.200 808 2878 I C01f10/CallManager: [DetectSpamCall-(spam_call_adapter.cpp:53)] DetectSpamCall start 11-05 17:14:31.205 808 2878 E C01f10/CallManager: [DetectSpamCall-(spam_call_adapter.cpp:61)] DetectSpamCall failed! 11-05 17:14:31.469 808 2880 E C01f10/CallManager: [operator()-(call_status_manager.cpp:454)] lly QueryCallerInfo end! 11-05 17:14:36.206 808 2879 E C01f10/CallManager: [WaitForResult-(time_wait_helper.cpp:48)] TimeWaitHelper: 5 time out 11-05 17:14:36.208 808 2879 I C01f10/CallManager: [~TimeWaitHelper-(time_wait_helper.cpp:30)] ~TimeWaitHelper: 5
3.2.3 分析启动页面过程中阻塞1.2s原因:
通过加trace发现主要阻塞点在内存管理服务同步进程NotifyProcessStateChangedAsync回调耗时1.2s
分析log发现,GetMemMgrService 服务失败导致阻塞1.2s
11-05 17:13:44.119 438 438 I C01799/MemMgr: MemMgrClient::NotifyProcessStatus called 11-05 17:13:44.119 438 438 I C01799/MemMgr: MemMgrClient::GetMemMgrService called 11-05 17:13:45.334 438 438 E C01799/MemMgr: MemMgrClient::GetMemMgrService get service failed 11-05 17:13:45.334 438 438 E C01799/MemMgr: MemMgrClient::NotifyProcessStatus MemMgrService is null
四、方案优化
黄鹂不支持memmgr_hyperhold_memor特性,通过编译屏蔽,正常拉起MemMgrService,可以优化1.2s
合入链接:https://gitee.com/openharmony-sig/vendor_hardmony/pulls/157在向骚扰拦截服务请求消息时,先判断服务是否链接成功,没有成功不请求,可以优化5s。
合入链接:https://gitee.com/openharmony/telephony_call_manager/pulls/1885
通过优化上面两个问题后,测试机在收到modem信号后,可以在1s以内拉起callui通话页面。
更多推荐
所有评论(0)