Acts兼容性测评桌面启动任务管理器无结果问题分析报告
1 关键字 Acts兼容性测评;StartTaskManager 2 问题描述 OpenHarmony版本:3.2 Release 问题描述:使用 Acts-Validator 套件进行桌面启动任务管理器测试无结果 测试步骤: OpenHarmony 兼容性测试网站下载对应的 Acts-Validator 测试套件; 开发板安装 ActsValidatorTest.hap 应用; 推送下载的测
1 关键字
Acts兼容性测评;StartTaskManager
2 问题描述
OpenHarmony版本:3.2 Release
问题描述:使用 Acts-Validator 套件进行桌面启动任务管理器测试无结果
测试步骤:
-
OpenHarmony 兼容性测试网站下载对应的 Acts-Validator 测试套件;
-
开发板安装 ActsValidatorTest.hap 应用;
-
推送下载的测试资源到开发板;
-
点击桌面 ActsValidatorTest 应用图标打开应用,Window系统电脑端点击.bat文件启动测试;
-
按照 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
更多推荐
所有评论(0)