一、关键字:

打电话慢;接听电话慢;卡顿

二、问题描述

设备型号:黄鹂

系统版本:OpenHarmony 5.0

代码版本:OpenHarmony-5.0

问题现象:使用商用手机,给黄鹂测试机打电话,卡顿8s,测试机弹callui界面。

三、原因分析

3.1 正常机制

测试机收到modem呼叫,2S内弹出callui界面。

img

3.2 异常机制

测试机收到modem呼叫,卡顿7s才弹出callui界面。

img

3.2.1分析trace,callui卡顿7s,主要阻塞两个阶段:InComingCall耗时5s+启动页面阻塞1.2s。

img

放大trace发现启动callui页面卡顿1.2s,为foundation进程的AppMgrServiceInner::NotifyMemMgrPriorityChanged方法阻塞1.2s导致。

img

3.2.2 分析InComingCall耗时5s原因:

  1. 分析代码查看InComingCall 形成业务段打点
    InComingCall 开始点modem来电回调。

    img


    InComingCall trace结束点为call_manager内部电话号处理结束后。

    img

  2. 通过一层层加trace,查找最终阻塞函数:

    img


    最终阻塞点在spamCallAdapterPtr_->WaitForDetectResult()等待了5s

    img


    WaitForDetectResult等待骚扰拦截hap服务反馈结果

    img


    超时5s 骚扰拦截hap服务没有反馈结果,初步怀疑拦截hap没有拉起

    img

    constexpr int16_t WAIT_TIME_FIVE_SECOND = 5;
    SpamCallAdapter::SpamCallAdapter()
    {
     timeWaitHelper_ = std::make_unique<TimeWaitHelper>(WAIT_TIME_FIVE_SECOND);
    }
    

    在执行WaitForDetectResult请求骚扰拦截com.spamshield服务之前,在DetectSpamCall中有请求连接拉起服务。

    img

  1. 分析日志,确认为骚扰拦截hap没有拉起,连接失败原因:骚扰拦截hap没有预置,需要厂商自己定制。
    11-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
    
    社区骚扰拦截需求:https://gitee.com/openharmony/telephony_call_manager/pulls/1348

3.2.3 分析启动页面过程中阻塞1.2s原因:

  1. 通过加trace发现主要阻塞点在内存管理服务同步进程NotifyProcessStateChangedAsync回调耗时1.2s

    img

  2. 分析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
    

四、方案优化

  1. 黄鹂不支持memmgr_hyperhold_memor特性,通过编译屏蔽,正常拉起MemMgrService,可以优化1.2s
    合入链接:https://gitee.com/openharmony-sig/vendor_hardmony/pulls/157

    img

  2. 在向骚扰拦截服务请求消息时,先判断服务是否链接成功,没有成功不请求,可以优化5s。
    合入链接:https://gitee.com/openharmony/telephony_call_manager/pulls/1885

    img

通过优化上面两个问题后,测试机在收到modem信号后,可以在1s以内拉起callui通话页面。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐