1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #include <thread> 16 #include <iostream> 17 #include <fstream> 18 #include <string> 19 #include <vector> 20 #include <cstdio> 21 #include <sstream> 22 #include <iomanip> 23 #include "include/parse_click_response_trace.h" 24 #include "include/sp_utils.h" 25 namespace OHOS { 26 namespace SmartPerf { ParseResponseTrace(std::string fileNamePath)27 float ParseClickResponseTrace::ParseResponseTrace(std::string fileNamePath) 28 { 29 int conversion = 1000; 30 infile.open(fileNamePath); 31 if (infile.fail()) { 32 std::cout << "File " << "open fail" << std::endl; 33 return 0; 34 } else { 35 completeTime = SmartPerf::ParseClickResponseTrace::GetLineTime(); 36 } 37 infile.close(); 38 return completeTime * conversion; 39 } GetLineTime()40 float ParseClickResponseTrace::GetLineTime() 41 { 42 std::string line; 43 std::string startTime = "0"; 44 std::string endTime = "0"; 45 std::string appPid = "0"; 46 std::string::size_type doComposition; 47 size_t subNum = 5; 48 while (getline(infile, line)) { 49 appPid = SmartPerf::ParseClickResponseTrace::GetPid(line, "pid", appPid); 50 startTime = SmartPerf::ParseClickResponseTrace::GetStartTime(line, startTime); 51 doComposition = line.find("H:RSMainThread::DoComposition"); 52 if (doComposition != std::string::npos) { 53 size_t position1 = line.find("...."); 54 size_t position2 = line.find(":"); 55 endTime = line.substr(position1 + subNum, position2 - position1 - subNum); 56 if (std::stof(startTime) == 0) { 57 } else { 58 break; 59 } 60 } 61 } 62 completeTime = SmartPerf::ParseClickResponseTrace::GetTime(startTime, endTime); 63 return completeTime; 64 } GetTime(std::string startTime,std::string endTime)65 float ParseClickResponseTrace::GetTime(std::string startTime, std::string endTime) 66 { 67 size_t point = endTime.find("."); 68 float subNum = 2; 69 endTime = endTime.substr(point - subNum); 70 startTime = startTime.substr(point - subNum); 71 if (std::stof(endTime) == 0 || std::stof(startTime) == 0) { 72 } else { 73 float displayTime = 0.032; 74 completeTime = std::stof(endTime) - std::stof(startTime) + displayTime; 75 } 76 return completeTime; 77 } GetPid(std::string line,const std::string & pn,const std::string & pb)78 std::string ParseClickResponseTrace::GetPid(std::string line, const std::string &pn, const std::string &pb) 79 { 80 std::string appPid; 81 if (appPidnum == 0) { 82 size_t packageNameNumSize = 5; 83 std::string::size_type positionPackgeName; 84 if (pn.length() < packageNameNumSize) { 85 std::string::size_type positionAppspawn; 86 positionPackgeName = line.find("task_newtask: pid="); 87 positionAppspawn = line.find("comm=appspawn"); 88 if (positionPackgeName != std::string::npos && positionAppspawn != std::string::npos) { 89 size_t subNum = 4; 90 size_t position1 = line.find("pid="); 91 size_t position2 = line.find(" comm=appspawn"); 92 appPid = line.substr(position1 + subNum, position2 - position1 - subNum); 93 appPidnum++; 94 } else { 95 appPid = pb; 96 } 97 } else { 98 positionPackgeName = line.find(pn); 99 if (positionPackgeName != std::string::npos) { 100 size_t p1 = line.find(pn); 101 size_t p2 = line.find(" prio"); 102 appPid = line.substr(p1 + pn.length(), p2 - p1 - pn.length()); 103 appPidnum++; 104 } else { 105 appPid = pb; 106 } 107 } 108 } 109 return appPid; 110 } GetStartTime(std::string line,const std::string & startTimeBefore)111 std::string ParseClickResponseTrace::GetStartTime(std::string line, const std::string &startTimeBefore) 112 { 113 std::string startTime; 114 std::string::size_type te = line.find("H:touchEventDispatch"); 115 std::string::size_type td = line.find("H:TouchEventDispatch"); 116 std::string::size_type pd = line.find("H:PointerEventDispatch"); 117 std::string::size_type kd = line.find("H:KeyEventDispatch"); 118 std::string::size_type nop = std::string::npos; 119 if (te != nop || td != nop || pd != nop || kd != nop) { 120 int touchNum = 3; 121 if (flagTouch <= touchNum) { 122 size_t position1 = line.find("...."); 123 size_t position2 = line.find(":"); 124 size_t subNum = 5; 125 startTime = line.substr(position1 + subNum, position2 - position1 - subNum); 126 flagTime = "0"; 127 flagTouch++; 128 } else { 129 startTime = startTimeBefore; 130 } 131 } else { 132 startTime = startTimeBefore; 133 } 134 return startTime; 135 } 136 } 137 }