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 <iostream>
16 #include "include/AI_schedule.h"
17 #include "include/CPU.h"
18 #include "include/DDR.h"
19 #include "include/GetLog.h"
20 #include "include/GPU.h"
21 #include "include/FPS.h"
22 #include "include/profiler_fps.h"
23 #include "include/RAM.h"
24 #include "include/Network.h"
25 #include "include/Power.h"
26 #include "include/Temperature.h"
27 #include "include/ByTrace.h"
28 #include "include/sp_utils.h"
29 #include "include/sp_profiler_factory.h"
30 #include "include/Capture.h"
31 #include "include/navigation.h"
32 #include "include/sp_log.h"
33 #include "include/FileDescriptor.h"
34 #include "include/Threads.h"
35
36 namespace OHOS {
37 namespace SmartPerf {
GetProfilerItem(MessageType messageType)38 SpProfiler *SpProfilerFactory::GetProfilerItem(MessageType messageType)
39 {
40 SpProfiler* profiler = nullptr;
41 switch (messageType) {
42 case MessageType::GET_CPU_FREQ_LOAD:
43 profiler = &CPU::GetInstance();
44 break;
45 case MessageType::GET_FPS_AND_JITTERS:
46 case MessageType::GET_CUR_FPS:
47 profiler = &ProfilerFPS::GetInstance();
48 break;
49 case MessageType::GET_GPU_FREQ:
50 case MessageType::GET_GPU_LOAD:
51 profiler = &GPU::GetInstance();
52 break;
53 case MessageType::GET_DDR_FREQ:
54 profiler = &DDR::GetInstance();
55 break;
56 case MessageType::GET_RAM_INFO:
57 profiler = &RAM::GetInstance();
58 break;
59 case MessageType::GET_LOG:
60 profiler = &GetLog::GetInstance();
61 break;
62 case MessageType::GET_PROCESS_THREADS:
63 profiler = &Threads::GetInstance();
64 break;
65 case MessageType::GET_PROCESS_FDS:
66 profiler = &FileDescriptor::GetInstance();
67 break;
68 default:
69 break;
70 }
71 if (profiler == nullptr) {
72 profiler = GetProfilerItemContinue(messageType);
73 }
74 return profiler;
75 }
76
GetProfilerItemContinue(MessageType messageType)77 SpProfiler *SpProfilerFactory::GetProfilerItemContinue(MessageType messageType)
78 {
79 SpProfiler* profiler = nullptr;
80 switch (messageType) {
81 case MessageType::GET_TEMPERATURE:
82 profiler = &Temperature::GetInstance();
83 break;
84 case MessageType::GET_POWER:
85 profiler = &Power::GetInstance();
86 break;
87 case MessageType::CATCH_TRACE_CONFIG:
88 ProfilerFPS::GetInstance().SetTraceCatch();
89 break;
90 case MessageType::GET_CAPTURE:
91 Capture::GetInstance().SocketMessage();
92 profiler = &Capture::GetInstance();
93 break;
94 case MessageType::CATCH_NETWORK_TRAFFIC:
95 case MessageType::GET_NETWORK_TRAFFIC:
96 profiler = &Network::GetInstance();
97 break;
98 default:
99 break;
100 }
101 return profiler;
102 }
103
SetProfilerPkg(const std::string & pkg)104 void SpProfilerFactory::SetProfilerPkg(const std::string &pkg)
105 {
106 LOGD("SpProfilerFactory setPKG:%s", pkg.c_str());
107 FPS &fps = FPS::GetInstance();
108 fps.SetPackageName(pkg);
109 ProfilerFPS &profilerFps = ProfilerFPS::GetInstance();
110 profilerFps.SetPackageName(pkg);
111 RAM &ram = RAM::GetInstance();
112 ram.SetPackageName(pkg);
113 CPU &cpu = CPU::GetInstance();
114 cpu.SetPackageName(pkg);
115 Threads &threads = Threads::GetInstance();
116 threads.SetPackageName(pkg);
117 FileDescriptor &fds = FileDescriptor::GetInstance();
118 fds.SetPackageName(pkg);
119 }
120
SetProfilerPidByPkg(std::string & pid,std::string pids)121 void SpProfilerFactory::SetProfilerPidByPkg(std::string &pid, std::string pids)
122 {
123 LOGD("SpProfilerFactory setPID:%s", pid.c_str());
124 std::string bundleName;
125 SPUtils::GetBundleName(pid, bundleName);
126 FPS &fps = FPS::GetInstance();
127 fps.SetProcessId(pid);
128 fps.SetPackageName(bundleName);
129 ProfilerFPS &profilerFps = ProfilerFPS::GetInstance();
130 profilerFps.SetProcessId(pid);
131 profilerFps.SetPackageName(bundleName);
132 RAM &ram = RAM::GetInstance();
133 ram.SetProcessId(pids.empty() ? pid : pids);
134 CPU &cpu = CPU::GetInstance();
135 cpu.SetProcessId(pids.empty() ? pid : pids);
136 cpu.SetPackageName(bundleName);
137 Navigation &nav = Navigation::GetInstance();
138 nav.SetProcessId(pid);
139 AISchedule &as = AISchedule::GetInstance();
140 as.SetProcessId(pid);
141 Threads &threads = Threads::GetInstance();
142 threads.SetProcessId(pids.empty() ? pid : pids);
143 FileDescriptor &fds = FileDescriptor::GetInstance();
144 fds.SetProcessId(pids.empty() ? pid : pids);
145 }
146
SetProfilerLayer(const std::string & layer)147 void SpProfilerFactory::SetProfilerLayer(const std::string &layer)
148 {
149 FPS &fps = FPS::GetInstance();
150 fps.SetLayerName(layer);
151 }
152
SetProfilerGameLayer(const std::string & isGameView)153 void SpProfilerFactory::SetProfilerGameLayer(const std::string &isGameView)
154 {
155 ProfilerFPS &profilerFps = ProfilerFPS::GetInstance();
156 profilerFps.SetGameLayer(isGameView);
157 }
158
SetByTrace(std::string message)159 void SpProfilerFactory::SetByTrace(std::string message)
160 {
161 std::vector<std::string> values;
162 std::string delimiter = "||";
163 std::string delim = "=";
164 SPUtils::StrSplit(message, delimiter, values);
165 int mSum = 0;
166 int mInterval = 0;
167 long long mThreshold = 0;
168 int lowFps = 0;
169 for (std::string vItem : values) {
170 std::vector<std::string> vItems;
171 SPUtils::StrSplit(vItem, delim, vItems);
172 if (vItems[0] == "traceSum") {
173 mSum = SPUtilesTye::StringToSometype<int>(vItems[1]);
174 }
175 if (vItems[0] == "fpsJitterTime") {
176 mThreshold = SPUtilesTye::StringToSometype<int>(vItems[1]);
177 }
178 if (vItems[0] == "catchInterval") {
179 mInterval = SPUtilesTye::StringToSometype<int>(vItems[1]);
180 }
181 if (vItems[0] == "lowFps") {
182 lowFps = SPUtilesTye::StringToSometype<int>(vItems[1]);
183 }
184 }
185 const ByTrace &bTrace = ByTrace::GetInstance();
186 if (message.find("traceSum") != std::string::npos) {
187 int mCurNum = 1;
188 bTrace.SetTraceConfig(mSum, mInterval, mThreshold, lowFps, mCurNum);
189 }
190 }
GetCmdProfilerItem(CommandType commandType,bool cmdFlag)191 SpProfiler *SpProfilerFactory::GetCmdProfilerItem(CommandType commandType, bool cmdFlag)
192 {
193 SpProfiler *profiler = nullptr;
194 switch (commandType) {
195 case CommandType::CT_C:
196 if (cmdFlag) {
197 profiler = &CPU::GetInstance();
198 }
199 break;
200 case CommandType::CT_G:
201 profiler = &GPU::GetInstance();
202 break;
203 case CommandType::CT_F:
204 if (cmdFlag) {
205 profiler = &FPS::GetInstance();
206 }
207 break;
208 case CommandType::CT_D:
209 profiler = &DDR::GetInstance();
210 break;
211 case CommandType::CT_P:
212 profiler = &Power::GetInstance();
213 break;
214 case CommandType::CT_T:
215 profiler = &Temperature::GetInstance();
216 break;
217 case CommandType::CT_R:
218 if (cmdFlag) {
219 profiler = &RAM::GetInstance();
220 }
221 break;
222 case CommandType::CT_NET:
223 profiler = &Network::GetInstance();
224 break;
225 case CommandType::CT_NAV:
226 profiler = &Navigation::GetInstance();
227 break;
228 case CommandType::CT_TTRACE:
229 ProfilerFPS::GetInstance().SetTraceCatch();
230 break;
231 case CommandType::CT_AS:
232 profiler = &AISchedule::GetInstance();
233 break;
234 default:
235 break;
236 }
237 if (profiler == nullptr) {
238 profiler = GetCmdProfilerItemContinue(commandType, cmdFlag);
239 }
240 return profiler;
241 }
242
GetCmdProfilerItemContinue(CommandType commandType,bool cmdFlag)243 SpProfiler *SpProfilerFactory::GetCmdProfilerItemContinue(CommandType commandType, bool cmdFlag)
244 {
245 SpProfiler *profiler = nullptr;
246 switch (commandType) {
247 case CommandType::CT_SNAPSHOT:
248 if (cmdFlag) {
249 profiler = &Capture::GetInstance();
250 }
251 break;
252 case CommandType::CT_THREADS:
253 profiler = &Threads::GetInstance().GetInstance();
254 break;
255 case CommandType::CT_FDS:
256 if (cmdFlag) {
257 profiler = &FileDescriptor::GetInstance().GetInstance();
258 }
259 break;
260 default:
261 break;
262 }
263 return profiler;
264 }
265 }
266 }
267