1 /*
2 * Copyright (c) 2021-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 "ability_connect_manager.h"
17
18 #include <algorithm>
19 #include <mutex>
20
21 #include "ability_connect_callback_stub.h"
22 #include "ability_manager_errors.h"
23 #include "ability_manager_service.h"
24 #include "ability_util.h"
25 #include "appfreeze_manager.h"
26 #include "hitrace_meter.h"
27 #include "hilog_wrapper.h"
28 #include "in_process_call_wrapper.h"
29 #include "parameter.h"
30 #include "session/host/include/zidl/session_interface.h"
31 #include "ui_extension_utils.h"
32
33 namespace OHOS {
34 namespace AAFwk {
35 namespace {
36 constexpr char EVENT_KEY_UID[] = "UID";
37 constexpr char EVENT_KEY_PID[] = "PID";
38 constexpr char EVENT_KEY_MESSAGE[] = "MSG";
39 constexpr char EVENT_KEY_PACKAGE_NAME[] = "PACKAGE_NAME";
40 constexpr char EVENT_KEY_PROCESS_NAME[] = "PROCESS_NAME";
41 #ifdef SUPPORT_ASAN
42 const int LOAD_TIMEOUT_MULTIPLE = 150;
43 const int CONNECT_TIMEOUT_MULTIPLE = 45;
44 const int COMMAND_TIMEOUT_MULTIPLE = 75;
45 const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 75;
46 #else
47 const int LOAD_TIMEOUT_MULTIPLE = 10;
48 const int CONNECT_TIMEOUT_MULTIPLE = 3;
49 const int COMMAND_TIMEOUT_MULTIPLE = 5;
50 const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 5;
51 #endif
52 }
53
AbilityConnectManager(int userId)54 AbilityConnectManager::AbilityConnectManager(int userId) : userId_(userId)
55 {}
56
~AbilityConnectManager()57 AbilityConnectManager::~AbilityConnectManager()
58 {}
59
StartAbility(const AbilityRequest & abilityRequest)60 int AbilityConnectManager::StartAbility(const AbilityRequest &abilityRequest)
61 {
62 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
63 std::lock_guard guard(Lock_);
64 return StartAbilityLocked(abilityRequest);
65 }
66
TerminateAbility(const sptr<IRemoteObject> & token)67 int AbilityConnectManager::TerminateAbility(const sptr<IRemoteObject> &token)
68 {
69 std::lock_guard guard(Lock_);
70 return TerminateAbilityInner(token);
71 }
72
TerminateAbilityInner(const sptr<IRemoteObject> & token)73 int AbilityConnectManager::TerminateAbilityInner(const sptr<IRemoteObject> &token)
74 {
75 auto abilityRecord = GetExtensionFromServiceMapInner(token);
76 MoveToTerminatingMap(abilityRecord);
77 return TerminateAbilityLocked(token);
78 }
79
StopServiceAbility(const AbilityRequest & abilityRequest)80 int AbilityConnectManager::StopServiceAbility(const AbilityRequest &abilityRequest)
81 {
82 HILOG_INFO("call");
83 std::lock_guard guard(Lock_);
84 return StopServiceAbilityLocked(abilityRequest);
85 }
86
StartAbilityLocked(const AbilityRequest & abilityRequest)87 int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityRequest)
88 {
89 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
90 HILOG_INFO("ability_name:%{public}s", abilityRequest.want.GetElement().GetURI().c_str());
91
92 std::shared_ptr<AbilityRecord> targetService;
93 bool isLoadedAbility = false;
94 GetOrCreateServiceRecord(abilityRequest, false, targetService, isLoadedAbility);
95 CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
96
97 targetService->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
98
99 targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_EXTENSION);
100
101 if (UIExtensionUtils::IsUIExtension(targetService->GetAbilityInfo().extensionAbilityType)
102 && abilityRequest.sessionInfo && abilityRequest.sessionInfo->sessionToken) {
103 auto &remoteObj = abilityRequest.sessionInfo->sessionToken;
104 uiExtensionMap_.emplace(remoteObj, UIExtWindowMapValType(targetService, abilityRequest.sessionInfo));
105 AddUIExtWindowDeathRecipient(remoteObj);
106 }
107
108 if (!isLoadedAbility) {
109 LoadAbility(targetService);
110 } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
111 // It may have been started through connect
112 targetService->SetWant(abilityRequest.want);
113 CommandAbility(targetService);
114 } else if (UIExtensionUtils::IsUIExtension(targetService->GetAbilityInfo().extensionAbilityType)
115 && targetService->IsReady() && !targetService->IsAbilityState(AbilityState::INACTIVATING)) {
116 targetService->SetWant(abilityRequest.want);
117 CommandAbilityWindow(targetService, abilityRequest.sessionInfo, WIN_CMD_FOREGROUND);
118 } else {
119 HILOG_INFO("Target service is already activating.");
120 EnqueueStartServiceReq(abilityRequest);
121 return ERR_OK;
122 }
123
124 sptr<Token> token = targetService->GetToken();
125 sptr<Token> preToken = nullptr;
126 if (targetService->GetPreAbilityRecord()) {
127 preToken = targetService->GetPreAbilityRecord()->GetToken();
128 }
129 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
130 return ERR_OK;
131 }
132
EnqueueStartServiceReq(const AbilityRequest & abilityRequest)133 void AbilityConnectManager::EnqueueStartServiceReq(const AbilityRequest &abilityRequest)
134 {
135 std::lock_guard guard(startServiceReqListLock_);
136 auto abilityUri = abilityRequest.want.GetElement().GetURI();
137 auto reqListIt = startServiceReqList_.find(abilityUri);
138 if (reqListIt != startServiceReqList_.end()) {
139 reqListIt->second->push_back(abilityRequest);
140 } else {
141 auto reqList = std::make_shared<std::list<AbilityRequest>>();
142 reqList->push_back(abilityRequest);
143 startServiceReqList_.emplace(abilityUri, reqList);
144
145 CHECK_POINTER(taskHandler_);
146 auto callback = [abilityUri, connectManager = shared_from_this()]() {
147 std::lock_guard guard{connectManager->startServiceReqListLock_};
148 auto exist = connectManager->startServiceReqList_.erase(abilityUri);
149 if (exist) {
150 HILOG_ERROR("Target service %{public}s start timeout", abilityUri.c_str());
151 }
152 };
153
154 int connectTimeout =
155 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
156 taskHandler_->SubmitTask(callback, std::string("start_service_timeout:") + abilityUri,
157 connectTimeout);
158 }
159 }
160
TerminateAbilityLocked(const sptr<IRemoteObject> & token)161 int AbilityConnectManager::TerminateAbilityLocked(const sptr<IRemoteObject> &token)
162 {
163 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
164 HILOG_INFO("Terminate ability locked.");
165 auto abilityRecord = GetExtensionFromTerminatingMapInner(token);
166 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
167
168 if (abilityRecord->IsTerminating()) {
169 HILOG_INFO("Ability is on terminating.");
170 return ERR_OK;
171 }
172
173 if (!abilityRecord->GetConnectRecordList().empty()) {
174 HILOG_INFO("Target service has been connected. Post disconnect task.");
175 auto connectRecordList = abilityRecord->GetConnectRecordList();
176 HandleTerminateDisconnectTask(connectRecordList);
177 }
178
179 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
180 HILOG_WARN("Disconnect ability terminate timeout.");
181 connectManager->HandleStopTimeoutTask(abilityRecord);
182 };
183 abilityRecord->Terminate(timeoutTask);
184
185 return ERR_OK;
186 }
187
StopServiceAbilityLocked(const AbilityRequest & abilityRequest)188 int AbilityConnectManager::StopServiceAbilityLocked(const AbilityRequest &abilityRequest)
189 {
190 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
191 HILOG_INFO("call");
192 AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
193 abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
194 auto abilityRecord = GetServiceRecordByElementNameInner(element.GetURI());
195 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
196
197 if (abilityRecord->IsTerminating()) {
198 HILOG_INFO("Ability is on terminating.");
199 return ERR_OK;
200 }
201
202 if (!abilityRecord->GetConnectRecordList().empty()) {
203 HILOG_INFO("Post disconnect task.");
204 auto connectRecordList = abilityRecord->GetConnectRecordList();
205 HandleTerminateDisconnectTask(connectRecordList);
206 }
207
208 TerminateRecord(abilityRecord);
209 return ERR_OK;
210 }
211
GetOrCreateServiceRecord(const AbilityRequest & abilityRequest,const bool isCreatedByConnect,std::shared_ptr<AbilityRecord> & targetService,bool & isLoadedAbility)212 void AbilityConnectManager::GetOrCreateServiceRecord(const AbilityRequest &abilityRequest,
213 const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
214 {
215 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
216 AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
217 abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
218 auto serviceMapIter = serviceMap_.find(element.GetURI());
219 if (serviceMapIter == serviceMap_.end()) {
220 targetService = AbilityRecord::CreateAbilityRecord(abilityRequest);
221 if (targetService) {
222 targetService->SetOwnerMissionUserId(userId_);
223 }
224
225 if (isCreatedByConnect && targetService != nullptr) {
226 targetService->SetCreateByConnectMode();
227 }
228 if (targetService && abilityRequest.abilityInfo.name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
229 targetService->SetLauncherRoot();
230 targetService->SetKeepAlive();
231 targetService->SetRestartTime(abilityRequest.restartTime);
232 targetService->SetRestartCount(abilityRequest.restartCount);
233 } else if (IsAbilityNeedKeepAlive(targetService)) {
234 targetService->SetKeepAlive();
235 targetService->SetRestartTime(abilityRequest.restartTime);
236 targetService->SetRestartCount(abilityRequest.restartCount);
237 }
238 serviceMap_.emplace(element.GetURI(), targetService);
239 isLoadedAbility = false;
240 } else {
241 targetService = serviceMapIter->second;
242 isLoadedAbility = true;
243 }
244 }
245
GetConnectRecordListFromMap(const sptr<IAbilityConnection> & connect,std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)246 void AbilityConnectManager::GetConnectRecordListFromMap(
247 const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
248 {
249 auto connectMapIter = connectMap_.find(connect->AsObject());
250 if (connectMapIter != connectMap_.end()) {
251 connectRecordList = connectMapIter->second;
252 }
253 }
254
ConnectAbilityLocked(const AbilityRequest & abilityRequest,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken,sptr<SessionInfo> sessionInfo)255 int AbilityConnectManager::ConnectAbilityLocked(const AbilityRequest &abilityRequest,
256 const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken, sptr<SessionInfo> sessionInfo)
257 {
258 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
259 HILOG_INFO("callee:%{public}s.", abilityRequest.want.GetElement().GetURI().c_str());
260 std::lock_guard guard(Lock_);
261
262 // 1. get target service ability record, and check whether it has been loaded.
263 std::shared_ptr<AbilityRecord> targetService;
264 bool isLoadedAbility = false;
265 GetOrCreateServiceRecord(abilityRequest, true, targetService, isLoadedAbility);
266 CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
267 // 2. get target connectRecordList, and check whether this callback has been connected.
268 ConnectListType connectRecordList;
269 GetConnectRecordListFromMap(connect, connectRecordList);
270 bool isCallbackConnected = !connectRecordList.empty();
271 // 3. If this service ability and callback has been connected, There is no need to connect repeatedly
272 if (isLoadedAbility && (isCallbackConnected) && IsAbilityConnected(targetService, connectRecordList)) {
273 HILOG_INFO("Service and callback was connected.");
274 return ERR_OK;
275 }
276
277 // 4. Other cases , need to connect the service ability
278 auto connectRecord = ConnectionRecord::CreateConnectionRecord(callerToken, targetService, connect);
279 CHECK_POINTER_AND_RETURN(connectRecord, ERR_INVALID_VALUE);
280 connectRecord->AttachCallerInfo();
281 connectRecord->SetConnectState(ConnectionState::CONNECTING);
282 targetService->AddConnectRecordToList(connectRecord);
283 targetService->SetSessionInfo(sessionInfo);
284 connectRecordList.push_back(connectRecord);
285 if (isCallbackConnected) {
286 RemoveConnectDeathRecipient(connect);
287 connectMap_.erase(connectMap_.find(connect->AsObject()));
288 }
289 AddConnectDeathRecipient(connect);
290 connectMap_.emplace(connect->AsObject(), connectRecordList);
291 targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_CONNECT_EXTENSION);
292
293 if (UIExtensionUtils::IsWindowExtension(targetService->GetAbilityInfo().extensionAbilityType)
294 && abilityRequest.sessionInfo) {
295 windowExtensionMap_.emplace(connect->AsObject(),
296 WindowExtMapValType(targetService->GetApplicationInfo().accessTokenId, abilityRequest.sessionInfo));
297 }
298
299 // 5. load or connect ability
300 int ret = ERR_OK;
301 if (!isLoadedAbility) {
302 LoadAbility(targetService);
303 } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
304 // this service ability has connected already
305 targetService->SetWant(abilityRequest.want);
306 HandleActiveAbility(targetService, connectRecord);
307 } else {
308 HILOG_INFO("Target service is activating, wait for callback");
309 }
310
311 auto token = targetService->GetToken();
312 auto preToken = iface_cast<Token>(connectRecord->GetToken());
313 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
314 return ret;
315 }
316
HandleActiveAbility(std::shared_ptr<AbilityRecord> & targetService,std::shared_ptr<ConnectionRecord> & connectRecord)317 void AbilityConnectManager::HandleActiveAbility(std::shared_ptr<AbilityRecord> &targetService,
318 std::shared_ptr<ConnectionRecord> &connectRecord)
319 {
320 if (targetService == nullptr) {
321 HILOG_WARN("null target service.");
322 return;
323 }
324 if (targetService->GetConnectRecordList().size() > 1) {
325 if (taskHandler_ != nullptr && targetService->GetConnRemoteObject()) {
326 auto task = [connectRecord]() { connectRecord->CompleteConnect(ERR_OK); };
327 taskHandler_->SubmitTask(task);
328 } else {
329 HILOG_INFO("Target service is connecting, wait for callback");
330 }
331 } else {
332 ConnectAbility(targetService);
333 }
334 }
335
DisconnectAbilityLocked(const sptr<IAbilityConnection> & connect)336 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)
337 {
338 std::lock_guard guard(Lock_);
339 return DisconnectAbilityLocked(connect, false);
340 }
341
DisconnectAbilityLocked(const sptr<IAbilityConnection> & connect,bool force)342 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect, bool force)
343 {
344 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
345 HILOG_INFO("call");
346
347 // 1. check whether callback was connected.
348 ConnectListType connectRecordList;
349 GetConnectRecordListFromMap(connect, connectRecordList);
350 if (connectRecordList.empty()) {
351 HILOG_ERROR("Can't find the connect list from connect map by callback.");
352 return CONNECTION_NOT_EXIST;
353 }
354
355 // 2. schedule disconnect to target service
356 int result = ERR_OK;
357 ConnectListType list;
358 for (auto &connectRecord : connectRecordList) {
359 if (connectRecord) {
360 auto abilityRecord = connectRecord->GetAbilityRecord();
361 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
362 HILOG_INFO("abilityName: %{public}s, bundleName: %{public}s",
363 abilityRecord->GetAbilityInfo().name.c_str(), abilityRecord->GetAbilityInfo().bundleName.c_str());
364 if (connectRecord->GetCallerTokenId() != IPCSkeleton::GetCallingTokenID() &&
365 static_cast<uint32_t>(IPCSkeleton::GetSelfTokenID() != IPCSkeleton::GetCallingTokenID())) {
366 HILOG_WARN("The caller is inconsistent with the caller stored in the connectRecord.");
367 continue;
368 }
369
370 if (force) {
371 DisconnectRecordForce(list, connectRecord);
372 } else {
373 result = DisconnectRecordNormal(list, connectRecord);
374 }
375
376 if (result != ERR_OK) {
377 HILOG_ERROR("Disconnect ability fail , ret = %{public}d.", result);
378 break;
379 }
380 }
381 }
382 for (auto&& connectRecord : list) {
383 RemoveConnectionRecordFromMap(connectRecord);
384 }
385
386 return result;
387 }
388
TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)389 void AbilityConnectManager::TerminateRecord(std::shared_ptr<AbilityRecord> abilityRecord)
390 {
391 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
392 HILOG_WARN("Disconnect ability terminate timeout.");
393 connectManager->HandleStopTimeoutTask(abilityRecord);
394 };
395
396 MoveToTerminatingMap(abilityRecord);
397 abilityRecord->Terminate(timeoutTask);
398 }
399
DisconnectRecordNormal(ConnectListType & list,std::shared_ptr<ConnectionRecord> connectRecord) const400 int AbilityConnectManager::DisconnectRecordNormal(ConnectListType &list,
401 std::shared_ptr<ConnectionRecord> connectRecord) const
402 {
403 auto result = connectRecord->DisconnectAbility();
404 if (result != ERR_OK) {
405 HILOG_ERROR("Disconnect ability fail , ret = %{public}d.", result);
406 return result;
407 }
408
409 if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
410 HILOG_WARN("This record: %{public}d complete disconnect directly.", connectRecord->GetRecordId());
411 connectRecord->CompleteDisconnect(ERR_OK, false);
412 list.emplace_back(connectRecord);
413 }
414 return ERR_OK;
415 }
416
DisconnectRecordForce(ConnectListType & list,std::shared_ptr<ConnectionRecord> connectRecord)417 void AbilityConnectManager::DisconnectRecordForce(ConnectListType &list,
418 std::shared_ptr<ConnectionRecord> connectRecord)
419 {
420 auto abilityRecord = connectRecord->GetAbilityRecord();
421 if (abilityRecord == nullptr) {
422 HILOG_ERROR("Disconnect force abilityRecord null");
423 return;
424 }
425 abilityRecord->RemoveConnectRecordFromList(connectRecord);
426 connectRecord->CompleteDisconnect(ERR_OK, true);
427 list.emplace_back(connectRecord);
428 if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
429 HILOG_WARN("Force terminate ability record state: %{public}d.", abilityRecord->GetAbilityState());
430 TerminateRecord(abilityRecord);
431 }
432 }
433
AttachAbilityThreadLocked(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)434 int AbilityConnectManager::AttachAbilityThreadLocked(
435 const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
436 {
437 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
438 std::lock_guard guard(Lock_);
439 auto abilityRecord = GetExtensionFromServiceMapInner(token);
440 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
441 if (taskHandler_ != nullptr) {
442 int recordId = abilityRecord->GetRecordId();
443 std::string taskName = std::string("LoadTimeout_") + std::to_string(recordId);
444 taskHandler_->CancelTask(taskName);
445 }
446 if (eventHandler_) {
447 eventHandler_->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG,
448 abilityRecord->GetAbilityRecordId());
449 }
450 std::string element = abilityRecord->GetWant().GetElement().GetURI();
451 HILOG_DEBUG("Ability: %{public}s", element.c_str());
452 abilityRecord->SetScheduler(scheduler);
453 abilityRecord->Inactivate();
454
455 return ERR_OK;
456 }
457
OnAbilityRequestDone(const sptr<IRemoteObject> & token,const int32_t state)458 void AbilityConnectManager::OnAbilityRequestDone(const sptr<IRemoteObject> &token, const int32_t state)
459 {
460 HILOG_DEBUG("state: %{public}d", state);
461 std::lock_guard guard(Lock_);
462 AppAbilityState abilityState = DelayedSingleton<AppScheduler>::GetInstance()->ConvertToAppAbilityState(state);
463 if (abilityState == AppAbilityState::ABILITY_STATE_FOREGROUND) {
464 auto abilityRecord = GetExtensionFromServiceMapInner(token);
465 CHECK_POINTER(abilityRecord);
466 if (!UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
467 HILOG_ERROR("Not ui extension.");
468 return;
469 }
470 if (abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
471 HILOG_WARN("abilityRecord is foregrounding.");
472 return;
473 }
474 std::string element = abilityRecord->GetWant().GetElement().GetURI();
475 HILOG_DEBUG("Ability is %{public}s, start to foreground.", element.c_str());
476 MoveToForeground(abilityRecord);
477 }
478 }
479
OnAppStateChanged(const AppInfo & info)480 void AbilityConnectManager::OnAppStateChanged(const AppInfo &info)
481 {
482 std::lock_guard guard(Lock_);
483 std::for_each(serviceMap_.begin(), serviceMap_.end(), [&info](ServiceMapType::reference service) {
484 if (service.second && (info.processName == service.second->GetAbilityInfo().process ||
485 info.processName == service.second->GetApplicationInfo().bundleName)) {
486 auto appName = service.second->GetApplicationInfo().name;
487 auto uid = service.second->GetAbilityInfo().applicationInfo.uid;
488 auto isExist = [&appName, &uid](
489 const AppData &appData) { return appData.appName == appName && appData.uid == uid; };
490 auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
491 if (iter != info.appData.end()) {
492 service.second->SetAppState(info.state);
493 }
494 }
495 });
496 }
497
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state)498 int AbilityConnectManager::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)
499 {
500 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
501 std::lock_guard guard(Lock_);
502 int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
503 std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
504 std::shared_ptr<AbilityRecord> abilityRecord;
505 if (targetState == AbilityState::INACTIVE
506 || targetState == AbilityState::FOREGROUND
507 || targetState == AbilityState::BACKGROUND) {
508 abilityRecord = GetExtensionFromServiceMapInner(token);
509 } else if (targetState == AbilityState::INITIAL) {
510 abilityRecord = GetExtensionFromTerminatingMapInner(token);
511 } else {
512 abilityRecord = nullptr;
513 }
514 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
515 std::string element = abilityRecord->GetWant().GetElement().GetURI();
516 HILOG_DEBUG("Ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
517
518 switch (targetState) {
519 case AbilityState::INACTIVE: {
520 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
521 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
522 token, AppExecFwk::AbilityState::ABILITY_STATE_CREATE);
523 } else {
524 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
525 token, AppExecFwk::ExtensionState::EXTENSION_STATE_CREATE);
526 auto preloadTask = [owner = weak_from_this(), abilityRecord] {
527 auto acm = owner.lock();
528 if (acm == nullptr) {
529 HILOG_ERROR("AbilityConnectManager is nullptr.");
530 return;
531 }
532 acm->ProcessPreload(abilityRecord);
533 };
534 if (taskHandler_ != nullptr) {
535 taskHandler_->SubmitTask(preloadTask);
536 }
537 }
538 return DispatchInactive(abilityRecord, state);
539 }
540 case AbilityState::FOREGROUND: {
541 return DispatchForeground(abilityRecord);
542 }
543 case AbilityState::BACKGROUND: {
544 return DispatchBackground(abilityRecord);
545 }
546 case AbilityState::INITIAL: {
547 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
548 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
549 token, AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED);
550 } else {
551 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
552 token, AppExecFwk::ExtensionState::EXTENSION_STATE_TERMINATED);
553 }
554 return DispatchTerminate(abilityRecord);
555 }
556 default: {
557 HILOG_WARN("Don't support transiting state: %{public}d", state);
558 return ERR_INVALID_VALUE;
559 }
560 }
561 }
562
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const563 void AbilityConnectManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
564 {
565 auto bms = AbilityUtil::GetBundleManager();
566 CHECK_POINTER(bms);
567 auto abilityInfo = record->GetAbilityInfo();
568 Want want;
569 want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
570 auto uid = record->GetUid();
571 want.SetParam("uid", uid);
572 bms->ProcessPreload(want);
573 }
574
ScheduleConnectAbilityDoneLocked(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)575 int AbilityConnectManager::ScheduleConnectAbilityDoneLocked(
576 const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
577 {
578 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
579 std::lock_guard guard(Lock_);
580 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
581
582 auto abilityRecord = Token::GetAbilityRecordByToken(token);
583 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
584
585 std::string element = abilityRecord->GetWant().GetElement().GetURI();
586 HILOG_DEBUG("Connect ability done, ability: %{public}s.", element.c_str());
587
588 if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
589 (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
590 HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
591 return INVALID_CONNECTION_STATE;
592 }
593
594 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
595 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
596 token, AppExecFwk::AbilityState::ABILITY_STATE_CONNECTED);
597 } else {
598 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
599 token, AppExecFwk::ExtensionState::EXTENSION_STATE_CONNECTED);
600 }
601
602 abilityRecord->SetConnRemoteObject(remoteObject);
603 // There may be multiple callers waiting for the connection result
604 auto connectRecordList = abilityRecord->GetConnectRecordList();
605 for (auto &connectRecord : connectRecordList) {
606 connectRecord->ScheduleConnectAbilityDone();
607 }
608
609 return ERR_OK;
610 }
611
ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> & token)612 int AbilityConnectManager::ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)
613 {
614 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
615 std::lock_guard guard(Lock_);
616 auto abilityRecord = GetExtensionFromServiceMapInner(token);
617 CHECK_POINTER_AND_RETURN(abilityRecord, CONNECTION_NOT_EXIST);
618
619 auto connect = abilityRecord->GetDisconnectingRecord();
620 CHECK_POINTER_AND_RETURN(connect, CONNECTION_NOT_EXIST);
621
622 if (!abilityRecord->IsAbilityState(AbilityState::ACTIVE)) {
623 HILOG_ERROR("The service ability state is not active ,state: %{public}d", abilityRecord->GetAbilityState());
624 return INVALID_CONNECTION_STATE;
625 }
626
627 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
628 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
629 token, AppExecFwk::AbilityState::ABILITY_STATE_DISCONNECTED);
630 } else {
631 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
632 token, AppExecFwk::ExtensionState::EXTENSION_STATE_DISCONNECTED);
633 }
634
635 std::string element = abilityRecord->GetWant().GetElement().GetURI();
636 HILOG_DEBUG("Disconnect ability done, service:%{public}s.", element.c_str());
637
638 // complete disconnect and remove record from conn map
639 connect->ScheduleDisconnectAbilityDone();
640 abilityRecord->RemoveConnectRecordFromList(connect);
641 if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
642 HILOG_INFO("Service ability has no any connection, and not started , need terminate.");
643 TerminateRecord(abilityRecord);
644 }
645 RemoveConnectionRecordFromMap(connect);
646
647 return ERR_OK;
648 }
649
ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> & token)650 int AbilityConnectManager::ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)
651 {
652 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
653 std::lock_guard guard(Lock_);
654 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
655 auto abilityRecord = Token::GetAbilityRecordByToken(token);
656 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
657 std::string element = abilityRecord->GetWant().GetElement().GetURI();
658 HILOG_DEBUG("Ability: %{public}s", element.c_str());
659
660 if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
661 (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
662 HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
663 return INVALID_CONNECTION_STATE;
664 }
665 // complete command and pop waiting start ability from queue.
666 CompleteCommandAbility(abilityRecord);
667
668 return ERR_OK;
669 }
670
ScheduleCommandAbilityWindowDone(const sptr<IRemoteObject> & token,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd,AbilityCommand abilityCmd)671 int AbilityConnectManager::ScheduleCommandAbilityWindowDone(
672 const sptr<IRemoteObject> &token,
673 const sptr<SessionInfo> &sessionInfo,
674 WindowCommand winCmd,
675 AbilityCommand abilityCmd)
676 {
677 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
678 std::lock_guard guard(Lock_);
679 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
680 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
681 auto abilityRecord = Token::GetAbilityRecordByToken(token);
682 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
683 std::string element = abilityRecord->GetWant().GetElement().GetURI();
684 HILOG_DEBUG("Ability: %{public}s, persistentId: %{private}d, winCmd: %{public}d, abilityCmd: %{public}d",
685 element.c_str(), sessionInfo->persistentId, winCmd, abilityCmd);
686
687 if (taskHandler_) {
688 int recordId = abilityRecord->GetRecordId();
689 std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
690 std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
691 taskHandler_->CancelTask(taskName);
692 }
693
694 if (winCmd == WIN_CMD_DESTROY) {
695 HandleCommandDestroy(sessionInfo);
696 }
697
698 switch (abilityCmd) {
699 case ABILITY_CMD_FOREGROUND: {
700 if (abilityRecord->IsAbilityState(AbilityState::INACTIVE)
701 || abilityRecord->IsAbilityState(AbilityState::BACKGROUND)
702 || abilityRecord->IsAbilityState(AbilityState::BACKGROUNDING)) {
703 HILOG_DEBUG("Foreground %{public}s", element.c_str());
704 DelayedSingleton<AppScheduler>::GetInstance()->MoveToForeground(token);
705 }
706 break;
707 }
708 case ABILITY_CMD_BACKGROUND: {
709 if (abilityRecord->IsAbilityState(AbilityState::INACTIVE)
710 || abilityRecord->IsAbilityState(AbilityState::FOREGROUND)
711 || abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) {
712 MoveToBackground(abilityRecord);
713 }
714 break;
715 }
716 case ABILITY_CMD_DESTROY: {
717 EventInfo eventInfo;
718 eventInfo.bundleName = abilityRecord->GetAbilityInfo().bundleName;
719 eventInfo.abilityName = abilityRecord->GetAbilityInfo().name;
720 EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY, HiSysEventType::BEHAVIOR, eventInfo);
721 eventInfo.errCode = TerminateAbilityInner(token);
722 if (eventInfo.errCode != ERR_OK) {
723 EventReport::SendAbilityEvent(EventName::TERMINATE_ABILITY_ERROR, HiSysEventType::FAULT, eventInfo);
724 }
725 break;
726 }
727 default:
728 HILOG_WARN("not supported ability cmd");
729 break;;
730 }
731
732 CompleteStartServiceReq(element);
733 return ERR_OK;
734 }
735
HandleCommandDestroy(const sptr<SessionInfo> & sessionInfo)736 void AbilityConnectManager::HandleCommandDestroy(const sptr<SessionInfo> &sessionInfo)
737 {
738 if (sessionInfo == nullptr) {
739 HILOG_WARN("null session info.");
740 return;
741 }
742 if (sessionInfo->sessionToken) {
743 RemoveUIExtWindowDeathRecipient(sessionInfo->sessionToken);
744 size_t ret = uiExtensionMap_.erase(sessionInfo->sessionToken);
745 if (ret > 0) {
746 return;
747 }
748
749 for (auto& item : windowExtensionMap_) {
750 auto sessionInfoVal = item.second.second;
751 if (sessionInfoVal && sessionInfoVal->callerToken == sessionInfo->sessionToken) {
752 windowExtensionMap_.erase(item.first);
753 break;
754 }
755 }
756 }
757 }
758
CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)759 void AbilityConnectManager::CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)
760 {
761 CHECK_POINTER(abilityRecord);
762 if (taskHandler_) {
763 int recordId = abilityRecord->GetRecordId();
764 std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
765 std::to_string(abilityRecord->GetStartId());
766 taskHandler_->CancelTask(taskName);
767 }
768
769 abilityRecord->SetAbilityState(AbilityState::ACTIVE);
770
771 // manage queued request
772 auto abilityInfo = abilityRecord->GetAbilityInfo();
773 AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName,
774 abilityInfo.name, abilityInfo.moduleName);
775 CompleteStartServiceReq(element.GetURI());
776 }
777
CompleteStartServiceReq(const std::string & serviceUri)778 void AbilityConnectManager::CompleteStartServiceReq(const std::string &serviceUri)
779 {
780 std::shared_ptr<std::list<OHOS::AAFwk::AbilityRequest>> reqList;
781 {
782 std::lock_guard guard(startServiceReqListLock_);
783 auto it = startServiceReqList_.find(serviceUri);
784 if (it != startServiceReqList_.end()) {
785 reqList = it->second;
786 startServiceReqList_.erase(it);
787 }
788 }
789
790 if (reqList) {
791 HILOG_INFO("Target service is already activating : %{public}zu", reqList->size());
792 for (const auto &req: *reqList) {
793 StartAbilityLocked(req);
794 }
795 }
796 }
797
GetServiceRecordByElementName(const std::string & element)798 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementName(const std::string &element)
799 {
800 std::lock_guard guard(Lock_);
801 return GetServiceRecordByElementNameInner(element);
802 }
803
GetServiceRecordByElementNameInner(const std::string & element)804 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementNameInner(const std::string &element)
805 {
806 auto mapIter = serviceMap_.find(element);
807 if (mapIter != serviceMap_.end()) {
808 return mapIter->second;
809 }
810 return nullptr;
811 }
812
GetExtensionByTokenFromServiceMap(const sptr<IRemoteObject> & token)813 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromServiceMap(
814 const sptr<IRemoteObject> &token)
815 {
816 std::lock_guard guard(Lock_);
817 return GetExtensionFromServiceMapInner(token);
818 }
819
GetExtensionFromServiceMapInner(const sptr<IRemoteObject> & token)820 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionFromServiceMapInner(
821 const sptr<IRemoteObject> &token)
822 {
823 auto IsMatch = [token](auto service) {
824 if (!service.second) {
825 return false;
826 }
827 sptr<IRemoteObject> srcToken = service.second->GetToken();
828 return srcToken == token;
829 };
830 auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
831 if (serviceRecord != serviceMap_.end()) {
832 return serviceRecord->second;
833 }
834 return nullptr;
835 }
836
GetUIExtensioBySessionInfo(const sptr<SessionInfo> & sessionInfo)837 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetUIExtensioBySessionInfo(
838 const sptr<SessionInfo> &sessionInfo)
839 {
840 std::lock_guard guard(Lock_);
841 CHECK_POINTER_AND_RETURN(sessionInfo, nullptr);
842 auto sessionToken = iface_cast<Rosen::ISession>(sessionInfo->sessionToken);
843 CHECK_POINTER_AND_RETURN(sessionToken, nullptr);
844 std::string descriptor = Str16ToStr8(sessionToken->GetDescriptor());
845 if (descriptor != "OHOS.ISession") {
846 HILOG_ERROR("Input token is not a sessionToken, token->GetDescriptor(): %{public}s",
847 descriptor.c_str());
848 return nullptr;
849 }
850
851 auto it = uiExtensionMap_.find(sessionToken->AsObject());
852 if (it != uiExtensionMap_.end()) {
853 auto abilityRecord = it->second.first.lock();
854 if (abilityRecord == nullptr) {
855 HILOG_WARN("abilityRecord is nullptr.");
856 RemoveUIExtWindowDeathRecipient(sessionToken->AsObject());
857 uiExtensionMap_.erase(it);
858 return nullptr;
859 }
860 auto savedSessionInfo = it->second.second;
861 if (!savedSessionInfo || savedSessionInfo->sessionToken != sessionInfo->sessionToken
862 || savedSessionInfo->callerToken != sessionInfo->callerToken) {
863 HILOG_WARN("Inconsistent sessionInfo.");
864 return nullptr;
865 }
866 return abilityRecord;
867 } else {
868 HILOG_ERROR("UIExtension not found.");
869 }
870 return nullptr;
871 }
872
GetExtensionByTokenFromTerminatingMap(const sptr<IRemoteObject> & token)873 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromTerminatingMap(
874 const sptr<IRemoteObject> &token)
875 {
876 std::lock_guard guard(Lock_);
877 return GetExtensionFromTerminatingMapInner(token);
878 }
879
GetExtensionFromTerminatingMapInner(const sptr<IRemoteObject> & token)880 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionFromTerminatingMapInner(
881 const sptr<IRemoteObject> &token)
882 {
883 auto IsMatch = [token](auto& extension) {
884 if (extension.second == nullptr) {
885 return false;
886 }
887 auto&& terminatingToken = extension.second->GetToken();
888 if (terminatingToken != nullptr) {
889 return terminatingToken->AsObject() == token;
890 }
891 return false;
892 };
893
894 auto terminatingExtensionRecord =
895 std::find_if(terminatingExtensionMap_.begin(), terminatingExtensionMap_.end(), IsMatch);
896 if (terminatingExtensionRecord != terminatingExtensionMap_.end()) {
897 return terminatingExtensionRecord->second;
898 }
899 return nullptr;
900 }
901
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)902 std::list<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRecordListByCallback(
903 sptr<IAbilityConnection> callback)
904 {
905 std::lock_guard guard(Lock_);
906 std::list<std::shared_ptr<ConnectionRecord>> connectList;
907 auto connectMapIter = connectMap_.find(callback->AsObject());
908 if (connectMapIter != connectMap_.end()) {
909 connectList = connectMapIter->second;
910 }
911 return connectList;
912 }
913
GetAbilityRecordById(int64_t abilityRecordId)914 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetAbilityRecordById(int64_t abilityRecordId)
915 {
916 auto IsMatch = [abilityRecordId](auto service) {
917 if (!service.second) {
918 return false;
919 }
920 return abilityRecordId == service.second->GetAbilityRecordId();
921 };
922 auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
923 if (serviceRecord != serviceMap_.end()) {
924 return serviceRecord->second;
925 }
926 return nullptr;
927 }
928
LoadAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)929 void AbilityConnectManager::LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
930 {
931 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
932 CHECK_POINTER(abilityRecord);
933 abilityRecord->SetStartTime();
934
935 if (!abilityRecord->CanRestartRootLauncher()) {
936 HILOG_ERROR("Root launcher restart is out of max count.");
937 RemoveServiceAbility(abilityRecord);
938 return;
939 }
940
941 PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
942
943 sptr<Token> token = abilityRecord->GetToken();
944 sptr<Token> perToken = nullptr;
945 if (abilityRecord->IsCreateByConnect()) {
946 perToken = iface_cast<Token>(abilityRecord->GetConnectingRecord()->GetToken());
947 } else {
948 auto callerList = abilityRecord->GetCallerRecordList();
949 if (!callerList.empty() && callerList.back()) {
950 auto caller = callerList.back()->GetCaller();
951 if (caller) {
952 perToken = caller->GetToken();
953 }
954 }
955 }
956 DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
957 token, perToken, abilityRecord->GetAbilityInfo(), abilityRecord->GetApplicationInfo(),
958 abilityRecord->GetWant());
959 }
960
PostRestartResidentTask(const AbilityRequest & abilityRequest)961 void AbilityConnectManager::PostRestartResidentTask(const AbilityRequest &abilityRequest)
962 {
963 HILOG_INFO("PostRestartResidentTask start.");
964 CHECK_POINTER(taskHandler_);
965 std::string taskName = std::string("RestartResident_") + std::string(abilityRequest.abilityInfo.name);
966 auto task = [abilityRequest, connectManager = shared_from_this()]() {
967 CHECK_POINTER(connectManager);
968 connectManager->HandleRestartResidentTask(abilityRequest);
969 };
970 int restartIntervalTime = 0;
971 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
972 if (abilityMgr) {
973 restartIntervalTime = AmsConfigurationParameter::GetInstance().GetRestartIntervalTime();
974 }
975 HILOG_DEBUG("PostRestartResidentTask, time:%{public}d", restartIntervalTime);
976 taskHandler_->SubmitTask(task, taskName, restartIntervalTime);
977 HILOG_INFO("PostRestartResidentTask end.");
978 }
979
HandleRestartResidentTask(const AbilityRequest & abilityRequest)980 void AbilityConnectManager::HandleRestartResidentTask(const AbilityRequest &abilityRequest)
981 {
982 HILOG_INFO("HandleRestartResidentTask start.");
983 auto findRestartResidentTask = [abilityRequest](const AbilityRequest &requestInfo) {
984 return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
985 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
986 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
987 };
988 auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(), findRestartResidentTask);
989 if (findIter != restartResidentTaskList_.end()) {
990 restartResidentTaskList_.erase(findIter);
991 }
992 StartAbilityLocked(abilityRequest);
993 }
994
PostTimeOutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,uint32_t messageId)995 void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)
996 {
997 CHECK_POINTER(abilityRecord);
998 CHECK_POINTER(taskHandler_);
999 if (messageId != AbilityConnectManager::LOAD_TIMEOUT_MSG &&
1000 messageId != AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
1001 HILOG_ERROR("Timeout task messageId is error.");
1002 return;
1003 }
1004
1005 int recordId;
1006 std::string taskName;
1007 int resultCode;
1008 uint32_t delayTime;
1009 if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
1010 // first load ability, There is at most one connect record.
1011 recordId = abilityRecord->GetRecordId();
1012 taskName = std::string("LoadTimeout_") + std::to_string(recordId);
1013 resultCode = LOAD_ABILITY_TIMEOUT;
1014 delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE;
1015 } else {
1016 auto connectRecord = abilityRecord->GetConnectingRecord();
1017 CHECK_POINTER(connectRecord);
1018 recordId = connectRecord->GetRecordId();
1019 taskName = std::string("ConnectTimeout_") + std::to_string(recordId);
1020 resultCode = CONNECTION_TIMEOUT;
1021 delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * CONNECT_TIMEOUT_MULTIPLE;
1022 }
1023
1024 // check libc.hook_mode
1025 const int bufferLen = 128;
1026 char paramOutBuf[bufferLen] = {0};
1027 const char *hook_mode = "startup:";
1028 int ret = GetParameter("libc.hook_mode", "", paramOutBuf, bufferLen - 1);
1029 if (ret > 0 && strncmp(paramOutBuf, hook_mode, strlen(hook_mode)) == 0) {
1030 HILOG_DEBUG("Hook_mode: no timeoutTask");
1031 return;
1032 }
1033
1034 auto timeoutTask = [abilityRecord, connectManager = shared_from_this(), resultCode]() {
1035 HILOG_WARN("Connect or load ability timeout.");
1036 connectManager->HandleStartTimeoutTask(abilityRecord, resultCode);
1037 };
1038 taskHandler_->SubmitTask(timeoutTask, taskName, delayTime);
1039 }
1040
HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode)1041 void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, int resultCode)
1042 {
1043 HILOG_DEBUG("Complete connect or load ability timeout.");
1044 std::lock_guard guard(Lock_);
1045 CHECK_POINTER(abilityRecord);
1046 auto connectingList = abilityRecord->GetConnectingRecordList();
1047 for (auto &connectRecord : connectingList) {
1048 if (connectRecord == nullptr) {
1049 HILOG_WARN("ConnectRecord is nullptr.");
1050 continue;
1051 }
1052 connectRecord->CompleteDisconnect(ERR_OK, true);
1053 abilityRecord->RemoveConnectRecordFromList(connectRecord);
1054 RemoveConnectionRecordFromMap(connectRecord);
1055 }
1056
1057 if (GetExtensionFromServiceMapInner(abilityRecord->GetToken()) == nullptr) {
1058 HILOG_ERROR("Timeojut ability record is not exist in service map.");
1059 return;
1060 }
1061 MoveToTerminatingMap(abilityRecord);
1062
1063 if (resultCode == LOAD_ABILITY_TIMEOUT) {
1064 HILOG_WARN("Load time out , remove target service record from services map.");
1065 RemoveServiceAbility(abilityRecord);
1066 if (abilityRecord->GetAbilityInfo().name != AbilityConfig::LAUNCHER_ABILITY_NAME) {
1067 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1068 if (IsAbilityNeedKeepAlive(abilityRecord)) {
1069 HILOG_WARN("Load time out , try to restart.");
1070 RestartAbility(abilityRecord, userId_);
1071 }
1072 }
1073 }
1074
1075 if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1076 // terminate the timeout root launcher.
1077 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1078 if (resultCode == LOAD_ABILITY_TIMEOUT) {
1079 StartRootLauncher(abilityRecord);
1080 }
1081 }
1082 }
1083
HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord)1084 void AbilityConnectManager::HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
1085 {
1086 HILOG_DEBUG("HandleCommandTimeoutTask start");
1087 std::lock_guard guard(Lock_);
1088 CHECK_POINTER(abilityRecord);
1089 if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1090 HILOG_DEBUG("Handle root launcher command timeout.");
1091 // terminate the timeout root launcher.
1092 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
1093 }
1094 HILOG_DEBUG("HandleCommandTimeoutTask end");
1095 }
1096
HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd)1097 void AbilityConnectManager::HandleCommandWindowTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord,
1098 const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1099 {
1100 HILOG_DEBUG("start");
1101 std::lock_guard guard(Lock_);
1102 CHECK_POINTER(abilityRecord);
1103 // manage queued request
1104 auto abilityInfo = abilityRecord->GetAbilityInfo();
1105 AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName,
1106 abilityInfo.name, abilityInfo.moduleName);
1107 CompleteStartServiceReq(element.GetURI());
1108 HILOG_DEBUG("end");
1109 }
1110
StartRootLauncher(const std::shared_ptr<AbilityRecord> & abilityRecord)1111 void AbilityConnectManager::StartRootLauncher(const std::shared_ptr<AbilityRecord> &abilityRecord)
1112 {
1113 CHECK_POINTER(abilityRecord);
1114 AbilityRequest requestInfo;
1115 requestInfo.want = abilityRecord->GetWant();
1116 requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
1117 requestInfo.appInfo = abilityRecord->GetApplicationInfo();
1118 requestInfo.restartTime = abilityRecord->GetRestartTime();
1119 requestInfo.restart = true;
1120 requestInfo.restartCount = abilityRecord->GetRestartCount() - 1;
1121
1122 HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
1123 StartAbilityLocked(requestInfo);
1124 }
1125
HandleStopTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)1126 void AbilityConnectManager::HandleStopTimeoutTask(std::shared_ptr<AbilityRecord> abilityRecord)
1127 {
1128 HILOG_DEBUG("Complete stop ability timeout start.");
1129 std::lock_guard guard(Lock_);
1130 CHECK_POINTER(abilityRecord);
1131 TerminateDone(abilityRecord);
1132 }
1133
HandleTerminateDisconnectTask(const ConnectListType & connectlist)1134 void AbilityConnectManager::HandleTerminateDisconnectTask(const ConnectListType& connectlist)
1135 {
1136 HILOG_DEBUG("Disconnect ability when terminate.");
1137 for (auto& connectRecord : connectlist) {
1138 if (!connectRecord) {
1139 continue;
1140 }
1141 auto targetService = connectRecord->GetAbilityRecord();
1142 if (targetService) {
1143 HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
1144 connectRecord->CompleteDisconnect(ERR_OK, true);
1145 targetService->RemoveConnectRecordFromList(connectRecord);
1146 RemoveConnectionRecordFromMap(connectRecord);
1147 };
1148 }
1149 }
1150
DispatchInactive(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)1151 int AbilityConnectManager::DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
1152 {
1153 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1154 CHECK_POINTER_AND_RETURN(eventHandler_, ERR_INVALID_VALUE);
1155 if (!abilityRecord->IsAbilityState(AbilityState::INACTIVATING)) {
1156 HILOG_ERROR("Ability transition life state error. expect %{public}d, actual %{public}d callback %{public}d",
1157 AbilityState::INACTIVATING,
1158 abilityRecord->GetAbilityState(),
1159 state);
1160 return ERR_INVALID_VALUE;
1161 }
1162 eventHandler_->RemoveEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecord->GetAbilityRecordId());
1163
1164 // complete inactive
1165 abilityRecord->SetAbilityState(AbilityState::INACTIVE);
1166 if (abilityRecord->IsCreateByConnect()) {
1167 ConnectAbility(abilityRecord);
1168 } else if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1169 CommandAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo(), WIN_CMD_FOREGROUND);
1170 } else {
1171 CommandAbility(abilityRecord);
1172 if (abilityRecord->GetConnectRecordList().size() > 0) {
1173 // It means someone called connectAbility when service was loading
1174 ConnectAbility(abilityRecord);
1175 }
1176 }
1177
1178 return ERR_OK;
1179 }
1180
DispatchForeground(const std::shared_ptr<AbilityRecord> & abilityRecord)1181 int AbilityConnectManager::DispatchForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1182 {
1183 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1184 CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1185 // remove foreground timeout task.
1186 taskHandler_->CancelTask("foreground_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1187
1188 auto self(shared_from_this());
1189 auto task = [self, abilityRecord]() { self->CompleteForeground(abilityRecord); };
1190 taskHandler_->SubmitTask(task);
1191
1192 return ERR_OK;
1193 }
1194
DispatchBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1195 int AbilityConnectManager::DispatchBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1196 {
1197 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1198 CHECK_POINTER_AND_RETURN(taskHandler_, ERR_INVALID_VALUE);
1199 // remove background timeout task.
1200 taskHandler_->CancelTask("background_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1201
1202 auto self(shared_from_this());
1203 auto task = [self, abilityRecord]() { self->CompleteBackground(abilityRecord); };
1204 taskHandler_->SubmitTask(task);
1205
1206 return ERR_OK;
1207 }
1208
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)1209 int AbilityConnectManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
1210 {
1211 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
1212 // remove terminate timeout task
1213 if (taskHandler_ != nullptr) {
1214 taskHandler_->CancelTask("terminate_" + std::to_string(abilityRecord->GetAbilityRecordId()));
1215 }
1216 // complete terminate
1217 TerminateDone(abilityRecord);
1218 return ERR_OK;
1219 }
1220
ConnectAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1221 void AbilityConnectManager::ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1222 {
1223 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1224 CHECK_POINTER(abilityRecord);
1225 PostTimeOutTask(abilityRecord, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
1226 abilityRecord->ConnectAbility();
1227 }
1228
CommandAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1229 void AbilityConnectManager::CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1230 {
1231 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1232 if (taskHandler_ != nullptr) {
1233 // first connect ability, There is at most one connect record.
1234 int recordId = abilityRecord->GetRecordId();
1235 abilityRecord->AddStartId();
1236 std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
1237 std::to_string(abilityRecord->GetStartId());
1238 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
1239 HILOG_ERROR("Command ability timeout. %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1240 connectManager->HandleCommandTimeoutTask(abilityRecord);
1241 };
1242 int commandTimeout =
1243 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_TIMEOUT_MULTIPLE;
1244 taskHandler_->SubmitTask(timeoutTask, taskName, commandTimeout);
1245 // scheduling command ability
1246 abilityRecord->CommandAbility();
1247 }
1248 }
1249
CommandAbilityWindow(const std::shared_ptr<AbilityRecord> & abilityRecord,const sptr<SessionInfo> & sessionInfo,WindowCommand winCmd)1250 void AbilityConnectManager::CommandAbilityWindow(const std::shared_ptr<AbilityRecord> &abilityRecord,
1251 const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd)
1252 {
1253 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1254 CHECK_POINTER(abilityRecord);
1255 CHECK_POINTER(sessionInfo);
1256 HILOG_DEBUG("ability: %{public}s, persistentId: %{private}d, wincmd: %{public}d",
1257 abilityRecord->GetAbilityInfo().name.c_str(), sessionInfo->persistentId, winCmd);
1258 if (taskHandler_ != nullptr) {
1259 int recordId = abilityRecord->GetRecordId();
1260 std::string taskName = std::string("CommandWindowTimeout_") + std::to_string(recordId) + std::string("_") +
1261 std::to_string(sessionInfo->persistentId) + std::string("_") + std::to_string(winCmd);
1262 auto timeoutTask = [abilityRecord, sessionInfo, winCmd, connectManager = shared_from_this()]() {
1263 HILOG_ERROR("Command window timeout. %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1264 connectManager->HandleCommandWindowTimeoutTask(abilityRecord, sessionInfo, winCmd);
1265 };
1266 int commandWindowTimeout =
1267 AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * COMMAND_WINDOW_TIMEOUT_MULTIPLE;
1268 taskHandler_->SubmitTask(timeoutTask, taskName, commandWindowTimeout);
1269 // scheduling command ability
1270 abilityRecord->CommandAbilityWindow(sessionInfo, winCmd);
1271 }
1272 }
1273
TerminateDone(const std::shared_ptr<AbilityRecord> & abilityRecord)1274 void AbilityConnectManager::TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)
1275 {
1276 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1277 CHECK_POINTER(abilityRecord);
1278 if (!abilityRecord->IsAbilityState(AbilityState::TERMINATING)) {
1279 std::string expect = AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING);
1280 std::string actual = AbilityRecord::ConvertAbilityState(abilityRecord->GetAbilityState());
1281 HILOG_ERROR(
1282 "Transition life state error. expect %{public}s, actual %{public}s", expect.c_str(), actual.c_str());
1283 return;
1284 }
1285 abilityRecord->RemoveAbilityDeathRecipient();
1286 DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(abilityRecord->GetToken(), false);
1287 RemoveServiceAbility(abilityRecord);
1288 }
1289
IsAbilityConnected(const std::shared_ptr<AbilityRecord> & abilityRecord,const std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)1290 bool AbilityConnectManager::IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord,
1291 const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
1292 {
1293 auto isMatch = [abilityRecord](auto connectRecord) -> bool {
1294 if (abilityRecord == nullptr || connectRecord == nullptr) {
1295 return false;
1296 }
1297 if (abilityRecord != connectRecord->GetAbilityRecord()) {
1298 return false;
1299 }
1300 return true;
1301 };
1302 return std::any_of(connectRecordList.begin(), connectRecordList.end(), isMatch);
1303 }
1304
RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> & connection)1305 void AbilityConnectManager::RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> &connection)
1306 {
1307 for (auto &connectCallback : connectMap_) {
1308 auto &connectList = connectCallback.second;
1309 auto connectRecord = std::find(connectList.begin(), connectList.end(), connection);
1310 if (connectRecord != connectList.end()) {
1311 HILOG_INFO("connrecord(%{public}d)", (*connectRecord)->GetRecordId());
1312 connectList.remove(connection);
1313 if (connectList.empty()) {
1314 HILOG_INFO("connlist");
1315 sptr<IAbilityConnection> connect = iface_cast<IAbilityConnection>(connectCallback.first);
1316 RemoveConnectDeathRecipient(connect);
1317 connectMap_.erase(connectCallback.first);
1318 }
1319 return;
1320 }
1321 }
1322 }
1323
RemoveServiceAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)1324 void AbilityConnectManager::RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
1325 {
1326 CHECK_POINTER(abilityRecord);
1327 auto& abilityInfo = abilityRecord->GetAbilityInfo();
1328 AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1329 abilityInfo.moduleName);
1330 HILOG_DEBUG("Remove service(%{public}s) from terminating map.", element.GetURI().c_str());
1331 terminatingExtensionMap_.erase(element.GetURI());
1332 }
1333
AddConnectDeathRecipient(const sptr<IAbilityConnection> & connect)1334 void AbilityConnectManager::AddConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
1335 {
1336 CHECK_POINTER(connect);
1337 CHECK_POINTER(connect->AsObject());
1338 auto it = recipientMap_.find(connect->AsObject());
1339 if (it != recipientMap_.end()) {
1340 HILOG_ERROR("This death recipient has been added.");
1341 return;
1342 } else {
1343 std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1344 sptr<IRemoteObject::DeathRecipient> deathRecipient =
1345 new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1346 auto abilityConnectManager = thisWeakPtr.lock();
1347 if (abilityConnectManager) {
1348 abilityConnectManager->OnCallBackDied(remote);
1349 }
1350 });
1351 if (!connect->AsObject()->AddDeathRecipient(deathRecipient)) {
1352 HILOG_ERROR("AddDeathRecipient failed.");
1353 }
1354 recipientMap_.emplace(connect->AsObject(), deathRecipient);
1355 }
1356 }
1357
RemoveConnectDeathRecipient(const sptr<IAbilityConnection> & connect)1358 void AbilityConnectManager::RemoveConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
1359 {
1360 CHECK_POINTER(connect);
1361 CHECK_POINTER(connect->AsObject());
1362 auto it = recipientMap_.find(connect->AsObject());
1363 if (it != recipientMap_.end()) {
1364 it->first->RemoveDeathRecipient(it->second);
1365 recipientMap_.erase(it);
1366 return;
1367 }
1368 }
1369
OnCallBackDied(const wptr<IRemoteObject> & remote)1370 void AbilityConnectManager::OnCallBackDied(const wptr<IRemoteObject> &remote)
1371 {
1372 auto object = remote.promote();
1373 CHECK_POINTER(object);
1374 if (taskHandler_) {
1375 auto task = [object, connectManager = shared_from_this()]() { connectManager->HandleCallBackDiedTask(object); };
1376 taskHandler_->SubmitTask(task, TASK_ON_CALLBACK_DIED);
1377 }
1378 }
1379
HandleCallBackDiedTask(const sptr<IRemoteObject> & connect)1380 void AbilityConnectManager::HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)
1381 {
1382 HILOG_INFO("Handle call back died task.");
1383 std::lock_guard guard(Lock_);
1384 CHECK_POINTER(connect);
1385 auto item = windowExtensionMap_.find(connect);
1386 if (item != windowExtensionMap_.end()) {
1387 windowExtensionMap_.erase(item);
1388 }
1389 auto it = connectMap_.find(connect);
1390 if (it != connectMap_.end()) {
1391 ConnectListType connectRecordList = it->second;
1392 for (auto &connRecord : connectRecordList) {
1393 connRecord->ClearConnCallBack();
1394 }
1395 } else {
1396 HILOG_INFO("Died object can't find from conn map.");
1397 return;
1398 }
1399 sptr<IAbilityConnection> object = iface_cast<IAbilityConnection>(connect);
1400 DisconnectAbilityLocked(object, true);
1401 }
1402
OnAbilityDied(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1403 void AbilityConnectManager::OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1404 {
1405 HILOG_INFO("On ability died.");
1406 CHECK_POINTER(abilityRecord);
1407 if (abilityRecord->GetAbilityInfo().type != AbilityType::SERVICE &&
1408 abilityRecord->GetAbilityInfo().type != AbilityType::EXTENSION) {
1409 HILOG_DEBUG("Ability type is not service.");
1410 return;
1411 }
1412 if (taskHandler_) {
1413 auto task = [abilityRecord, connectManager = shared_from_this(), currentUserId]() {
1414 connectManager->HandleAbilityDiedTask(abilityRecord, currentUserId);
1415 };
1416 taskHandler_->SubmitTask(task, TASK_ON_ABILITY_DIED);
1417 }
1418 }
1419
OnTimeOut(uint32_t msgId,int64_t abilityRecordId)1420 void AbilityConnectManager::OnTimeOut(uint32_t msgId, int64_t abilityRecordId)
1421 {
1422 HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1423 std::lock_guard guard(Lock_);
1424 auto abilityRecord = GetAbilityRecordById(abilityRecordId);
1425 if (abilityRecord == nullptr) {
1426 HILOG_ERROR("AbilityConnectManager on time out event: ability record is nullptr.");
1427 return;
1428 }
1429 HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId,
1430 abilityRecord->GetAbilityInfo().name.c_str());
1431
1432 switch (msgId) {
1433 case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1434 HandleInactiveTimeout(abilityRecord);
1435 break;
1436 default:
1437 break;
1438 }
1439 }
1440
HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> & ability)1441 void AbilityConnectManager::HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)
1442 {
1443 HILOG_DEBUG("HandleInactiveTimeout start");
1444 CHECK_POINTER(ability);
1445 if (ability->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1446 HILOG_DEBUG("Handle root launcher inactive timeout.");
1447 // terminate the timeout root launcher.
1448 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1449 }
1450
1451 HILOG_DEBUG("HandleInactiveTimeout end");
1452 }
1453
IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> & abilityRecord)1454 bool AbilityConnectManager::IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)
1455 {
1456 if ((abilityRecord->GetApplicationInfo().bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME &&
1457 abilityRecord->GetAbilityInfo().name == AbilityConfig::SYSTEM_UI_ABILITY_NAME) ||
1458 (abilityRecord->GetApplicationInfo().bundleName == AbilityConfig::LAUNCHER_BUNDLE_NAME &&
1459 abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME)) {
1460 return true;
1461 }
1462 auto bms = AbilityUtil::GetBundleManager();
1463 CHECK_POINTER_AND_RETURN(bms, false);
1464 std::vector<AppExecFwk::BundleInfo> bundleInfos;
1465 bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD);
1466 if (!getBundleInfos) {
1467 HILOG_ERROR("Handle ability died task, get bundle infos failed");
1468 return false;
1469 }
1470
1471 auto CheckIsAbilityNeedKeepAlive = [](const AppExecFwk::HapModuleInfo &hapModuleInfo,
1472 const std::string processName, std::string &mainElement) {
1473 if (!hapModuleInfo.isModuleJson) {
1474 // old application model
1475 mainElement = hapModuleInfo.mainAbility;
1476 for (auto abilityInfo : hapModuleInfo.abilityInfos) {
1477 if (abilityInfo.process == processName && abilityInfo.name == mainElement) {
1478 return true;
1479 }
1480 }
1481 return false;
1482 }
1483
1484 // new application model
1485 if (hapModuleInfo.process == processName) {
1486 mainElement = hapModuleInfo.mainElementName;
1487 return true;
1488 }
1489 return false;
1490 };
1491
1492 auto GetKeepAliveAbilities = [&](std::vector<std::pair<std::string, std::string>> &keepAliveAbilities) {
1493 for (size_t i = 0; i < bundleInfos.size(); i++) {
1494 std::string processName = bundleInfos[i].applicationInfo.process;
1495 if (!bundleInfos[i].isKeepAlive || processName.empty()) {
1496 continue;
1497 }
1498 std::string bundleName = bundleInfos[i].name;
1499 for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) {
1500 std::string mainElement;
1501 if (CheckIsAbilityNeedKeepAlive(hapModuleInfo, processName, mainElement) && !mainElement.empty()) {
1502 keepAliveAbilities.push_back(std::make_pair(bundleName, mainElement));
1503 }
1504 }
1505 }
1506 };
1507
1508 auto findKeepAliveAbility = [abilityRecord](const std::pair<std::string, std::string> &keepAlivePair) {
1509 return ((abilityRecord->GetAbilityInfo().bundleName == keepAlivePair.first &&
1510 abilityRecord->GetAbilityInfo().name == keepAlivePair.second));
1511 };
1512
1513 std::vector<std::pair<std::string, std::string>> keepAliveAbilities;
1514 GetKeepAliveAbilities(keepAliveAbilities);
1515 auto findIter = find_if(keepAliveAbilities.begin(), keepAliveAbilities.end(), findKeepAliveAbility);
1516 if (findIter != keepAliveAbilities.end()) {
1517 abilityRecord->SetKeepAlive();
1518 return true;
1519 }
1520 return false;
1521 }
1522
HandleAbilityDiedTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1523 void AbilityConnectManager::HandleAbilityDiedTask(
1524 const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1525 {
1526 HILOG_INFO("Handle ability died task.");
1527 std::lock_guard guard(Lock_);
1528 CHECK_POINTER(abilityRecord);
1529 abilityRecord->SetConnRemoteObject(nullptr);
1530 ConnectListType connlist = abilityRecord->GetConnectRecordList();
1531 for (auto &connectRecord : connlist) {
1532 HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
1533 connectRecord->CompleteDisconnect(ERR_OK, true);
1534 abilityRecord->RemoveConnectRecordFromList(connectRecord);
1535 RemoveConnectionRecordFromMap(connectRecord);
1536 }
1537
1538 if (abilityRecord->IsTerminating()) {
1539 HILOG_INFO("Handle extension DiedByTerminating.");
1540 RemoveServiceAbility(abilityRecord);
1541 if (IsAbilityNeedKeepAlive(abilityRecord)) {
1542 HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1543 RestartAbility(abilityRecord, currentUserId);
1544 }
1545 return;
1546 }
1547
1548 if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) {
1549 HandleUIExtensionDied(abilityRecord);
1550 }
1551
1552 if (GetExtensionFromServiceMapInner(abilityRecord->GetToken()) == nullptr) {
1553 HILOG_ERROR("Died ability record is not exist in service map.");
1554 return;
1555 }
1556
1557 MoveToTerminatingMap(abilityRecord);
1558 RemoveServiceAbility(abilityRecord);
1559 if (IsAbilityNeedKeepAlive(abilityRecord)) {
1560 HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1561 RestartAbility(abilityRecord, currentUserId);
1562 }
1563 }
1564
HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> & abilityRecord)1565 void AbilityConnectManager::HandleUIExtensionDied(const std::shared_ptr<AbilityRecord> &abilityRecord)
1566 {
1567 HILOG_DEBUG("called");
1568 CHECK_POINTER(abilityRecord);
1569 for (auto it = uiExtensionMap_.begin(); it != uiExtensionMap_.end();) {
1570 std::shared_ptr<AbilityRecord> uiExtAbility = it->second.first.lock();
1571 if (uiExtAbility == nullptr) {
1572 HILOG_WARN("uiExtAbility is nullptr");
1573 RemoveUIExtWindowDeathRecipient(it->first);
1574 it = uiExtensionMap_.erase(it);
1575 continue;
1576 }
1577
1578 if (abilityRecord == uiExtAbility) {
1579 sptr<Rosen::ISession> sessionProxy = iface_cast<Rosen::ISession>(it->first);
1580 if (sessionProxy) {
1581 HILOG_DEBUG("start NotifyExtensionDied");
1582 sessionProxy->NotifyExtensionDied();
1583 }
1584 RemoveUIExtWindowDeathRecipient(it->first);
1585 it = uiExtensionMap_.erase(it);
1586 continue;
1587 }
1588 it++;
1589 }
1590 }
1591
RestartAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1592 void AbilityConnectManager::RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1593 {
1594 HILOG_INFO("Restart ability");
1595 AbilityRequest requestInfo;
1596 requestInfo.want = abilityRecord->GetWant();
1597 requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
1598 requestInfo.appInfo = abilityRecord->GetApplicationInfo();
1599 requestInfo.restartTime = abilityRecord->GetRestartTime();
1600 requestInfo.restart = true;
1601 abilityRecord->SetRestarting(true);
1602
1603 if (currentUserId != userId_ &&
1604 abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1605 HILOG_WARN("delay restart root launcher until switch user.");
1606 return;
1607 }
1608
1609 if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1610 requestInfo.restartCount = abilityRecord->GetRestartCount();
1611 HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
1612 StartAbilityLocked(requestInfo);
1613 return;
1614 }
1615
1616 // restart other resident ability
1617 if (abilityRecord->CanRestartResident()) {
1618 requestInfo.restartCount = abilityRecord->GetRestartCount();
1619 requestInfo.restartTime = AbilityUtil::SystemTimeMillis();
1620 StartAbilityLocked(requestInfo);
1621 } else {
1622 auto findRestartResidentTask = [requestInfo](const AbilityRequest &abilityRequest) {
1623 return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
1624 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
1625 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
1626 };
1627 auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(),
1628 findRestartResidentTask);
1629 if (findIter != restartResidentTaskList_.end()) {
1630 HILOG_WARN("The restart task has been registered.");
1631 return;
1632 }
1633 restartResidentTaskList_.emplace_back(requestInfo);
1634 PostRestartResidentTask(requestInfo);
1635 }
1636 }
1637
DumpState(std::vector<std::string> & info,bool isClient,const std::string & args)1638 void AbilityConnectManager::DumpState(std::vector<std::string> &info, bool isClient, const std::string &args)
1639 {
1640 HILOG_INFO("args:%{public}s.", args.c_str());
1641 ServiceMapType serviceMapBack;
1642 {
1643 std::lock_guard guard(Lock_);
1644 serviceMapBack = serviceMap_;
1645 }
1646 if (!args.empty()) {
1647 auto it = std::find_if(serviceMapBack.begin(), serviceMapBack.end(), [&args](const auto &service) {
1648 return service.first.compare(args) == 0;
1649 });
1650 if (it != serviceMapBack.end()) {
1651 info.emplace_back("uri [ " + it->first + " ]");
1652 if (it->second != nullptr) {
1653 it->second->DumpService(info, isClient);
1654 }
1655 } else {
1656 info.emplace_back(args + ": Nothing to dump.");
1657 }
1658 } else {
1659 info.emplace_back(" ExtensionRecords:");
1660 for (auto &&service : serviceMapBack) {
1661 info.emplace_back(" uri [" + service.first + "]");
1662 if (service.second != nullptr) {
1663 service.second->DumpService(info, isClient);
1664 }
1665 }
1666 }
1667 }
1668
DumpStateByUri(std::vector<std::string> & info,bool isClient,const std::string & args,std::vector<std::string> & params)1669 void AbilityConnectManager::DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args,
1670 std::vector<std::string> ¶ms)
1671 {
1672 HILOG_INFO("args:%{public}s, params size: %{public}zu", args.c_str(), params.size());
1673 std::shared_ptr<AbilityRecord> extensionAbilityRecord = nullptr;
1674 {
1675 std::lock_guard guard(Lock_);
1676 auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
1677 return service.first.compare(args) == 0;
1678 });
1679 if (it != serviceMap_.end()) {
1680 info.emplace_back("uri [ " + it->first + " ]");
1681 extensionAbilityRecord = it->second;
1682 } else {
1683 info.emplace_back(args + ": Nothing to dump.");
1684 }
1685 }
1686 if (extensionAbilityRecord != nullptr) {
1687 extensionAbilityRecord->DumpService(info, params, isClient);
1688 }
1689 }
1690
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info,const int32_t userId,bool isPerm)1691 void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info,
1692 const int32_t userId, bool isPerm)
1693 {
1694 HILOG_DEBUG("Get extension running info.");
1695 std::lock_guard guard(Lock_);
1696 auto mgr = shared_from_this();
1697 auto queryInfo = [&info, upperLimit, userId, isPerm, mgr](ServiceMapType::reference service) {
1698 if (static_cast<int>(info.size()) >= upperLimit) {
1699 return;
1700 }
1701 auto abilityRecord = service.second;
1702 CHECK_POINTER(abilityRecord);
1703
1704 if (isPerm) {
1705 mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1706 } else {
1707 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1708 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1709 if (callingTokenId == tokenID) {
1710 mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1711 }
1712 }
1713 };
1714 std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1715 }
1716
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)1717 void AbilityConnectManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
1718 {
1719 HILOG_DEBUG("call");
1720 std::lock_guard guard(Lock_);
1721
1722 auto queryInfo = [&info, isPerm](ServiceMapType::reference service) {
1723 auto abilityRecord = service.second;
1724 CHECK_POINTER(abilityRecord);
1725
1726 if (isPerm) {
1727 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1728 } else {
1729 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1730 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1731 if (callingTokenId == tokenID) {
1732 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1733 }
1734 }
1735 };
1736
1737 std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1738 }
1739
GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> & abilityRecord,const int32_t userId,std::vector<ExtensionRunningInfo> & info)1740 void AbilityConnectManager::GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord,
1741 const int32_t userId, std::vector<ExtensionRunningInfo> &info)
1742 {
1743 ExtensionRunningInfo extensionInfo;
1744 AppExecFwk::RunningProcessInfo processInfo;
1745 extensionInfo.extension = abilityRecord->GetWant().GetElement();
1746 auto bms = AbilityUtil::GetBundleManager();
1747 CHECK_POINTER(bms);
1748 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
1749 bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfos(abilityRecord->GetWant(),
1750 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, extensionInfos));
1751 if (queryResult) {
1752 HILOG_DEBUG("Success");
1753 auto abilityInfo = abilityRecord->GetAbilityInfo();
1754 auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &extensionInfo) {
1755 HILOG_DEBUG("%{public}s, %{public}s", extensionInfo.bundleName.c_str(), extensionInfo.name.c_str());
1756 return extensionInfo.bundleName == abilityInfo.bundleName && extensionInfo.name == abilityInfo.name
1757 && extensionInfo.applicationInfo.uid == abilityInfo.applicationInfo.uid;
1758 };
1759 auto infoIter = std::find_if(extensionInfos.begin(), extensionInfos.end(), isExist);
1760 if (infoIter != extensionInfos.end()) {
1761 HILOG_DEBUG("Get target success.");
1762 extensionInfo.type = (*infoIter).type;
1763 }
1764 }
1765 DelayedSingleton<AppScheduler>::GetInstance()->
1766 GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
1767 extensionInfo.pid = processInfo.pid_;
1768 extensionInfo.uid = processInfo.uid_;
1769 extensionInfo.processName = processInfo.processName_;
1770 extensionInfo.startTime = abilityRecord->GetStartTime();
1771 ConnectListType connectRecordList = abilityRecord->GetConnectRecordList();
1772 for (auto &connectRecord : connectRecordList) {
1773 if (connectRecord == nullptr) {
1774 HILOG_DEBUG("connectRecord is nullptr.");
1775 continue;
1776 }
1777 auto callerAbilityRecord = Token::GetAbilityRecordByToken(connectRecord->GetToken());
1778 if (callerAbilityRecord == nullptr) {
1779 HILOG_DEBUG("callerAbilityRecord is nullptr.");
1780 continue;
1781 }
1782 std::string package = callerAbilityRecord->GetAbilityInfo().bundleName;
1783 extensionInfo.clientPackage.emplace_back(package);
1784 }
1785 info.emplace_back(extensionInfo);
1786 }
1787
StopAllExtensions()1788 void AbilityConnectManager::StopAllExtensions()
1789 {
1790 HILOG_INFO("StopAllExtensions begin.");
1791 std::lock_guard guard(Lock_);
1792 for (auto it = serviceMap_.begin(); it != serviceMap_.end();) {
1793 auto targetExtension = it->second;
1794 if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION) {
1795 terminatingExtensionMap_.emplace(it->first, it->second);
1796 serviceMap_.erase(it++);
1797 TerminateAbilityLocked(targetExtension->GetToken());
1798 } else {
1799 it++;
1800 }
1801 }
1802 }
1803
MoveToForeground(const std::shared_ptr<AbilityRecord> & abilityRecord)1804 void AbilityConnectManager::MoveToForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1805 {
1806 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1807 if (abilityRecord == nullptr) {
1808 HILOG_ERROR("ability record is null.");
1809 return;
1810 }
1811
1812 auto self(weak_from_this());
1813 auto task = [abilityRecord, self]() {
1814 auto selfObj = self.lock();
1815 if (selfObj == nullptr) {
1816 HILOG_WARN("mgr is invalid.");
1817 return;
1818 }
1819 HILOG_ERROR("move to foreground timeout.");
1820 selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::FOREGROUND_TIMEOUT_MSG);
1821 };
1822 abilityRecord->ForegroundAbility(task);
1823 }
1824
MoveToBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1825 void AbilityConnectManager::MoveToBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1826 {
1827 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1828 if (abilityRecord == nullptr) {
1829 HILOG_ERROR("Move the ui extension ability to background fail, ability record is null.");
1830 return;
1831 }
1832 HILOG_DEBUG("Move the ui extension ability to background, ability:%{public}s.",
1833 abilityRecord->GetAbilityInfo().name.c_str());
1834 abilityRecord->SetIsNewWant(false);
1835
1836 auto self(weak_from_this());
1837 auto task = [abilityRecord, self]() {
1838 auto selfObj = self.lock();
1839 if (selfObj == nullptr) {
1840 HILOG_WARN("mgr is invalid.");
1841 return;
1842 }
1843 HILOG_ERROR("move to background timeout.");
1844 selfObj->PrintTimeOutLog(abilityRecord, AbilityManagerService::BACKGROUND_TIMEOUT_MSG);
1845 selfObj->CompleteBackground(abilityRecord);
1846 };
1847 abilityRecord->BackgroundAbility(task);
1848 }
1849
CompleteForeground(const std::shared_ptr<AbilityRecord> & abilityRecord)1850 void AbilityConnectManager::CompleteForeground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1851 {
1852 std::lock_guard guard(Lock_);
1853 if (abilityRecord->GetAbilityState() != AbilityState::FOREGROUNDING) {
1854 HILOG_ERROR("Ability state is %{public}d, it can't complete foreground.", abilityRecord->GetAbilityState());
1855 return;
1856 }
1857
1858 abilityRecord->SetAbilityState(AbilityState::FOREGROUND);
1859 }
1860
CompleteBackground(const std::shared_ptr<AbilityRecord> & abilityRecord)1861 void AbilityConnectManager::CompleteBackground(const std::shared_ptr<AbilityRecord> &abilityRecord)
1862 {
1863 std::lock_guard guard(Lock_);
1864 if (abilityRecord->GetAbilityState() != AbilityState::BACKGROUNDING) {
1865 HILOG_ERROR("Ability state is %{public}d, it can't complete background.", abilityRecord->GetAbilityState());
1866 return;
1867 }
1868
1869 abilityRecord->SetAbilityState(AbilityState::BACKGROUND);
1870 // send application state to AppMS.
1871 // notify AppMS to update application state.
1872 DelayedSingleton<AppScheduler>::GetInstance()->MoveToBackground(abilityRecord->GetToken());
1873 }
1874
PrintTimeOutLog(const std::shared_ptr<AbilityRecord> & ability,uint32_t msgId)1875 void AbilityConnectManager::PrintTimeOutLog(const std::shared_ptr<AbilityRecord> &ability, uint32_t msgId)
1876 {
1877 if (ability == nullptr) {
1878 HILOG_ERROR("ability is nullptr");
1879 return;
1880 }
1881
1882 AppExecFwk::RunningProcessInfo processInfo = {};
1883 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(ability->GetToken(), processInfo);
1884 if (processInfo.pid_ == 0) {
1885 HILOG_ERROR("error: the ability[%{public}s], app may fork fail or not running.",
1886 ability->GetAbilityInfo().name.data());
1887 return;
1888 }
1889 int typeId = AppExecFwk::AppfreezeManager::TypeAttribute::NORMAL_TIMEOUT;
1890 std::string msgContent = "ability:" + ability->GetAbilityInfo().name + " ";
1891 switch (msgId) {
1892 case AbilityManagerService::LOAD_TIMEOUT_MSG:
1893 msgContent += "load timeout";
1894 typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1895 break;
1896 case AbilityManagerService::ACTIVE_TIMEOUT_MSG:
1897 msgContent += "active timeout";
1898 break;
1899 case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1900 msgContent += "inactive timeout";
1901 break;
1902 case AbilityManagerService::FOREGROUND_TIMEOUT_MSG:
1903 msgContent += "foreground timeout";
1904 typeId = AppExecFwk::AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT;
1905 break;
1906 case AbilityManagerService::BACKGROUND_TIMEOUT_MSG:
1907 msgContent += "background timeout";
1908 break;
1909 case AbilityManagerService::TERMINATE_TIMEOUT_MSG:
1910 msgContent += "terminate timeout";
1911 break;
1912 default:
1913 return;
1914 }
1915 std::string eventName = AppExecFwk::AppFreezeType::LIFECYCLE_TIMEOUT;
1916
1917 HILOG_WARN("LIFECYCLE_TIMEOUT: uid: %{public}d, pid: %{public}d, bundleName: %{public}s, abilityName: %{public}s,"
1918 "msg: %{public}s", processInfo.uid_, processInfo.pid_, ability->GetAbilityInfo().bundleName.c_str(),
1919 ability->GetAbilityInfo().name.c_str(), msgContent.c_str());
1920 AppExecFwk::AppfreezeManager::GetInstance()->LifecycleTimeoutHandle(
1921 typeId, processInfo.pid_, eventName, ability->GetAbilityInfo().bundleName, msgContent);
1922 }
1923
MoveToTerminatingMap(const std::shared_ptr<AbilityRecord> & abilityRecord)1924 void AbilityConnectManager::MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)
1925 {
1926 CHECK_POINTER(abilityRecord);
1927 auto& abilityInfo = abilityRecord->GetAbilityInfo();
1928 AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1929 abilityInfo.moduleName);
1930 terminatingExtensionMap_.emplace(element.GetURI(), abilityRecord);
1931 serviceMap_.erase(element.GetURI());
1932 }
1933
AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> & session)1934 void AbilityConnectManager::AddUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
1935 {
1936 CHECK_POINTER(session);
1937 auto it = uiExtRecipientMap_.find(session);
1938 if (it != uiExtRecipientMap_.end()) {
1939 HILOG_ERROR("This death recipient has been added.");
1940 return;
1941 } else {
1942 std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1943 sptr<IRemoteObject::DeathRecipient> deathRecipient =
1944 new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1945 auto abilityConnectManager = thisWeakPtr.lock();
1946 if (abilityConnectManager) {
1947 abilityConnectManager->OnUIExtWindowDied(remote);
1948 }
1949 });
1950 if (!session->AddDeathRecipient(deathRecipient)) {
1951 HILOG_ERROR("AddDeathRecipient failed.");
1952 }
1953 uiExtRecipientMap_.emplace(session, deathRecipient);
1954 }
1955 }
1956
RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> & session)1957 void AbilityConnectManager::RemoveUIExtWindowDeathRecipient(const sptr<IRemoteObject> &session)
1958 {
1959 CHECK_POINTER(session);
1960 auto it = uiExtRecipientMap_.find(session);
1961 if (it != uiExtRecipientMap_.end()) {
1962 it->first->RemoveDeathRecipient(it->second);
1963 uiExtRecipientMap_.erase(it);
1964 return;
1965 }
1966 }
1967
OnUIExtWindowDied(const wptr<IRemoteObject> & remote)1968 void AbilityConnectManager::OnUIExtWindowDied(const wptr<IRemoteObject> &remote)
1969 {
1970 auto object = remote.promote();
1971 CHECK_POINTER(object);
1972 if (taskHandler_) {
1973 auto task = [object, connectManager = shared_from_this()]() {
1974 connectManager->HandleUIExtWindowDiedTask(object);
1975 };
1976 taskHandler_->SubmitTask(task);
1977 }
1978 }
1979
HandleUIExtWindowDiedTask(const sptr<IRemoteObject> & remote)1980 void AbilityConnectManager::HandleUIExtWindowDiedTask(const sptr<IRemoteObject> &remote)
1981 {
1982 HILOG_DEBUG("call.");
1983 std::lock_guard guard(Lock_);
1984 CHECK_POINTER(remote);
1985 auto it = uiExtensionMap_.find(remote);
1986 if (it != uiExtensionMap_.end()) {
1987 auto abilityRecord = it->second.first.lock();
1988 if (abilityRecord) {
1989 CommandAbilityWindow(abilityRecord, it->second.second, WIN_CMD_DESTROY);
1990 } else {
1991 HILOG_INFO("abilityRecord is nullptr");
1992 }
1993 RemoveUIExtWindowDeathRecipient(remote);
1994 uiExtensionMap_.erase(it);
1995 } else {
1996 HILOG_INFO("Died object can't find from map.");
1997 return;
1998 }
1999 }
2000
IsUIExtensionFocused(uint32_t uiExtensionTokenId,const sptr<IRemoteObject> & focusToken)2001 bool AbilityConnectManager::IsUIExtensionFocused(uint32_t uiExtensionTokenId, const sptr<IRemoteObject>& focusToken)
2002 {
2003 std::lock_guard guard(Lock_);
2004 for (auto& item: uiExtensionMap_) {
2005 auto uiExtension = item.second.first.lock();
2006 auto sessionInfo = item.second.second;
2007 if (uiExtension && uiExtension->GetApplicationInfo().accessTokenId == uiExtensionTokenId
2008 && sessionInfo && sessionInfo->callerToken == focusToken) {
2009 return true;
2010 }
2011 }
2012 return false;
2013 }
2014
IsWindowExtensionFocused(uint32_t extensionTokenId,const sptr<IRemoteObject> & focusToken)2015 bool AbilityConnectManager::IsWindowExtensionFocused(uint32_t extensionTokenId, const sptr<IRemoteObject>& focusToken)
2016 {
2017 std::lock_guard guard(Lock_);
2018 for (auto& item: windowExtensionMap_) {
2019 uint32_t windowExtTokenId = item.second.first;
2020 auto sessionInfo = item.second.second;
2021 if (windowExtTokenId == extensionTokenId && sessionInfo && sessionInfo->callerToken == focusToken) {
2022 return true;
2023 }
2024 }
2025 return false;
2026 }
2027 } // namespace AAFwk
2028 } // namespace OHOS
2029