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_common_util.h"
17 #include "ffrt_inner.h"
18 #include "hisysevent.h"
19 #include "notifier_mgr.h"
20 #include "res_sched_service_ability.h"
21 #include "observer_manager_intf.h"
22 #include "res_sched_log.h"
23 #include "res_sched_mgr.h"
24 #include "res_sched_service.h"
25 #include "event_controller_intf.h"
26 #include "event_listener_mgr.h"
27 #include "system_ability_definition.h"
28
29 #define GAME_SERVICE_SERVICE_ID 66058
30
31 namespace OHOS {
32 namespace ResourceSchedule {
33 const bool REGISTER_RESULT =
34 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<ResSchedServiceAbility>::GetInstance().get());
35
ResSchedServiceAbility()36 ResSchedServiceAbility::ResSchedServiceAbility() : SystemAbility(RES_SCHED_SYS_ABILITY_ID, true)
37 {
38 }
39
~ResSchedServiceAbility()40 ResSchedServiceAbility::~ResSchedServiceAbility()
41 {
42 }
43
OnStart()44 void ResSchedServiceAbility::OnStart()
45 {
46 ResSchedMgr::GetInstance().Init();
47 NotifierMgr::GetInstance().Init();
48 EventListenerMgr::GetInstance().Init();
49 if (!service_) {
50 service_ = new (std::nothrow) ResSchedService();
51 }
52 if (service_ == nullptr) {
53 RESSCHED_LOGE("ResSchedServiceAbility:: New ResSchedService failed.");
54 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
55 "COMPONENT_NAME", "MAIN",
56 "ERR_TYPE", "others",
57 "ERR_MSG", "New ResSchedService object failed!");
58 }
59 service_->InitAllowIpcReportRes();
60 if (!Publish(service_)) {
61 RESSCHED_LOGE("ResSchedServiceAbility:: Register service failed.");
62 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
63 "COMPONENT_NAME", "MAIN",
64 "ERR_TYPE", "register failure",
65 "ERR_MSG", "Register ResSchedService failed.");
66 }
67 SystemAbilityListenerInit();
68 EventControllerInit();
69 ObserverManagerInit();
70 ReclaimProcessMemory();
71 RESSCHED_LOGI("ResSchedServiceAbility ::OnStart.");
72 }
73
OnStop()74 void ResSchedServiceAbility::OnStop()
75 {
76 ObserverManagerDisable();
77 EventControllerStop();
78 RemoveSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID);
79 RemoveSystemAbilityListener(WINDOW_MANAGER_SERVICE_ID);
80 RemoveSystemAbilityListener(APP_MGR_SERVICE_ID);
81 RemoveSystemAbilityListener(POWER_MANAGER_SERVICE_ID);
82 RemoveSystemAbilityListener(SOC_PERF_SERVICE_SA_ID);
83 ResSchedMgr::GetInstance().Stop();
84 RESSCHED_LOGI("ResSchedServiceAbility::OnStop!");
85 }
86
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)87 void ResSchedServiceAbility::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
88 {
89 if (systemAbilityId == RES_SCHED_EXE_ABILITY_ID) {
90 ResSchedMgr::GetInstance().InitExecutorPlugin();
91 } else if (systemAbilityId == APP_MGR_SERVICE_ID) {
92 ResSchedMgr::GetInstance().InitForegroundAppInfo();
93 }
94 nlohmann::json payload;
95 payload["saId"] = systemAbilityId;
96 payload["deviceId"] = deviceId;
97 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SYSTEM_ABILITY_STATUS_CHANGE,
98 ResType::SystemAbilityStatus::SA_ADD, payload);
99 RESSCHED_LOGI("OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
100 }
101
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)102 void ResSchedServiceAbility::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
103 {
104 nlohmann::json payload;
105 payload["saId"] = systemAbilityId;
106 payload["deviceId"] = deviceId;
107 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_SYSTEM_ABILITY_STATUS_CHANGE,
108 ResType::SystemAbilityStatus::SA_REMOVE, payload);
109 RESSCHED_LOGI("OnRemoveSystemAbility systemAbilityId:%{public}d", systemAbilityId);
110 }
111
OnDeviceLevelChanged(int32_t type,int32_t level,std::string & action)112 void ResSchedServiceAbility::OnDeviceLevelChanged(int32_t type, int32_t level, std::string& action)
113 {
114 if (service_ == nullptr) {
115 RESSCHED_LOGE("On Device Level Changed failed due to service nullptr!");
116 return;
117 }
118 service_->OnDeviceLevelChanged(type, level);
119 }
120
ReclaimProcessMemory()121 void ResSchedServiceAbility::ReclaimProcessMemory()
122 {
123 const int32_t delayTime = 60 * 1000 * 1000;
124 ffrt::task_attr taskattr;
125 taskattr.delay(delayTime);
126 ffrt::submit([]() {ResCommonUtil::WriteFileReclaim(getpid());}, {}, {}, {taskattr});
127 }
128
SystemAbilityListenerInit()129 void ResSchedServiceAbility::SystemAbilityListenerInit()
130 {
131 if (!AddSystemAbilityListener(APP_MGR_SERVICE_ID)) {
132 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
133 "COMPONENT_NAME", "MAIN",
134 "ERR_TYPE", "register failure",
135 "ERR_MSG", "Register a listener of app manager service failed.");
136 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", APP_MGR_SERVICE_ID);
137 }
138 if (!AddSystemAbilityListener(WINDOW_MANAGER_SERVICE_ID)) {
139 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
140 "COMPONENT_NAME", "MAIN",
141 "ERR_TYPE", "register failure",
142 "ERR_MSG", "Register a listener of window manager service failed.");
143 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", WINDOW_MANAGER_SERVICE_ID);
144 }
145 if (!AddSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID)) {
146 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
147 "COMPONENT_NAME", "MAIN",
148 "ERR_TYPE", "register failure",
149 "ERR_MSG", "Register a listener of background task manager service failed.");
150 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", BACKGROUND_TASK_MANAGER_SERVICE_ID);
151 }
152 if (!AddSystemAbilityListener(RES_SCHED_EXE_ABILITY_ID)) {
153 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
154 "COMPONENT_NAME", "MAIN",
155 "ERR_TYPE", "register failure",
156 "ERR_MSG", "Register a listener of background task manager service failed.");
157 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", RES_SCHED_EXE_ABILITY_ID);
158 }
159 if (!AddSystemAbilityListener(POWER_MANAGER_SERVICE_ID)) {
160 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
161 "COMPONENT_NAME", "MAIN",
162 "ERR_TYPE", "register failure",
163 "ERR_MSG", "Register a listener of power manager service failed.");
164 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", POWER_MANAGER_SERVICE_ID);
165 }
166 if (!AddSystemAbilityListener(GAME_SERVICE_SERVICE_ID)) {
167 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
168 "COMPONENT_NAME", "MAIN",
169 "ERR_TYPE", "register failure",
170 "ERR_MSG", "Register a listener of power manager service failed.");
171 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", GAME_SERVICE_SERVICE_ID);
172 }
173 SystemAbilityListenerInitExt();
174 RESSCHED_LOGI("Init SystemAbilityListener finish");
175 }
176
SystemAbilityListenerInitExt()177 void ResSchedServiceAbility::SystemAbilityListenerInitExt()
178 {
179 if (!AddSystemAbilityListener(WIFI_DEVICE_SYS_ABILITY_ID)) {
180 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
181 "COMPONENT_NAME", "MAIN",
182 "ERR_TYPE", "register failure",
183 "ERR_MSG", "Register a listener of wifi manager service failed.");
184 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", WIFI_DEVICE_SYS_ABILITY_ID);
185 }
186 if (!AddSystemAbilityListener(MSDP_USER_STATUS_SERVICE_ID)) {
187 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
188 "COMPONENT_NAME", "MAIN",
189 "ERR_TYPE", "register failure",
190 "ERR_MSG", "Register a listener of power manager service failed.");
191 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", MSDP_USER_STATUS_SERVICE_ID);
192 }
193 if (!AddSystemAbilityListener(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID)) {
194 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
195 "COMPONENT_NAME", "MAIN",
196 "ERR_TYPE", "register failure",
197 "ERR_MSG", "Register a listener of power manager service failed.");
198 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
199 }
200 if (!AddSystemAbilityListener(SOC_PERF_SERVICE_SA_ID)) {
201 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
202 "COMPONENT_NAME", "MAIN",
203 "ERR_TYPE", "register failure",
204 "ERR_MSG", "Register a listener of power manager service failed.");
205 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", SOC_PERF_SERVICE_SA_ID);
206 }
207 if (!AddSystemAbilityListener(MEMORY_MANAGER_SA_ID)) {
208 RESSCHED_LOGI("AddSystemAbilityListener failed saId:%{public}d", MEMORY_MANAGER_SA_ID);
209 }
210 }
211 } // namespace ResourceSchedule
212 } // namespace OHOS
213
214