1 关键字

Acts兼容性测评;StartTaskManager

2 问题描述

OpenHarmony版本:3.2 Release

问题描述:使用 Acts-Validator 套件进行桌面启动任务管理器测试无结果

测试步骤:

  1. OpenHarmony 兼容性测试网站下载对应的 Acts-Validator 测试套件;

  2. 开发板安装 ActsValidatorTest.hap 应用;

  3. 推送下载的测试资源到开发板;

  4. 点击桌面 ActsValidatorTest 应用图标打开应用,Window系统电脑端点击.bat文件启动测试;

  5. 按照 ActsValidatorTest 应用内提示进行桌面启动任务管理器测试

3 问题原因

3.1 正常机制

桌面启动任务管理器测试项测试成功,并能生成对应的结果

3.2 异常机制

桌面启动任务管理器测试项测试不能生成测试结果,且生成的 CompleteTimeLauncher.log 如下

libc++abi:terminating with uncaught exception of type std::out_of_range:basic_string

经过分析,产生该问题的原因是由于该款芯片不支持屏幕内虚拟返回按键,在点击桌面物理返回键时,trace 无法采集到 touch 点击事件,因此,在计算完成时延指标时报错。

4 解决方案

该测试项申请豁免处理

  • 备注:兼容性测试官网的最新版本的 SP_daemon 插件已经支持屏幕内无虚拟返回按键的该项测试功能,详见知识分享。

5 定位过程

查看 developtools_profiler 仓 SP_daemon 插件源码

EditorCommand 方法调用SmartPerf::EditorCommand::CompleteTime 方法

float EditorCommand::CompleteTime()
{
    OHOS::SmartPerf::StartUpDelay sd;
    OHOS::SmartPerf::ParseClickCompleteTrace pcct;
    std::string cmdResult;
    SPUtils::LoadCmd("rm -rfv /data/local/tmp/*.ftrace", cmdResult);
    std::string traceName = std::string("/data/local/tmp/") + std::string("sp_trace_") + "complete" + ".ftrace";
    std::thread thGetTrace = sd.ThreadGetTrace("complete", traceName);
    thGetTrace.join();
    float time = pcct.ParseCompleteTrace(traceName);
    return time;
}
​

代码路径:developtools/profiler/host/smartperf/client/client_command/editor_command.cpp

CompleteTime 方法中调用 GetLineTime 方法解析 trace 文件中的 "H:touchEventDispatch" 或者 "H:TouchEventDispatch"节点计算出 startTime , 解析 trace 文件中的 "H:RSMainThread::DoComposition" 获取 endTime。

解析 startTime

std::string  ParseClickCompleteTrace::GetStartTime(std::string line, const std::string &startTimeBefore)
{
    ......
    std::string::size_type touchEventDisPos = line.find("H:touchEventDispatch");
    std::string::size_type mTouchEventDisPos = line.find("H:TouchEventDispatch");
    ......
    startTime = line.substr(position1 + subNum, position2 - position1 - subNum);
    ......
    return startTime;
}

解析 endTime,并计算时延值

 float ParseClickCompleteTrace::GetLineTime()
 {
    ......
     while (getline(infile, line)) {
         ......
         startTime = SmartPerf::ParseClickCompleteTrace::GetStartTime(line, startTime);
         doComposition = line.find("H:RSMainThread::DoComposition");
         if (doComposition != std::string::npos) {
             size_t subNum = 5;
             size_t position1 = line.find("....");
             size_t position2 = line.find(":");
             endTime = line.substr(position1 + subNum, position2 - position1 - subNum);
             ......
         }
     }
     // 计算时延
     completeTime = SmartPerf::ParseClickCompleteTrace::GetTime(endTime);
     return completeTime;
 }

代码路径:developtools/profiler/host/smartperf/client/client_command/parse_click_complete_trace.cpp

错误日志显示 std::out_of_range:basic_string ,该错误是解析某一节点出现异常,于是导出开发板中的 sp_trace_complete.ftrace 文件

导出命令如下:

hdc_std file recv /data/local/tmp/sp_trace_complete.ftrace C:\User\xxx\Desktop\sp_trace_complete.ftrace

导出该trace 文件后,使用文本编辑器打开该 trace 文件,字符串搜索 touchEventDispatch、TouchEventDispatch 和 DoComposition 这三个节点字符串。trace 文件中,没有搜索到 touchEventDispatch 或者 TouchEventDispatch节点,但是可以搜索到 DoComposition 节点。由于 trace 文件中没有采集到按下的 touch 事件,因此,在计算 startTime 时报错 。

6 知识分享

兼容性测试官网的最新版本的 SP_daemon 插件已经支持屏幕内无虚拟返回按键的该项测试功能。工具中计算 startTime 具体实现如下:

std::string  ParseClickCompleteTrace::GetStartTime(std::string line, const std::string &startTimeBefore)
{
    std::string::size_type te = line.find("H:touchEventDispatch");
    std::string::size_type td = line.find("H:TouchEventDispatch");
    std::string::size_type pd = line.find("H:PointerEventDispatch");
    std::string::size_type kd = line.find("H:KeyEventDispatch");
    std::string::size_type nop = std::string::npos;
    if (te != nop || td != nop || pd != nop || kd != nop) {
        size_t touchNum = 3;
        if (flagTouch <= touchNum) {
            size_t position1 = line.find("....");
            size_t position2 = line.find(":");
            size_t subNum = 5;
            startTime = line.substr(position1 + subNum, position2 - position1 - subNum);
            flagTime = "0";
            flagTouch++;
        } else {
            startTime = startTimeBefore;
        }
    } else {
        startTime = startTimeBefore;
    }
    return startTime;
}

计算 startTime 时,增加了 PointerEventDispatch 和 KeyEventDispatch 这2个 trace 节点。使用最新版本的工具进行桌面启动任务管理器测试,能够正确的生成测试结果,生成的 CompleteTimeLauncher.log 结果如下:

time:437.35
Logo

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

更多推荐