• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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