1 /*
2 * Copyright (c) 2022 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 "mem_mgr_event_center.h"
17 #include <string>
18 #include "memmgr_log.h"
19 #include "memmgr_ptr_util.h"
20 #include "common_event_observer.h"
21 #include "reclaim_priority_manager.h"
22 #include "window_visibility_observer.h"
23 #ifdef CONFIG_BGTASK_MGR
24 #include "background_task_mgr_helper.h"
25 #endif
26 #include "connection_observer_client.h"
27 #include "common_event_support.h"
28 #include "common_event_manager.h"
29
30 namespace OHOS {
31 namespace Memory {
32 namespace {
33 const std::string TAG = "MemMgrEventCenter";
34 const std::string MEMMGR_CENTER_HANDLER = "MemMgrEventCenterHandler";
35 const int ACCOUNT_MAX_RETRY_TIMES = 10;
36 const int ACCOUNT_RETRY_DELAY = 3000;
37 const int EXTCONN_RETRY_TIME = 1000;
38 }
39
40 IMPLEMENT_SINGLE_INSTANCE(MemMgrEventCenter);
41
MemMgrEventCenter()42 MemMgrEventCenter::MemMgrEventCenter()
43 {}
44
Init()45 bool MemMgrEventCenter::Init()
46 {
47 HILOGI("called");
48 if (CreateRegisterHandler()) {
49 HandlerRegisterEvent(RegisterEvent::REG_ALLOBS_EVENT);
50 return true;
51 }
52 return false;
53 }
54
CreateRegisterHandler()55 bool MemMgrEventCenter::CreateRegisterHandler()
56 {
57 if (!regObsHandler_) {
58 MAKE_POINTER(regObsHandler_, shared, AppExecFwk::EventHandler, "failed to create register handler",
59 return false, AppExecFwk::EventRunner::Create(MEMMGR_CENTER_HANDLER));
60 }
61 return true;
62 }
63
RemoveEventObserver(int32_t systemAbilityId)64 void MemMgrEventCenter::RemoveEventObserver(int32_t systemAbilityId)
65 {
66 HILOGI("called");
67 if (systemAbilityId == ABILITY_MGR_SERVICE_ID || systemAbilityId == APP_MGR_SERVICE_ID) {
68 ReclaimPriorityManager::GetInstance().Reset();
69 }
70 }
71
OnProcessDied(int pid)72 void MemMgrEventCenter::OnProcessDied(int pid)
73 {
74 HILOGD("called");
75 WindowVisibilityObserver::GetInstance().OnProcessDied(pid);
76 }
77
OnExtensionServiceDied()78 void MemMgrEventCenter::OnExtensionServiceDied()
79 {
80 HILOGD("called");
81 extConnObserver_ = nullptr;
82 }
83
RegisterEventObserver()84 bool MemMgrEventCenter::RegisterEventObserver()
85 {
86 HILOGI("called");
87 if (!memoryPressureObserver_) {
88 RegisterMemoryPressureObserver();
89 }
90
91 #ifdef USE_PURGEABLE_MEMORY
92 if (!kswapdObserver_) {
93 RegisterKswapdObserver();
94 }
95 #endif
96
97 if (!appStateObserver_) {
98 RegisterAppStateObserver();
99 }
100
101 if (!extConnObserver_) {
102 RegisterExtConnObserver();
103 }
104
105 if (!accountObserver_) {
106 RegisterAccountObserver();
107 }
108
109 if (!commonEventObserver_) {
110 RegisterCommonEventObserver();
111 }
112
113 #ifdef CONFIG_BGTASK_MGR
114 if (!bgTaskObserver_) {
115 RegisterBgTaskObserver();
116 }
117 #endif
118 return true;
119 }
120
HandlerRegisterEvent(int64_t registerEventId)121 void MemMgrEventCenter::HandlerRegisterEvent(int64_t registerEventId)
122 {
123 if (registerEventId == RegisterEvent::REG_ALLOBS_EVENT) {
124 std::function<void()> RegisterEventObserverFunc =
125 std::bind(&MemMgrEventCenter::RegisterEventObserver, this);
126 regObsHandler_->PostImmediateTask(RegisterEventObserverFunc);
127 } else if (registerEventId == RegisterEvent::REG_MEMPRESSOBS_EVENT) {
128 std::function<void()> RegisterMemoryPressureObserverFunc =
129 std::bind(&MemMgrEventCenter::RegisterMemoryPressureObserver, this);
130 regObsHandler_->PostImmediateTask(RegisterMemoryPressureObserverFunc);
131 } else if (registerEventId == RegisterEvent::REG_APPOBS_EVENT) {
132 std::function<void()> RegisterAppStateObserverFunc =
133 std::bind(&MemMgrEventCenter::RegisterAppStateObserver, this);
134 regObsHandler_->PostImmediateTask(RegisterAppStateObserverFunc);
135 } else if (registerEventId == RegisterEvent::REG_EXTOBS_EVENT) {
136 std::function<void()> RegisterExtConnObserverFunc =
137 std::bind(&MemMgrEventCenter::RegisterExtConnObserver, this);
138 regObsHandler_->PostImmediateTask(RegisterExtConnObserverFunc);
139 } else if (registerEventId == RegisterEvent::REG_ACCOUNTOBS_EVENT) {
140 std::function<void()> RegisterAccountObserverFunc =
141 std::bind(&MemMgrEventCenter::RegisterAccountObserver, this);
142 regObsHandler_->PostImmediateTask(RegisterAccountObserverFunc);
143 } else if (registerEventId == RegisterEvent::REG_COMMONOBS_EVENT) {
144 std::function<void()> RegisterCommonEventObserverFunc =
145 std::bind(&MemMgrEventCenter::RegisterCommonEventObserver, this);
146 regObsHandler_->PostImmediateTask(RegisterCommonEventObserverFunc);
147 } else if (registerEventId == RegisterEvent::REG_BGTASKOBS_EVENT) {
148 #ifdef CONFIG_BGTASK_MGR
149 {
150 std::function<void()> RegisterBgTaskObserverFunc =
151 std::bind(&MemMgrEventCenter::RegisterBgTaskObserver, this);
152 regObsHandler_->PostImmediateTask(RegisterBgTaskObserverFunc);
153 }
154 #endif
155 }
156 return;
157 }
158
RegisterAppStateObserver()159 void MemMgrEventCenter::RegisterAppStateObserver()
160 {
161 HILOGI("called");
162 MAKE_POINTER(appMgrClient_, unique, AppExecFwk::AppMgrClient, "make appMgrClient failed",
163 return, /* no param */);
164 appStateObserver_ = new (std::nothrow) AppStateObserver();
165 while (appMgrClient_->ConnectAppMgrService() != AppExecFwk::AppMgrResultCode::RESULT_OK) {
166 HILOGE("ConnectAppMgrService fail, try again! retryTimes=%{public}d", ++regAppStatusObsRetry_);
167 }
168 auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
169 sptr<AppExecFwk::IAppMgr> appObject =
170 iface_cast<AppExecFwk::IAppMgr>(systemAbilityManager->GetSystemAbility(APP_MGR_SERVICE_ID));
171 if (appObject) {
172 int ret = appObject->RegisterApplicationStateObserver(appStateObserver_);
173 if (ret == ERR_OK) {
174 HILOGI("register success");
175 return;
176 }
177 HILOGE("register fail, ret = %{public}d", ret);
178 return;
179 }
180 HILOGE("get SystemAbilityManager fail");
181 }
182
RegisterExtConnObserver()183 void MemMgrEventCenter::RegisterExtConnObserver()
184 {
185 HILOGI("called");
186 MAKE_POINTER(extConnObserver_, shared, ExtensionConnectionObserver, "make ExtensionConnectionObserver failed",
187 /* no return */, /* no param */);
188 if (extConnObserver_ != nullptr) {
189 int32_t ret = AbilityRuntime::ConnectionObserverClient::GetInstance().RegisterObserver(extConnObserver_);
190 if (ret == ERR_OK) {
191 HILOGI("register success");
192 return;
193 }
194 HILOGE("register fail, ret = %{public}d", ret);
195 }
196 std::function<void()> RegisterExtConnObserverFunc = std::bind(&MemMgrEventCenter::RegisterExtConnObserver, this);
197 regObsHandler_->PostTask(RegisterExtConnObserverFunc, EXTCONN_RETRY_TIME, AppExecFwk::EventQueue::Priority::LOW);
198 }
199
RegisterBgTaskObserver()200 void MemMgrEventCenter::RegisterBgTaskObserver()
201 {
202 HILOGI("called");
203 #ifdef CONFIG_BGTASK_MGR
204 if (!bgTaskObserver_) {
205 MAKE_POINTER(bgTaskObserver_, shared, BgTaskObserver, "make BgTaskObserver failed",
206 return, /* no param */);
207 }
208 ErrCode ret = BackgroundTaskMgr::BackgroundTaskMgrHelper::SubscribeBackgroundTask(*bgTaskObserver_);
209 if (ret == ERR_OK) {
210 HILOGI("register success");
211 return;
212 }
213 HILOGE("register fail, ret = %{public}d", ret);
214 #else
215 HILOGI("BackgroundTaskMgr is not enable.");
216 #endif
217 }
218
RegisterCommonEventObserver()219 void MemMgrEventCenter::RegisterCommonEventObserver()
220 {
221 HILOGI("called");
222 EventFwk::MatchingSkills matchingSkills;
223 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED);
224 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED);
225 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
226 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
227 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
228 EventFwk::CommonEventSubscribeInfo commonEventSubscribeInfo(matchingSkills);
229 MAKE_POINTER(commonEventObserver_, shared, CommonEventObserver, "make unique failed",
230 return, commonEventSubscribeInfo);
231 if (EventFwk::CommonEventManager::SubscribeCommonEvent(commonEventObserver_)) {
232 HILOGI("register success");
233 return;
234 }
235 HILOGI("register fail");
236 }
237
RegisterAccountObserver()238 void MemMgrEventCenter::RegisterAccountObserver()
239 {
240 HILOGI("called");
241 regAccountObsRetry_++;
242 AccountSA::OsAccountSubscribeInfo osAccountSubscribeInfo;
243 osAccountSubscribeInfo.SetOsAccountSubscribeType(AccountSA::OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVED);
244 osAccountSubscribeInfo.SetName("MemMgrAccountActivedSubscriber");
245 MAKE_POINTER(accountObserver_, shared, AccountObserver, "make unique failed", return, osAccountSubscribeInfo);
246 ErrCode errCode = AccountSA::OsAccountManager::SubscribeOsAccount(accountObserver_);
247 if (errCode == ERR_OK) {
248 HILOGI("register success");
249 return;
250 }
251
252 if (regAccountObsRetry_ < ACCOUNT_MAX_RETRY_TIMES) {
253 std::function<void()> RegisterAccountObserverFunc =
254 std::bind(&MemMgrEventCenter::RegisterAccountObserver, this);
255 HILOGE("register fail, retCode = %{public}d, try again after 3s!, retryTimes=%{public}d/10",
256 errCode, regAccountObsRetry_);
257 regObsHandler_->PostTask(RegisterAccountObserverFunc, ACCOUNT_RETRY_DELAY,
258 AppExecFwk::EventQueue::Priority::LOW); // 3000 means 3s
259 }
260 }
261
RegisterMemoryPressureObserver()262 void MemMgrEventCenter::RegisterMemoryPressureObserver()
263 {
264 HILOGI("called");
265 MAKE_POINTER(memoryPressureObserver_, shared, MemoryPressureObserver, "make MemoryPressureObserver failed", return,
266 /* no param */);
267 std::function<void()> initFunc = std::bind(&MemoryPressureObserver::Init, memoryPressureObserver_);
268 regObsHandler_->PostTask(initFunc, 10000, AppExecFwk::EventQueue::Priority::HIGH); // 10000 means 10s
269 }
270
RegisterKswapdObserver()271 void MemMgrEventCenter::RegisterKswapdObserver()
272 {
273 HILOGI("called");
274 MAKE_POINTER(kswapdObserver_, shared, KswapdObserver, "make KswapdObserver failed", return, /* no param */);
275 std::function<void()> initFunc = std::bind(&KswapdObserver::Init, kswapdObserver_);
276 regObsHandler_->PostTask(initFunc, 10000, AppExecFwk::EventQueue::Priority::HIGH); // 10000 means 10s
277 }
278
~MemMgrEventCenter()279 MemMgrEventCenter::~MemMgrEventCenter()
280 {
281 HILOGI("called");
282 UnregisterEventObserver();
283 }
284
UnregisterEventObserver()285 void MemMgrEventCenter::UnregisterEventObserver()
286 {
287 #ifdef CONFIG_BGTASK_MGR
288 if (bgTaskObserver_) {
289 BackgroundTaskMgr::BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*bgTaskObserver_);
290 }
291 #endif
292 if (accountObserver_) {
293 AccountSA::OsAccountManager::UnsubscribeOsAccount(accountObserver_);
294 }
295 if (commonEventObserver_) {
296 EventFwk::CommonEventManager::UnSubscribeCommonEvent(commonEventObserver_);
297 }
298 if (appStateObserver_) {
299 delete appStateObserver_;
300 appStateObserver_ = nullptr;
301 }
302 appMgrClient_ = nullptr;
303 regObsHandler_ = nullptr;
304 extConnObserver_ = nullptr;
305 accountObserver_ = nullptr;
306 }
307
Dump(int fd)308 void MemMgrEventCenter::Dump(int fd)
309 {
310 dprintf(fd, "state list of all observer\n");
311 dprintf(fd, " name state \n");
312 dprintf(fd, "%30s %8s\n", "MemoryPressureObserver", memoryPressureObserver_ == nullptr ? "N" : "Y");
313 dprintf(fd, "-----------------------------------------------------------------\n");
314 dprintf(fd, "%30s %8s\n", "KswapdObserver", kswapdObserver_ == nullptr ? "N" : "Y");
315 dprintf(fd, "-----------------------------------------------------------------\n");
316 dprintf(fd, "%30s %8s\n", "AppStateObserver", appStateObserver_ == nullptr ? "N" : "Y");
317 dprintf(fd, "-----------------------------------------------------------------\n");
318 dprintf(fd, "%30s %8s\n", "ExtConnObserver", extConnObserver_ == nullptr ? "N" : "Y");
319 dprintf(fd, "-----------------------------------------------------------------\n");
320 #ifdef CONFIG_BGTASK_MGR
321 dprintf(fd, "%30s %8s\n", "BgTaskObserver", bgTaskObserver_ == nullptr ? "N" : "Y");
322 dprintf(fd, "-----------------------------------------------------------------\n");
323 #endif
324 dprintf(fd, "%30s %8s\n", "AccountObserver", accountObserver_ == nullptr ? "N" : "Y");
325 dprintf(fd, "-----------------------------------------------------------------\n");
326 dprintf(fd, "%30s %8s\n", "CommonEventObserver", commonEventObserver_ == nullptr ? "N" : "Y");
327 dprintf(fd, "-----------------------------------------------------------------\n");
328 }
329
RetryRegisterEventObserver(int32_t systemAbilityId)330 void MemMgrEventCenter::RetryRegisterEventObserver(int32_t systemAbilityId)
331 {
332 #ifdef CONFIG_BGTASK_MGR
333 if (systemAbilityId == BACKGROUND_TASK_MANAGER_SERVICE_ID) {
334 HandlerRegisterEvent(RegisterEvent::REG_BGTASKOBS_EVENT);
335 }
336 #endif
337 if (systemAbilityId == ABILITY_MGR_SERVICE_ID || systemAbilityId == APP_MGR_SERVICE_ID) {
338 HandlerRegisterEvent(RegisterEvent::REG_APPOBS_EVENT);
339 }
340
341 if (systemAbilityId == SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN) {
342 HandlerRegisterEvent(RegisterEvent::REG_ACCOUNTOBS_EVENT);
343 }
344
345 if (systemAbilityId == COMMON_EVENT_SERVICE_ID || systemAbilityId == COMMON_EVENT_SERVICE_ABILITY_ID) {
346 HandlerRegisterEvent(RegisterEvent::REG_COMMONOBS_EVENT);
347 }
348 HandlerRegisterEvent(RegisterEvent::REG_ALLOBS_EVENT);
349 }
350
351 } // namespace Memory
352 } // namespace OHOS
353