1 /*
2 * Copyright (c) 2024-2025 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 "sub_managers_helper.h"
17
18 #include <dlfcn.h>
19
20 #include "ability_cache_manager.h"
21 #include "hilog_tag_wrapper.h"
22 #include "hitrace_meter.h"
23 #include "scene_board_judgement.h"
24 #include "os_account_manager_wrapper.h"
25
26 namespace OHOS {
27 namespace AAFwk {
28 constexpr int32_t INVALID_USER_ID = -1;
29
SubManagersHelper(std::shared_ptr<TaskHandlerWrap> taskHandler,std::shared_ptr<AbilityEventHandler> eventHandler)30 SubManagersHelper::SubManagersHelper(
31 std::shared_ptr<TaskHandlerWrap> taskHandler, std::shared_ptr<AbilityEventHandler> eventHandler)
32 : taskHandler_(taskHandler), eventHandler_(eventHandler) {}
33
~SubManagersHelper()34 SubManagersHelper::~SubManagersHelper()
35 {
36 if (missionLibHandle_ != nullptr) {
37 missionListWrap_ = nullptr;
38 dlclose(missionLibHandle_);
39 missionLibHandle_ = nullptr;
40 }
41 }
42
InitSubManagers(int userId,bool switchUser)43 void SubManagersHelper::InitSubManagers(int userId, bool switchUser)
44 {
45 if (userId == U1_USER_ID) {
46 InitConnectManager(userId, false);
47 TAG_LOGI(AAFwkTag::ABILITYMGR, "Init U1");
48 return;
49 }
50 InitConnectManager(userId, switchUser);
51 InitDataAbilityManager(userId, switchUser);
52 InitPendWantManager(userId, switchUser);
53 if (userId != U0_USER_ID) {
54 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
55 InitUIAbilityManager(userId, switchUser);
56 } else {
57 InitMissionListManager(userId, switchUser);
58 }
59 }
60 }
61
InitConnectManager(int32_t userId,bool switchUser)62 void SubManagersHelper::InitConnectManager(int32_t userId, bool switchUser)
63 {
64 std::lock_guard<ffrt::mutex> lock(managersMutex_);
65 auto it = connectManagers_.find(userId);
66 if (it != connectManagers_.end()) {
67 if (switchUser) {
68 currentConnectManager_ = it->second;
69 }
70 return;
71 }
72 auto manager = std::make_shared<AbilityConnectManager>(userId);
73 manager->SetTaskHandler(taskHandler_);
74 manager->SetEventHandler(eventHandler_);
75 connectManagers_.emplace(userId, manager);
76 if (switchUser) {
77 currentConnectManager_ = manager;
78 }
79 }
80
InitDataAbilityManager(int32_t userId,bool switchUser)81 void SubManagersHelper::InitDataAbilityManager(int32_t userId, bool switchUser)
82 {
83 std::lock_guard<ffrt::mutex> lock(managersMutex_);
84 auto it = dataAbilityManagers_.find(userId);
85 if (it != dataAbilityManagers_.end()) {
86 if (switchUser) {
87 currentDataAbilityManager_ = it->second;
88 }
89 return;
90 }
91 auto manager = std::make_shared<DataAbilityManager>();
92 dataAbilityManagers_.emplace(userId, manager);
93 if (switchUser) {
94 currentDataAbilityManager_ = manager;
95 }
96 }
97
InitPendWantManager(int32_t userId,bool switchUser)98 void SubManagersHelper::InitPendWantManager(int32_t userId, bool switchUser)
99 {
100 std::lock_guard<ffrt::mutex> lock(managersMutex_);
101 auto it = pendingWantManagers_.find(userId);
102 if (it != pendingWantManagers_.end()) {
103 if (switchUser) {
104 currentPendingWantManager_ = it->second;
105 }
106 return;
107 }
108 auto manager = std::make_shared<PendingWantManager>();
109 pendingWantManagers_.emplace(userId, manager);
110 if (switchUser) {
111 currentPendingWantManager_ = manager;
112 }
113 }
114
InitMissionListManager(int userId,bool switchUser)115 void SubManagersHelper::InitMissionListManager(int userId, bool switchUser)
116 {
117 std::lock_guard<ffrt::mutex> lock(managersMutex_);
118 auto it = missionListManagers_.find(userId);
119 if (it != missionListManagers_.end()) {
120 if (switchUser) {
121 auto missionListWrap = GetMissionListWrap();
122 if (missionListWrap) {
123 missionListWrap->InitMissionInfoMgr(userId);
124 }
125 currentMissionListManager_ = it->second;
126 }
127 return;
128 }
129 auto manager = CreateMissionListMgr(userId);
130 if (manager == nullptr) {
131 TAG_LOGE(AAFwkTag::ABILITYMGR, "manager empty");
132 return;
133 }
134 manager->Init();
135 missionListManagers_.emplace(userId, manager);
136 if (switchUser) {
137 currentMissionListManager_ = manager;
138 }
139 }
140
InitUIAbilityManager(int userId,bool switchUser)141 void SubManagersHelper::InitUIAbilityManager(int userId, bool switchUser)
142 {
143 std::lock_guard<ffrt::mutex> lock(managersMutex_);
144 auto it = uiAbilityManagers_.find(userId);
145 if (it != uiAbilityManagers_.end()) {
146 if (switchUser) {
147 currentUIAbilityManager_ = it->second;
148 }
149 return;
150 }
151 auto manager = std::make_shared<UIAbilityLifecycleManager>(userId);
152 uiAbilityManagers_.emplace(userId, manager);
153 if (switchUser) {
154 currentUIAbilityManager_ = manager;
155 }
156 }
157
ClearSubManagers(int userId)158 void SubManagersHelper::ClearSubManagers(int userId)
159 {
160 std::lock_guard<ffrt::mutex> lock(managersMutex_);
161 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
162 uiAbilityManagers_.erase(userId);
163 } else {
164 missionListManagers_.erase(userId);
165 }
166 connectManagers_.erase(userId);
167 dataAbilityManagers_.erase(userId);
168 pendingWantManagers_.erase(userId);
169 }
170
GetCurrentDataAbilityManager()171 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetCurrentDataAbilityManager()
172 {
173 std::lock_guard<ffrt::mutex> lock(managersMutex_);
174 return currentDataAbilityManager_;
175 }
176
GetDataAbilityManager(const sptr<IAbilityScheduler> & scheduler)177 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManager(const sptr<IAbilityScheduler> &scheduler)
178 {
179 if (scheduler == nullptr) {
180 TAG_LOGE(AAFwkTag::ABILITYMGR, "null scheduler");
181 return nullptr;
182 }
183
184 std::lock_guard<ffrt::mutex> lock(managersMutex_);
185 for (auto& item: dataAbilityManagers_) {
186 if (item.second && item.second->ContainsDataAbility(scheduler)) {
187 return item.second;
188 }
189 }
190
191 return nullptr;
192 }
193
GetDataAbilityManagers()194 std::unordered_map<int, std::shared_ptr<DataAbilityManager>> SubManagersHelper::GetDataAbilityManagers()
195 {
196 std::lock_guard<ffrt::mutex> lock(managersMutex_);
197 return dataAbilityManagers_;
198 }
199
GetDataAbilityManagerByUserId(int32_t userId)200 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManagerByUserId(int32_t userId)
201 {
202 std::lock_guard<ffrt::mutex> lock(managersMutex_);
203 auto it = dataAbilityManagers_.find(userId);
204 if (it != dataAbilityManagers_.end()) {
205 return it->second;
206 }
207 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed. UserId: %{public}d", userId);
208 return nullptr;
209 }
210
GetDataAbilityManagerByToken(const sptr<IRemoteObject> & token)211 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManagerByToken(const sptr<IRemoteObject> &token)
212 {
213 std::lock_guard<ffrt::mutex> lock(managersMutex_);
214 for (auto& item: dataAbilityManagers_) {
215 if (item.second && item.second->GetAbilityRecordByToken(token)) {
216 return item.second;
217 }
218 }
219
220 return nullptr;
221 }
222
GetConnectManagers()223 std::unordered_map<int, std::shared_ptr<AbilityConnectManager>> SubManagersHelper::GetConnectManagers()
224 {
225 std::lock_guard<ffrt::mutex> lock(managersMutex_);
226 return connectManagers_;
227 }
228
GetCurrentConnectManager()229 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetCurrentConnectManager()
230 {
231 std::lock_guard<ffrt::mutex> lock(managersMutex_);
232 return currentConnectManager_;
233 }
234
GetConnectManagerByUserId(int32_t userId)235 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByUserId(int32_t userId)
236 {
237 std::lock_guard<ffrt::mutex> lock(managersMutex_);
238 auto it = connectManagers_.find(userId);
239 if (it != connectManagers_.end()) {
240 return it->second;
241 }
242 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed. UserId: %{public}d", userId);
243 return nullptr;
244 }
245
GetConnectManagerByToken(const sptr<IRemoteObject> & token)246 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByToken(const sptr<IRemoteObject> &token)
247 {
248 std::lock_guard<ffrt::mutex> lock(managersMutex_);
249 for (auto& item: connectManagers_) {
250 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
251 return item.second;
252 }
253 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
254 return item.second;
255 }
256 }
257 auto abilityRecord = AbilityCacheManager::GetInstance().FindRecordByToken(token);
258 if (abilityRecord == nullptr) {
259 return nullptr;
260 }
261 auto iter = connectManagers_.find(abilityRecord->GetOwnerMissionUserId());
262 if (iter == connectManagers_.end()) {
263 return nullptr;
264 }
265 return iter->second;
266 }
267
GetConnectManagerByAbilityRecordId(const int64_t & abilityRecordId)268 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByAbilityRecordId(
269 const int64_t &abilityRecordId)
270 {
271 std::lock_guard<ffrt::mutex> lock(managersMutex_);
272 for (auto& item: connectManagers_) {
273 if (item.second == nullptr) {
274 continue;
275 }
276 if (item.second->GetExtensionByIdFromServiceMap(abilityRecordId)) {
277 return item.second;
278 }
279 if (item.second->GetExtensionByIdFromTerminatingMap(abilityRecordId)) {
280 return item.second;
281 }
282 }
283
284 return nullptr;
285 }
286
GetCurrentPendingWantManager()287 std::shared_ptr<PendingWantManager> SubManagersHelper::GetCurrentPendingWantManager()
288 {
289 std::lock_guard<ffrt::mutex> lock(managersMutex_);
290 return currentPendingWantManager_;
291 }
292
GetPendingWantManagerByUserId(int32_t userId)293 std::shared_ptr<PendingWantManager> SubManagersHelper::GetPendingWantManagerByUserId(int32_t userId)
294 {
295 std::lock_guard<ffrt::mutex> lock(managersMutex_);
296 auto it = pendingWantManagers_.find(userId);
297 if (it != pendingWantManagers_.end()) {
298 return it->second;
299 }
300 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed.UserId: %{public}d", userId);
301 return nullptr;
302 }
303
GetMissionListManagers()304 std::unordered_map<int, std::shared_ptr<MissionListManagerInterface>> SubManagersHelper::GetMissionListManagers()
305 {
306 std::lock_guard<ffrt::mutex> lock(managersMutex_);
307 return missionListManagers_;
308 }
309
GetCurrentMissionListManager()310 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetCurrentMissionListManager()
311 {
312 std::lock_guard<ffrt::mutex> lock(managersMutex_);
313 return currentMissionListManager_;
314 }
315
GetMissionListManagerByUserId(int32_t userId)316 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetMissionListManagerByUserId(int32_t userId)
317 {
318 std::lock_guard<ffrt::mutex> lock(managersMutex_);
319 auto it = missionListManagers_.find(userId);
320 if (it != missionListManagers_.end()) {
321 return it->second;
322 }
323 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed UserId: %{public}d", userId);
324 return nullptr;
325 }
326
GetMissionListManagerByUid(int32_t uid)327 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetMissionListManagerByUid(int32_t uid)
328 {
329 int32_t userId = INVALID_USER_ID;
330 int32_t getOsAccountRet =
331 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId);
332 if (getOsAccountRet != 0) {
333 TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOsAccountLocalIdFromUid() failed. ret: %{public}d", getOsAccountRet);
334 return nullptr;
335 }
336 TAG_LOGD(AAFwkTag::ABILITYMGR, "userId: %{public}d", userId);
337 if (userId == U0_USER_ID) {
338 std::lock_guard<ffrt::mutex> lock(managersMutex_);
339 return currentMissionListManager_;
340 }
341 return GetMissionListManagerByUserId(userId);
342 }
343
GetUIAbilityManagers()344 std::unordered_map<int, std::shared_ptr<UIAbilityLifecycleManager>> SubManagersHelper::GetUIAbilityManagers()
345 {
346 std::lock_guard<ffrt::mutex> lock(managersMutex_);
347 return uiAbilityManagers_;
348 }
349
GetCurrentUIAbilityManager()350 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetCurrentUIAbilityManager()
351 {
352 std::lock_guard<ffrt::mutex> lock(managersMutex_);
353 return currentUIAbilityManager_;
354 }
355
GetUIAbilityManagerByUserId(int32_t userId)356 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetUIAbilityManagerByUserId(int32_t userId)
357 {
358 std::lock_guard<ffrt::mutex> lock(managersMutex_);
359 auto it = uiAbilityManagers_.find(userId);
360 if (it != uiAbilityManagers_.end()) {
361 return it->second;
362 }
363 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail UserId: %{public}d", userId);
364 return nullptr;
365 }
366
GetUIAbilityManagerByUid(int32_t uid)367 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetUIAbilityManagerByUid(int32_t uid)
368 {
369 int32_t userId = INVALID_USER_ID;
370 int32_t getOsAccountRet =
371 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId);
372 if (getOsAccountRet != 0) {
373 TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOsAccountLocalIdFromUid() failed. ret: %{public}d", getOsAccountRet);
374 return nullptr;
375 }
376 TAG_LOGD(AAFwkTag::ABILITYMGR, "userId: %{public}d", userId);
377 if (userId == U0_USER_ID) {
378 std::lock_guard<ffrt::mutex> lock(managersMutex_);
379 return currentUIAbilityManager_;
380 }
381 return GetUIAbilityManagerByUserId(userId);
382 }
383
UninstallApp(const std::string & bundleName,int32_t uid)384 void SubManagersHelper::UninstallApp(const std::string &bundleName, int32_t uid)
385 {
386 int32_t userId = INVALID_USER_ID;
387 int32_t getOsAccountRet =
388 DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId);
389 if (getOsAccountRet != 0) {
390 TAG_LOGE(AAFwkTag::ABILITYMGR, "GetOsAccountLocalIdFromUid() failed. ret: %{public}d", getOsAccountRet);
391 return;
392 }
393 TAG_LOGD(AAFwkTag::ABILITYMGR, "userId: %{public}d", userId);
394 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
395 UninstallAppInUIAbilityManagers(userId, bundleName, uid);
396 } else {
397 UninstallAppInMissionListManagers(userId, bundleName, uid);
398 }
399
400 auto currentPendingWantManager = GetCurrentPendingWantManager();
401 if (currentPendingWantManager) {
402 currentPendingWantManager->ClearPendingWantRecord(bundleName, uid);
403 }
404 }
405
UninstallAppInUIAbilityManagers(int32_t userId,const std::string & bundleName,int32_t uid)406 void SubManagersHelper::UninstallAppInUIAbilityManagers(int32_t userId, const std::string &bundleName, int32_t uid)
407 {
408 if (userId == U0_USER_ID) {
409 auto uiAbilityManagers = GetUIAbilityManagers();
410 for (auto& item : uiAbilityManagers) {
411 if (item.second) {
412 item.second->UninstallApp(bundleName, uid);
413 }
414 }
415 } else {
416 auto manager = GetUIAbilityManagerByUserId(userId);
417 if (manager) {
418 manager->UninstallApp(bundleName, uid);
419 }
420 }
421 }
422
UninstallAppInMissionListManagers(int32_t userId,const std::string & bundleName,int32_t uid)423 void SubManagersHelper::UninstallAppInMissionListManagers(int32_t userId, const std::string &bundleName, int32_t uid)
424 {
425 if (userId == U0_USER_ID) {
426 auto missionListManagers = GetMissionListManagers();
427 for (auto& item : missionListManagers) {
428 if (item.second) {
429 item.second->UninstallApp(bundleName, uid);
430 }
431 }
432 } else {
433 auto listManager = GetMissionListManagerByUserId(userId);
434 if (listManager) {
435 listManager->UninstallApp(bundleName, uid);
436 }
437 }
438 }
439
VerificationAllTokenForConnectManagers(const sptr<IRemoteObject> & token)440 bool SubManagersHelper::VerificationAllTokenForConnectManagers(const sptr<IRemoteObject> &token)
441 {
442 auto connectManagers = GetConnectManagers();
443 for (auto& item: connectManagers) {
444 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
445 return true;
446 }
447 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
448 return true;
449 }
450 }
451 if (AbilityCacheManager::GetInstance().FindRecordByToken(token)) {
452 return true;
453 }
454 return false;
455 }
456
VerificationAllToken(const sptr<IRemoteObject> & token)457 bool SubManagersHelper::VerificationAllToken(const sptr<IRemoteObject> &token)
458 {
459 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
460 TAG_LOGD(AAFwkTag::ABILITYMGR, "VerificationAllToken.");
461 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
462 auto uiAbilityManagers = GetUIAbilityManagers();
463 for (auto& item: uiAbilityManagers) {
464 if (item.second && item.second->IsContainsAbility(token)) {
465 return true;
466 }
467 }
468 } else {
469 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchMissionListManagers");
470 auto missionListManagers = GetMissionListManagers();
471 for (auto& item: missionListManagers) {
472 if (item.second && item.second->GetAbilityRecordByToken(token)) {
473 return true;
474 }
475 if (item.second && item.second->GetAbilityFromTerminateList(token)) {
476 return true;
477 }
478 }
479 }
480 {
481 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchDataAbilityManagers_");
482 auto dataAbilityManagers = GetDataAbilityManagers();
483 for (auto& item: dataAbilityManagers) {
484 if (item.second && item.second->GetAbilityRecordByToken(token)) {
485 return true;
486 }
487 }
488 }
489 {
490 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchConnectManagers_");
491 if (VerificationAllTokenForConnectManagers(token)) {
492 return true;
493 }
494 }
495 TAG_LOGE(AAFwkTag::ABILITYMGR, "fail");
496 return false;
497 }
498
GetMissionListWrap()499 std::shared_ptr<MissionListWrap> SubManagersHelper::GetMissionListWrap()
500 {
501 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
502 return nullptr;
503 }
504
505 std::lock_guard lock(missionListWrapMutex_);
506 if (missionListWrap_) {
507 return missionListWrap_;
508 }
509
510 if (missionLibHandle_ == nullptr) {
511 missionLibHandle_ = dlopen("libmission_list.z.so", RTLD_NOW | RTLD_GLOBAL);
512 if (missionLibHandle_ == nullptr) {
513 TAG_LOGE(AAFwkTag::ABILITYMGR, "open mission_list library failed");
514 return nullptr;
515 }
516 }
517
518 auto createMissionListWrapFunc = reinterpret_cast<CreateMissionListMgrFunc>(dlsym(missionLibHandle_,
519 "CreateMissionListWrap"));
520 if (createMissionListWrapFunc == nullptr) {
521 TAG_LOGE(AAFwkTag::ABILITYMGR, "createFunc empty");
522 dlclose(missionLibHandle_);
523 missionLibHandle_ = nullptr;
524 return nullptr;
525 }
526
527 missionListWrap_ = std::shared_ptr<MissionListWrap>(createMissionListWrapFunc());
528 return missionListWrap_;
529 }
530
CreateMissionListMgr(int32_t userId)531 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::CreateMissionListMgr(int32_t userId)
532 {
533 auto missionListWrap = GetMissionListWrap();
534 if (missionListWrap != nullptr) {
535 return missionListWrap->CreateMissionListManager(userId);
536 }
537
538 return nullptr;
539 }
540 } // namespace AAFwk
541 } // namespace OHOS