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