1 /*
2  * Copyright (c) 2022-2024 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 
16 #include "res_sched_mgr.h"
17 
18 #include <cinttypes>
19 #include <map>
20 
21 #include "cgroup_sched.h"
22 #include "notifier_mgr.h"
23 #include "res_exe_type.h"
24 #include "res_sched_exe_client.h"
25 #include "res_sched_log.h"
26 #include "res_type.h"
27 #include "plugin_mgr.h"
28 #include "hitrace_meter.h"
29 #include "scene_recognizer_mgr.h"
30 
31 namespace OHOS {
32 namespace ResourceSchedule {
33 using namespace AppExecFwk;
34 namespace {
35     const std::map<uint32_t, std::string> resTypeToStr = {
36         { ResType::SYNC_RES_TYPE_THAW_ONE_APP, "SYNC_RES_TYPE_THAW_ONE_APP"},
37         { ResType::SYNC_RES_TYPE_GET_ALL_SUSPEND_STATE, "SYNC_RES_TYPE_GET_ALL_SUSPEND_STATE"},
38         { ResType::SYNC_RES_TYPE_GET_THERMAL_DATA, "SYNC_RES_TYPE_GET_THERMAL_DATA"},
39         { ResType::RES_TYPE_SCREEN_STATUS, "SCREEN_STATUS" },
40         { ResType::RES_TYPE_APP_STATE_CHANGE, "APP_STATE_CHANGE" },
41         { ResType::RES_TYPE_ABILITY_STATE_CHANGE, "ABILITY_STATE_CHANGE" },
42         { ResType::RES_TYPE_EXTENSION_STATE_CHANGE, "EXTENSION_STATE_CHANGE" },
43         { ResType::RES_TYPE_PROCESS_STATE_CHANGE, "PROCESS_STATE_CHANGE" },
44         { ResType::RES_TYPE_WINDOW_FOCUS, "WINDOW_FOCUS" },
45         { ResType::RES_TYPE_TRANSIENT_TASK, "TRANSIENT_TASK" },
46         { ResType::RES_TYPE_CONTINUOUS_TASK, "CONTINUOUS_TASK" },
47         { ResType::RES_TYPE_CGROUP_ADJUSTER, "CGROUP_ADJUSTER" },
48         { ResType::RES_TYPE_CLICK_RECOGNIZE, "CLICK_RECOGNIZE" },
49         { ResType::RES_TYPE_PUSH_PAGE, "PUSH_PAGE" },
50         { ResType::RES_TYPE_SLIDE_RECOGNIZE, "SLIDE_RECOGNIZE" },
51         { ResType::RES_TYPE_WINDOW_VISIBILITY_CHANGE, "WINDOW_VISIBILITY_CHANGE" },
52         { ResType::RES_TYPE_REPORT_MMI_PROCESS, "REPORT_MMI_PROCESS" },
53         { ResType::RES_TYPE_REPORT_RENDER_THREAD, "REPORT_RENDER_THREAD" },
54         { ResType::RES_TYPE_APP_INSTALL_UNINSTALL, "APP_INSTALL_UNINSTALL" },
55         { ResType::RES_TYPE_WIFI_CONNECT_STATE_CHANGE, "WIFI_CONNECT_STATE_CHANGE" },
56         { ResType::RES_TYPE_USER_SWITCH, "USER_SWITCH" },
57         { ResType::RES_TYPE_USER_REMOVE, "USER_REMOVE" },
58         { ResType::RES_TYPE_SCREEN_LOCK, "SCREEN_LOCK" },
59         { ResType::RES_TYPE_BLUETOOTH_A2DP_CONNECT_STATE_CHANGE, "BLUETOOTH_A2DP_CONNECT_STATE_CHANGE" },
60         { ResType::RES_TYPE_NETWORK_LATENCY_REQUEST, "NETWORK_LATENCY_REQUEST" },
61         { ResType::RES_TYPE_CALL_STATE_UPDATE, "CALL_STATE_UPDATE" },
62         { ResType::RES_TYPE_THREAD_QOS_CHANGE, "THREAD_QOS_CHANGE" },
63         { ResType::RES_TYPE_AUDIO_RENDER_STATE_CHANGE, "AUDIO_RENDER_STATE_CHANGE" },
64         { ResType::RES_TYPE_AUDIO_RING_MODE_CHANGE, "AUDIO_RING_MODE_CHANGE" },
65         { ResType::RES_TYPE_AUDIO_VOLUME_KEY_CHANGE, "AUDIO_VOLUME_KEY_CHANGE" },
66         { ResType::RES_TYPE_APP_ABILITY_START, "APP_ABILITY_START" },
67         { ResType::RES_TYPE_POP_PAGE, "POP_PAGE" },
68         { ResType::RES_TYPE_WEB_GESTURE, "WEB_GESTURE" },
69         { ResType::RES_TYPE_DEVICE_STILL_STATE_CHANGE, "DEVICE_STILL_STATE_CHANGE" },
70         { ResType::RES_TYPE_RESIZE_WINDOW, "RES_TYPE_RESIZE_WINDOW" },
71         { ResType::RES_TYPE_MOVE_WINDOW, "RES_TYPE_MOVE_WINDOW" },
72         { ResType::RES_TYPE_SHOW_REMOTE_ANIMATION, "RES_TYPE_SHOW_REMOTE_ANIMATION" },
73         { ResType::RES_TYPE_LOAD_PAGE, "RES_TYPE_LOAD_PAGE" },
74         { ResType::RES_TYPE_REPORT_CAMERA_STATE, "RES_TYPE_REPORT_CAMERA_STATE" },
75         { ResType::RES_TYPE_RUNNINGLOCK_STATE, "RES_TYPE_RUNNINGLOCK_STATE" },
76         { ResType::RES_TYPE_DRAG_STATUS_BAR, "RES_TYPE_DRAG_STATUS_BAR" },
77         { ResType::RES_TYPE_REPORT_SCENE_BOARD, "RES_TYPE_REPORT_SCENE_BOARD" },
78         { ResType::RES_TYPE_REPORT_KEY_THREAD, "RES_TYPE_REPORT_KEY_THREAD" },
79         { ResType::RES_TYPE_REPORT_WINDOW_STATE, "RES_TYPE_REPORT_WINDOW_STATE" },
80         { ResType::RES_TYPE_REPORT_SCENE_SCHED, "RES_TYPE_REPORT_SCENE_SCHED" },
81         { ResType::RES_TYPE_WEB_GESTURE_MOVE, "RES_TYPE_WEB_GESTURE_MOVE" },
82         { ResType::RES_TYPE_WEB_SLIDE_NORMAL, "RES_TYPE_WEB_SLIDE_NORMAL" },
83         { ResType::RES_TYPE_LOAD_URL, "RES_TYPE_LOAD_URL" },
84         { ResType::RES_TYPE_MOUSEWHEEL, "RES_TYPE_MOUSEWHEEL" },
85         { ResType::RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE" },
86         { ResType::RES_TYPE_MMI_INPUT_STATE, "RES_TYPE_MMI_INPUT_STATE" },
87         { ResType::RES_TYPE_ANCO_CUST, "RES_TYPE_ANCO_CUST" },
88         { ResType::RES_TYPE_TIMEZONE_CHANGED, "RES_TYPE_TIMEZONE_CHANGED" },
89         { ResType::RES_TYPE_TIME_CHANGED, "RES_TYPE_TIME_CHANGED" },
90         { ResType::RES_TYPE_NITZ_TIME_CHANGED, "RES_TYPE_NITZ_TIME_CHANGED" },
91         { ResType::RES_TYPE_NITZ_TIMEZONE_CHANGED, "RES_TYPE_NITZ_TIMEZONE_CHANGED" },
92         { ResType::RES_TYPE_CHARGING_DISCHARGING, "RES_TYPE_CHARGING_DISCHARGING" },
93         { ResType::RES_TYPE_USB_DEVICE, "RES_TYPE_USB_DEVICE" },
94         { ResType::RES_TYPE_CALL_STATE_CHANGED, "RES_TYPE_CALL_STATE_CHANGED" },
95         { ResType::RES_TYPE_WIFI_P2P_STATE_CHANGED, "RES_TYPE_WIFI_P2P_STATE_CHANGED" },
96         { ResType::RES_TYPE_CONNECTION_OBSERVER, "RES_TYPE_CONNECTION_OBSERVER" },
97         { ResType::RES_TYPE_AV_SESSION_ON_SESSION_CREATE, "RES_TYPE_AV_SESSION_ON_SESSION_CREATE" },
98         { ResType::RES_TYPE_AV_SESSION_ON_SESSION_RELEASE, "RES_TYPE_AV_SESSION_ON_SESSION_RELEASE" },
99         { ResType::RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE, "RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE" },
100         { ResType::RES_TYPE_ON_APP_STATE_CHANGED, "RES_TYPE_ON_APP_STATE_CHANGED" },
101         { ResType::RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED, "RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED" },
102         { ResType::RES_TYPE_AV_CODEC_STATE, "RES_TYPE_AV_CODEC_STATE" },
103         { ResType::RES_TYPE_APP_ASSOCIATED_START, "RES_TYPE_APP_ASSOCIATED_START" },
104         { ResType::RES_TYPE_THERMAL_STATE, "RES_TYPE_THERMAL_STATE"},
105         { ResType::RES_TYPE_SOCPERF_CUST_EVENT_BEGIN, "RES_TYPE_SOCPERF_CUST_EVENT_BEGIN" },
106         { ResType::RES_TYPE_SOCPERF_CUST_EVENT_END, "RES_TYPE_SOCPERF_CUST_EVENT_END" },
107         { ResType::RES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE, "RES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE" },
108         { ResType::RES_TYPE_REPORT_SCREEN_CAPTURE, "RES_TYPE_REPORT_SCREEN_CAPTURE" },
109         { ResType::RES_TYPE_LONG_FRAME, "RES_TYPE_LONG_FRAME" },
110         { ResType::RES_TYPE_KEY_PERF_SCENE, "RES_TYPE_KEY_PERF_SCENE" },
111         { ResType::RES_TYPE_SUPER_LAUNCHER, "RES_TYPE_SUPER_LAUNCHER" },
112         { ResType::RES_TYPE_CAST_SCREEN, "RES_TYPE_CAST_SCREEN" },
113         { ResType::RES_TYPR_SCREEN_COLLABROATION, "RES_TYPR_SCREEN_COLLABROATION" },
114         { ResType::RES_TYPE_SA_CONTROL_APP_EVENT, "RES_TYPE_SA_CONTROL_APP_EVENT" },
115         { ResType::RES_TYPE_SYSTEM_CPU_LOAD, "RES_TYPE_SYSTEM_CPU_LOAD" },
116         { ResType::RES_TYPE_UPLOAD_DOWNLOAD, "RES_TYPE_UPLOAD_DOWNLOAD" },
117         { ResType::RES_TYPE_SPLIT_SCREEN, "RES_TYPE_SPLIT_SCREEN" },
118         { ResType::RES_TYPE_FLOATING_WINDOW, "RES_TYPE_FLOATING_WINDOW" },
119         { ResType::RES_TYPE_REPORT_DISTRIBUTE_TID, "RES_TYPE_REPORT_DISTRIBUTE_TID"},
120         { ResType::RES_TYPE_FRAME_RATE_REPORT, "RES_TYPE_FRAME_RATE_REPORT"},
121         { ResType::RES_TYPE_WEBVIEW_SCREEN_CAPTURE, "RES_TYPE_WEBVIEW_SCREEN_CAPTURE"},
122         { ResType::RES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE"},
123         { ResType::RES_TYPE_LOCATION_STATUS_CHANGE, "RES_TYPE_LOCATION_STATUS_CHANGE"},
124         { ResType::RES_TYPE_AUDIO_SILENT_PLAYBACK, "RES_TYPE_AUDIO_SILENT_PLAYBACK" },
125         { ResType::RES_TYPE_DEVICE_MODE_STATUS, "RES_TYPE_DEVICE_MODE_STATUS"},
126         { ResType::RES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE, "RES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE"},
127         { ResType::RES_TYPE_FORM_STATE_CHANGE_EVENT, "RES_TYPE_FORM_STATE_CHANGE_EVENT"},
128         { ResType::RES_TYPE_POWER_MODE_CHANGED, "RES_TYPE_POWER_MODE_CHANGED" },
129         { ResType::RES_TYPE_THERMAL_SCENARIO_REPORT, "RES_TYPE_THERMAL_SCENARIO_REPORT" },
130         { ResType::RES_TYPE_BOOT_COMPLETED, "RES_TYPE_BOOT_COMPLETED" },
131         { ResType::RES_TYPE_CONTINUOUS_STARTUP, "RES_TYPE_CONTINUOUS_STARTUP" },
132         { ResType::RES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK, "RES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK"},
133         { ResType::RES_TYPE_REPORT_GAME_SCHED, "RES_TYPE_REPORT_GAME_SCHED" },
134         { ResType::RES_TYPE_APP_FRAME_DROP, "RES_TYPE_APP_FRAME_DROP"},
135         { ResType::RES_TYPE_RSS_CLOUD_CONFIG_UPDATE, "RES_TYPE_RSS_CLOUD_CONFIG_UPDATE" },
136         { ResType::RES_TYPE_BT_SERVICE_EVENT, "RES_TYPE_BT_SERVICE_EVENT" },
137         { ResType::RES_TYPE_APP_GAME_BOOST_EVENT, "RES_TYPE_APP_GAME_BOOST_EVENT" },
138         { ResType::RES_TYPE_AUDIO_RENDERER_STANDBY, "RES_TYPE_AUDIO_RENDERER_STANDBY" },
139     };
140 }
141 
142 IMPLEMENT_SINGLE_INSTANCE(ResSchedMgr);
143 
Init()144 void ResSchedMgr::Init()
145 {
146     PluginMgr::GetInstance().Init();
147     PluginMgr::GetInstance().SetResTypeStrMap(resTypeToStr);
148 
149     if (!killProcess_) {
150         killProcess_ = std::make_shared<KillProcess>();
151     }
152 
153     InitExecutorPlugin(true);
154 }
155 
Stop()156 void ResSchedMgr::Stop()
157 {
158     PluginMgr::GetInstance().Stop();
159 }
160 
ReportData(uint32_t resType,int64_t value,const nlohmann::json & payload)161 void ResSchedMgr::ReportData(uint32_t resType, int64_t value, const nlohmann::json& payload)
162 {
163     ReportDataInner(resType, value, payload);
164     DispatchResourceInner(resType, value, payload);
165     SceneRecognizerMgr::GetInstance().DispatchResource(resType, value, payload);
166 }
167 
ReportDataInner(uint32_t resType,int64_t value,const nlohmann::json & payload)168 void ResSchedMgr::ReportDataInner(uint32_t resType, int64_t value, const nlohmann::json& payload)
169 {
170     RESSCHED_LOGD("%{public}s, receive resType = %{public}u, value = %{public}lld.", __func__,
171         resType, (long long)value);
172     std::string trace_str(__func__);
173     trace_str.append(",resType[").append(std::to_string(resType)).append("]");
174     trace_str.append(",value[").append(std::to_string(value)).append("]");
175     StartTrace(HITRACE_TAG_OHOS, trace_str, -1);
176     PluginMgr::GetInstance().DispatchResource(std::make_shared<ResData>(resType, value, payload));
177     FinishTrace(HITRACE_TAG_OHOS);
178 }
179 
KillProcessByClient(const nlohmann::json & payload)180 int32_t ResSchedMgr::KillProcessByClient(const nlohmann::json& payload)
181 {
182     return killProcess_->KillProcessByPidWithClient(payload);
183 }
184 
InitExecutorPlugin(bool isProcessInit)185 void ResSchedMgr::InitExecutorPlugin(bool isProcessInit)
186 {
187     std::vector<std::string> configStrs = PluginMgr::GetInstance().GetConfigReaderStr();
188     std::vector<std::string> switchStrs = PluginMgr::GetInstance().GetPluginSwitchStr();
189 
190     nlohmann::json payload;
191     nlohmann::json context;
192     payload["config"] = configStrs;
193     payload["switch"] = switchStrs;
194     ResSchedExeClient::GetInstance().SendRequestSync(ResExeType::RES_TYPE_EXECUTOR_PLUGIN_INIT, 0, payload, context);
195 
196     if (isProcessInit) {
197         PluginMgr::GetInstance().ParseConfigReader(configStrs);
198         PluginMgr::GetInstance().ParsePluginSwitch(switchStrs);
199     }
200 }
201 
DispatchResourceInner(uint32_t resType,int64_t value,const nlohmann::json & payload)202 void ResSchedMgr::DispatchResourceInner(uint32_t resType, int64_t value, const nlohmann::json& payload)
203 {
204     CgroupSchedDispatch(resType, value, payload);
205 }
206 
ReportDataInProcess(uint32_t resType,int64_t value,const nlohmann::json & payload)207 extern "C" void ReportDataInProcess(uint32_t resType, int64_t value, const nlohmann::json& payload)
208 {
209     ResSchedMgr::GetInstance().ReportData(resType, value, payload);
210 }
211 
ReportAppStateInProcess(int32_t state,int32_t pid)212 extern "C" void ReportAppStateInProcess(int32_t state, int32_t pid)
213 {
214     NotifierMgr::GetInstance().OnApplicationStateChange(state, pid);
215 }
216 } // namespace ResourceSchedule
217 } // namespace OHOS
218