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
20 #include "ability_connect_callback_stub.h"
21 #include "ability_manager_errors.h"
22 #include "ability_manager_service.h"
23 #include "ability_util.h"
24 #include "hitrace_meter.h"
25 #include "hilog_wrapper.h"
26 #include "in_process_call_wrapper.h"
27 #include "parameter.h"
28
29 namespace OHOS {
30 namespace AAFwk {
AbilityConnectManager(int userId)31 AbilityConnectManager::AbilityConnectManager(int userId) : userId_(userId)
32 {}
33
~AbilityConnectManager()34 AbilityConnectManager::~AbilityConnectManager()
35 {}
36
StartAbility(const AbilityRequest & abilityRequest)37 int AbilityConnectManager::StartAbility(const AbilityRequest &abilityRequest)
38 {
39 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
40 std::lock_guard<std::recursive_mutex> guard(Lock_);
41 return StartAbilityLocked(abilityRequest);
42 }
43
TerminateAbility(const sptr<IRemoteObject> & token)44 int AbilityConnectManager::TerminateAbility(const sptr<IRemoteObject> &token)
45 {
46 std::lock_guard<std::recursive_mutex> guard(Lock_);
47 auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
48 MoveToTerminatingMap(abilityRecord);
49 return TerminateAbilityLocked(token);
50 }
51
TerminateAbility(const std::shared_ptr<AbilityRecord> & caller,int requestCode)52 int AbilityConnectManager::TerminateAbility(const std::shared_ptr<AbilityRecord> &caller, int requestCode)
53 {
54 HILOG_INFO("Terminate ability.");
55 std::lock_guard<std::recursive_mutex> guard(Lock_);
56
57 std::shared_ptr<AbilityRecord> targetAbility = nullptr;
58 int result = static_cast<int>(ABILITY_VISIBLE_FALSE_DENY_REQUEST);
59 std::for_each(serviceMap_.begin(),
60 serviceMap_.end(),
61 [&targetAbility, &caller, requestCode, &result](ServiceMapType::reference service) {
62 auto callerList = service.second->GetCallerRecordList();
63 for (auto &it : callerList) {
64 if (it->GetCaller() == caller && it->GetRequestCode() == requestCode) {
65 targetAbility = service.second;
66 if (targetAbility) {
67 auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
68 CHECK_POINTER(abilityMs);
69 result = abilityMs->JudgeAbilityVisibleControl(targetAbility->GetAbilityInfo());
70 }
71 break;
72 }
73 }
74 });
75
76 if (!targetAbility) {
77 HILOG_ERROR("targetAbility error.");
78 return NO_FOUND_ABILITY_BY_CALLER;
79 }
80 if (result != ERR_OK) {
81 HILOG_ERROR("%{public}s JudgeAbilityVisibleControl error.", __func__);
82 return result;
83 }
84
85 MoveToTerminatingMap(targetAbility);
86 return TerminateAbilityLocked(targetAbility->GetToken());
87 }
88
StopServiceAbility(const AbilityRequest & abilityRequest)89 int AbilityConnectManager::StopServiceAbility(const AbilityRequest &abilityRequest)
90 {
91 HILOG_INFO("Stop Service ability.");
92 std::lock_guard<std::recursive_mutex> guard(Lock_);
93 return StopServiceAbilityLocked(abilityRequest);
94 }
95
TerminateAbilityResult(const sptr<IRemoteObject> & token,int startId)96 int AbilityConnectManager::TerminateAbilityResult(const sptr<IRemoteObject> &token, int startId)
97 {
98 HILOG_INFO("Terminate ability result.");
99 std::lock_guard<std::recursive_mutex> guard(Lock_);
100 return TerminateAbilityResultLocked(token, startId);
101 }
102
StartAbilityLocked(const AbilityRequest & abilityRequest)103 int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityRequest)
104 {
105 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
106 HILOG_INFO("Start ability locked, ability_name: %{public}s",
107 abilityRequest.want.GetElement().GetURI().c_str());
108
109 std::shared_ptr<AbilityRecord> targetService;
110 bool isLoadedAbility = false;
111 GetOrCreateServiceRecord(abilityRequest, false, targetService, isLoadedAbility);
112 CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
113
114 targetService->AddCallerRecord(abilityRequest.callerToken, abilityRequest.requestCode);
115
116 if (!isLoadedAbility) {
117 LoadAbility(targetService);
118 } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
119 // It may have been started through connect
120 CommandAbility(targetService);
121 } else {
122 HILOG_ERROR("Target service is already activating.");
123 return START_SERVICE_ABILITY_ACTIVATING;
124 }
125
126 sptr<Token> token = targetService->GetToken();
127 sptr<Token> preToken = nullptr;
128 if (targetService->GetPreAbilityRecord()) {
129 preToken = targetService->GetPreAbilityRecord()->GetToken();
130 }
131 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
132 return ERR_OK;
133 }
134
TerminateAbilityLocked(const sptr<IRemoteObject> & token)135 int AbilityConnectManager::TerminateAbilityLocked(const sptr<IRemoteObject> &token)
136 {
137 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
138 HILOG_INFO("Terminate ability locked.");
139 auto abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
140 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
141
142 if (abilityRecord->IsTerminating()) {
143 HILOG_INFO("Ability is on terminating.");
144 return ERR_OK;
145 }
146
147 if (!abilityRecord->GetConnectRecordList().empty()) {
148 HILOG_INFO("Target service has been connected. Post disconnect task.");
149 auto connectRecordList = abilityRecord->GetConnectRecordList();
150 HandleTerminateDisconnectTask(connectRecordList);
151 }
152
153 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
154 HILOG_WARN("Disconnect ability terminate timeout.");
155 connectManager->HandleStopTimeoutTask(abilityRecord);
156 };
157 abilityRecord->Terminate(timeoutTask);
158
159 return ERR_OK;
160 }
161
TerminateAbilityResultLocked(const sptr<IRemoteObject> & token,int startId)162 int AbilityConnectManager::TerminateAbilityResultLocked(const sptr<IRemoteObject> &token, int startId)
163 {
164 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
165 HILOG_INFO("Terminate ability result locked, startId: %{public}d", startId);
166 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
167
168 auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
169 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
170
171 if (abilityRecord->GetStartId() != startId) {
172 HILOG_ERROR("Start id not equal.");
173 return TERMINATE_ABILITY_RESULT_FAILED;
174 }
175
176 MoveToTerminatingMap(abilityRecord);
177 return TerminateAbilityLocked(token);
178 }
179
StopServiceAbilityLocked(const AbilityRequest & abilityRequest)180 int AbilityConnectManager::StopServiceAbilityLocked(const AbilityRequest &abilityRequest)
181 {
182 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
183 HILOG_INFO("Stop service ability locked.");
184 AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
185 abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
186 auto abilityRecord = GetServiceRecordByElementName(element.GetURI());
187 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
188
189 if (abilityRecord->IsTerminating()) {
190 HILOG_INFO("Ability is on terminating.");
191 return ERR_OK;
192 }
193
194 if (!abilityRecord->GetConnectRecordList().empty()) {
195 HILOG_INFO("Target service has been connected. Post disconnect task.");
196 auto connectRecordList = abilityRecord->GetConnectRecordList();
197 HandleTerminateDisconnectTask(connectRecordList);
198 }
199
200 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
201 HILOG_WARN("Disconnect ability terminate timeout.");
202 connectManager->HandleStopTimeoutTask(abilityRecord);
203 };
204
205 MoveToTerminatingMap(abilityRecord);
206 abilityRecord->Terminate(timeoutTask);
207
208 return ERR_OK;
209 }
210
GetOrCreateServiceRecord(const AbilityRequest & abilityRequest,const bool isCreatedByConnect,std::shared_ptr<AbilityRecord> & targetService,bool & isLoadedAbility)211 void AbilityConnectManager::GetOrCreateServiceRecord(const AbilityRequest &abilityRequest,
212 const bool isCreatedByConnect, std::shared_ptr<AbilityRecord> &targetService, bool &isLoadedAbility)
213 {
214 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
215 AppExecFwk::ElementName element(abilityRequest.abilityInfo.deviceId, abilityRequest.abilityInfo.bundleName,
216 abilityRequest.abilityInfo.name, abilityRequest.abilityInfo.moduleName);
217 auto serviceMapIter = serviceMap_.find(element.GetURI());
218 if (serviceMapIter == serviceMap_.end()) {
219 targetService = AbilityRecord::CreateAbilityRecord(abilityRequest);
220 if (targetService) {
221 targetService->SetOwnerMissionUserId(userId_);
222 }
223
224 if (isCreatedByConnect && targetService != nullptr) {
225 targetService->SetCreateByConnectMode();
226 }
227 if (targetService && abilityRequest.abilityInfo.name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
228 targetService->SetLauncherRoot();
229 targetService->SetKeepAlive();
230 targetService->SetRestartTime(abilityRequest.restartTime);
231 targetService->SetRestartCount(abilityRequest.restartCount);
232 } else if (IsAbilityNeedKeepAlive(targetService)) {
233 targetService->SetKeepAlive();
234 targetService->SetRestartTime(abilityRequest.restartTime);
235 targetService->SetRestartCount(abilityRequest.restartCount);
236 }
237 serviceMap_.emplace(element.GetURI(), targetService);
238 isLoadedAbility = false;
239 } else {
240 targetService = serviceMapIter->second;
241 if (targetService != nullptr) {
242 // want may be changed for the same ability.
243 targetService->SetWant(abilityRequest.want);
244 }
245 isLoadedAbility = true;
246 }
247 }
248
GetConnectRecordListFromMap(const sptr<IAbilityConnection> & connect,std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)249 void AbilityConnectManager::GetConnectRecordListFromMap(
250 const sptr<IAbilityConnection> &connect, std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
251 {
252 auto connectMapIter = connectMap_.find(connect->AsObject());
253 if (connectMapIter != connectMap_.end()) {
254 connectRecordList = connectMapIter->second;
255 }
256 }
257
ConnectAbilityLocked(const AbilityRequest & abilityRequest,const sptr<IAbilityConnection> & connect,const sptr<IRemoteObject> & callerToken)258 int AbilityConnectManager::ConnectAbilityLocked(const AbilityRequest &abilityRequest,
259 const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken)
260 {
261 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
262 HILOG_DEBUG("Connect ability called, callee:%{public}s.", abilityRequest.want.GetElement().GetURI().c_str());
263 std::lock_guard<std::recursive_mutex> guard(Lock_);
264
265 // 1. get target service ability record, and check whether it has been loaded.
266 std::shared_ptr<AbilityRecord> targetService;
267 bool isLoadedAbility = false;
268 GetOrCreateServiceRecord(abilityRequest, true, targetService, isLoadedAbility);
269 CHECK_POINTER_AND_RETURN(targetService, ERR_INVALID_VALUE);
270 // 2. get target connectRecordList, and check whether this callback has been connected.
271 ConnectListType connectRecordList;
272 GetConnectRecordListFromMap(connect, connectRecordList);
273 bool isCallbackConnected = !connectRecordList.empty();
274 // 3. If this service ability and callback has been connected, There is no need to connect repeatedly
275 if (isLoadedAbility && (isCallbackConnected) && IsAbilityConnected(targetService, connectRecordList)) {
276 HILOG_INFO("Service and callback was connected.");
277 return ERR_OK;
278 }
279
280 // 4. Other cases , need to connect the service ability
281 auto connectRecord = ConnectionRecord::CreateConnectionRecord(callerToken, targetService, connect);
282 CHECK_POINTER_AND_RETURN(connectRecord, ERR_INVALID_VALUE);
283 connectRecord->AttachCallerInfo();
284 connectRecord->SetConnectState(ConnectionState::CONNECTING);
285 targetService->AddConnectRecordToList(connectRecord);
286 connectRecordList.push_back(connectRecord);
287 if (isCallbackConnected) {
288 RemoveConnectDeathRecipient(connect);
289 connectMap_.erase(connectMap_.find(connect->AsObject()));
290 }
291 AddConnectDeathRecipient(connect);
292 connectMap_.emplace(connect->AsObject(), connectRecordList);
293
294 // 5. load or connect ability
295 int ret = ERR_OK;
296 if (!isLoadedAbility) {
297 LoadAbility(targetService);
298 } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) {
299 // this service ability has not first connect
300 if (targetService->GetConnectRecordList().size() > 1) {
301 if (eventHandler_ != nullptr) {
302 auto task = [connectRecord]() { connectRecord->CompleteConnect(ERR_OK); };
303 eventHandler_->PostTask(task);
304 }
305 } else {
306 ConnectAbility(targetService);
307 }
308 } else {
309 HILOG_INFO("Target service ability is activating, just wait for callback");
310 }
311
312 auto token = targetService->GetToken();
313 auto preToken = iface_cast<Token>(connectRecord->GetToken());
314 DelayedSingleton<AppScheduler>::GetInstance()->AbilityBehaviorAnalysis(token, preToken, 0, 1, 1);
315 return ret;
316 }
317
DisconnectAbilityLocked(const sptr<IAbilityConnection> & connect)318 int AbilityConnectManager::DisconnectAbilityLocked(const sptr<IAbilityConnection> &connect)
319 {
320 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
321 HILOG_INFO("Disconnect ability begin.");
322 std::lock_guard<std::recursive_mutex> guard(Lock_);
323
324 // 1. check whether callback was connected.
325 ConnectListType connectRecordList;
326 GetConnectRecordListFromMap(connect, connectRecordList);
327 if (connectRecordList.empty()) {
328 HILOG_ERROR("Can't find the connect list from connect map by callback.");
329 return CONNECTION_NOT_EXIST;
330 }
331
332 // 2. schedule disconnect to target service
333 for (auto &connectRecord : connectRecordList) {
334 if (connectRecord) {
335 auto abilityRecord = connectRecord->GetAbilityRecord();
336 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
337 HILOG_INFO("Disconnect ability, caller:%{public}s.", abilityRecord->GetAbilityInfo().name.c_str());
338 auto abilityMs = DelayedSingleton<AbilityManagerService>::GetInstance();
339 CHECK_POINTER_AND_RETURN(abilityMs, GET_ABILITY_SERVICE_FAILED);
340 int result = abilityMs->JudgeAbilityVisibleControl(abilityRecord->GetAbilityInfo());
341 if (result != ERR_OK) {
342 HILOG_ERROR("Judge ability visible error.");
343 return result;
344 }
345 int ret = connectRecord->DisconnectAbility();
346 if (ret != ERR_OK) {
347 HILOG_ERROR("Disconnect ability fail , ret = %{public}d.", ret);
348 return ret;
349 }
350
351 if (connectRecord->GetConnectState() == ConnectionState::DISCONNECTED) {
352 HILOG_WARN("This record: %{public}d complete disconnect directly.", connectRecord->GetRecordId());
353 connectRecord->CompleteDisconnect(ERR_OK, false);
354 RemoveConnectionRecordFromMap(connectRecord);
355 }
356 }
357 }
358
359 return ERR_OK;
360 }
361
AttachAbilityThreadLocked(const sptr<IAbilityScheduler> & scheduler,const sptr<IRemoteObject> & token)362 int AbilityConnectManager::AttachAbilityThreadLocked(
363 const sptr<IAbilityScheduler> &scheduler, const sptr<IRemoteObject> &token)
364 {
365 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
366 std::lock_guard<std::recursive_mutex> guard(Lock_);
367 auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
368 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
369 if (eventHandler_ != nullptr) {
370 int recordId = abilityRecord->GetRecordId();
371 std::string taskName = std::string("LoadTimeout_") + std::to_string(recordId);
372 eventHandler_->RemoveTask(taskName);
373 eventHandler_->RemoveEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, abilityRecord->GetEventId());
374 }
375 std::string element = abilityRecord->GetWant().GetElement().GetURI();
376 HILOG_DEBUG("Ability: %{public}s", element.c_str());
377 abilityRecord->SetScheduler(scheduler);
378 abilityRecord->Inactivate();
379
380 return ERR_OK;
381 }
382
OnAppStateChanged(const AppInfo & info)383 void AbilityConnectManager::OnAppStateChanged(const AppInfo &info)
384 {
385 std::lock_guard<std::recursive_mutex> guard(Lock_);
386 std::for_each(serviceMap_.begin(), serviceMap_.end(), [&info](ServiceMapType::reference service) {
387 if (service.second && (info.processName == service.second->GetAbilityInfo().process ||
388 info.processName == service.second->GetApplicationInfo().bundleName)) {
389 auto appName = service.second->GetApplicationInfo().name;
390 auto uid = service.second->GetAbilityInfo().applicationInfo.uid;
391 auto isExist = [&appName, &uid](
392 const AppData &appData) { return appData.appName == appName && appData.uid == uid; };
393 auto iter = std::find_if(info.appData.begin(), info.appData.end(), isExist);
394 if (iter != info.appData.end()) {
395 service.second->SetAppState(info.state);
396 }
397 }
398 });
399 }
400
AbilityTransitionDone(const sptr<IRemoteObject> & token,int state)401 int AbilityConnectManager::AbilityTransitionDone(const sptr<IRemoteObject> &token, int state)
402 {
403 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
404 std::lock_guard<std::recursive_mutex> guard(Lock_);
405 int targetState = AbilityRecord::ConvertLifeCycleToAbilityState(static_cast<AbilityLifeCycleState>(state));
406 std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast<AbilityState>(targetState));
407 std::shared_ptr<AbilityRecord> abilityRecord;
408 if (static_cast<AbilityState>(targetState) == AbilityState::INACTIVE) {
409 abilityRecord = GetExtensionByTokenFromSeriveMap(token);
410 } else if (static_cast<AbilityState>(targetState) == AbilityState::INITIAL) {
411 abilityRecord = GetExtensionByTokenFromTerminatingMap(token);
412 } else {
413 abilityRecord = nullptr;
414 }
415 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
416 std::string element = abilityRecord->GetWant().GetElement().GetURI();
417 HILOG_DEBUG("Ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str());
418
419 switch (state) {
420 case AbilityState::INACTIVE: {
421 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
422 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
423 token, AppExecFwk::AbilityState::ABILITY_STATE_CREATE);
424 } else {
425 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
426 token, AppExecFwk::ExtensionState::EXTENSION_STATE_CREATE);
427 auto preloadTask = [owner = weak_from_this(), abilityRecord] {
428 auto acm = owner.lock();
429 if (acm == nullptr) {
430 HILOG_ERROR("AbilityConnectManager is nullptr.");
431 return;
432 }
433 acm->ProcessPreload(abilityRecord);
434 };
435 if (eventHandler_ != nullptr) {
436 eventHandler_->PostTask(preloadTask);
437 }
438 }
439 return DispatchInactive(abilityRecord, state);
440 }
441 case AbilityState::INITIAL: {
442 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
443 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
444 token, AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED);
445 } else {
446 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
447 token, AppExecFwk::ExtensionState::EXTENSION_STATE_TERMINATED);
448 }
449 return DispatchTerminate(abilityRecord);
450 }
451 default: {
452 HILOG_WARN("Don't support transiting state: %{public}d", state);
453 return ERR_INVALID_VALUE;
454 }
455 }
456 }
457
ProcessPreload(const std::shared_ptr<AbilityRecord> & record) const458 void AbilityConnectManager::ProcessPreload(const std::shared_ptr<AbilityRecord> &record) const
459 {
460 auto bms = AbilityUtil::GetBundleManager();
461 CHECK_POINTER(bms);
462 auto abilityInfo = record->GetAbilityInfo();
463 Want want;
464 want.SetElementName(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, abilityInfo.moduleName);
465 auto uid = record->GetUid();
466 want.SetParam("uid", uid);
467 bms->ProcessPreload(want);
468 }
469
ScheduleConnectAbilityDoneLocked(const sptr<IRemoteObject> & token,const sptr<IRemoteObject> & remoteObject)470 int AbilityConnectManager::ScheduleConnectAbilityDoneLocked(
471 const sptr<IRemoteObject> &token, const sptr<IRemoteObject> &remoteObject)
472 {
473 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
474 std::lock_guard<std::recursive_mutex> guard(Lock_);
475 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
476
477 auto abilityRecord = Token::GetAbilityRecordByToken(token);
478 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
479
480 std::string element = abilityRecord->GetWant().GetElement().GetURI();
481 HILOG_DEBUG("Connect ability done, ability: %{public}s.", element.c_str());
482
483 if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
484 (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
485 HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
486 return INVALID_CONNECTION_STATE;
487 }
488
489 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
490 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
491 token, AppExecFwk::AbilityState::ABILITY_STATE_CONNECTED);
492 } else {
493 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
494 token, AppExecFwk::ExtensionState::EXTENSION_STATE_CONNECTED);
495 }
496
497 abilityRecord->SetConnRemoteObject(remoteObject);
498 // There may be multiple callers waiting for the connection result
499 auto connectRecordList = abilityRecord->GetConnectRecordList();
500 for (auto &connectRecord : connectRecordList) {
501 connectRecord->ScheduleConnectAbilityDone();
502 }
503
504 return ERR_OK;
505 }
506
ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> & token)507 int AbilityConnectManager::ScheduleDisconnectAbilityDoneLocked(const sptr<IRemoteObject> &token)
508 {
509 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
510 std::lock_guard<std::recursive_mutex> guard(Lock_);
511 auto abilityRecord = GetExtensionByTokenFromSeriveMap(token);
512 CHECK_POINTER_AND_RETURN(abilityRecord, CONNECTION_NOT_EXIST);
513
514 auto connect = abilityRecord->GetDisconnectingRecord();
515 CHECK_POINTER_AND_RETURN(connect, CONNECTION_NOT_EXIST);
516
517 if (!abilityRecord->IsAbilityState(AbilityState::ACTIVE)) {
518 HILOG_ERROR("The service ability state is not active ,state: %{public}d", abilityRecord->GetAbilityState());
519 return INVALID_CONNECTION_STATE;
520 }
521
522 if (abilityRecord->GetAbilityInfo().type == AbilityType::SERVICE) {
523 DelayedSingleton<AppScheduler>::GetInstance()->UpdateAbilityState(
524 token, AppExecFwk::AbilityState::ABILITY_STATE_DISCONNECTED);
525 } else {
526 DelayedSingleton<AppScheduler>::GetInstance()->UpdateExtensionState(
527 token, AppExecFwk::ExtensionState::EXTENSION_STATE_DISCONNECTED);
528 }
529
530 std::string element = abilityRecord->GetWant().GetElement().GetURI();
531 HILOG_DEBUG("Disconnect ability done, service:%{public}s.", element.c_str());
532
533 // complete disconnect and remove record from conn map
534 connect->ScheduleDisconnectAbilityDone();
535 abilityRecord->RemoveConnectRecordFromList(connect);
536 if (abilityRecord->IsConnectListEmpty() && abilityRecord->GetStartId() == 0) {
537 HILOG_INFO("Service ability has no any connection, and not started , need terminate.");
538 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
539 HILOG_WARN("Disconnect ability terminate timeout.");
540 connectManager->HandleStopTimeoutTask(abilityRecord);
541 };
542 MoveToTerminatingMap(abilityRecord);
543 abilityRecord->Terminate(timeoutTask);
544 }
545 RemoveConnectionRecordFromMap(connect);
546
547 return ERR_OK;
548 }
549
ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> & token)550 int AbilityConnectManager::ScheduleCommandAbilityDoneLocked(const sptr<IRemoteObject> &token)
551 {
552 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
553 std::lock_guard<std::recursive_mutex> guard(Lock_);
554 CHECK_POINTER_AND_RETURN(token, ERR_INVALID_VALUE);
555 auto abilityRecord = Token::GetAbilityRecordByToken(token);
556 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
557 std::string element = abilityRecord->GetWant().GetElement().GetURI();
558 HILOG_DEBUG("Ability: %{public}s", element.c_str());
559
560 if ((!abilityRecord->IsAbilityState(AbilityState::INACTIVE)) &&
561 (!abilityRecord->IsAbilityState(AbilityState::ACTIVE))) {
562 HILOG_ERROR("Ability record state is not inactive ,state: %{public}d", abilityRecord->GetAbilityState());
563 return INVALID_CONNECTION_STATE;
564 }
565 // complete command and pop waiting start ability from queue.
566 CompleteCommandAbility(abilityRecord);
567
568 return ERR_OK;
569 }
570
CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)571 void AbilityConnectManager::CompleteCommandAbility(std::shared_ptr<AbilityRecord> abilityRecord)
572 {
573 CHECK_POINTER(abilityRecord);
574
575 if (eventHandler_) {
576 int recordId = abilityRecord->GetRecordId();
577 std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
578 std::to_string(abilityRecord->GetStartId());
579 eventHandler_->RemoveTask(taskName);
580 }
581
582 abilityRecord->SetAbilityState(AbilityState::ACTIVE);
583 }
584
GetServiceRecordByElementName(const std::string & element)585 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetServiceRecordByElementName(const std::string &element)
586 {
587 std::lock_guard<std::recursive_mutex> guard(Lock_);
588 auto mapIter = serviceMap_.find(element);
589 if (mapIter != serviceMap_.end()) {
590 return mapIter->second;
591 }
592 return nullptr;
593 }
594
GetExtensionByTokenFromSeriveMap(const sptr<IRemoteObject> & token)595 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromSeriveMap(const sptr<IRemoteObject> &token)
596 {
597 std::lock_guard<std::recursive_mutex> guard(Lock_);
598 auto IsMatch = [token](auto service) {
599 if (!service.second) {
600 return false;
601 }
602 sptr<IRemoteObject> srcToken = service.second->GetToken();
603 return srcToken == token;
604 };
605 auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
606 if (serviceRecord != serviceMap_.end()) {
607 return serviceRecord->second;
608 }
609 return nullptr;
610 }
611
GetExtensionByTokenFromTerminatingMap(const sptr<IRemoteObject> & token)612 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetExtensionByTokenFromTerminatingMap(
613 const sptr<IRemoteObject> &token)
614 {
615 std::lock_guard<std::recursive_mutex> guard(Lock_);
616 auto IsMatch = [token](auto& extension) {
617 if (extension.second == nullptr) {
618 return false;
619 }
620 auto&& terminatingToken = extension.second->GetToken();
621 if (terminatingToken != nullptr) {
622 return terminatingToken->AsObject() == token;
623 }
624 return false;
625 };
626
627 auto terminatingExtensionRecord =
628 std::find_if(terminatingExtensionMap_.begin(), terminatingExtensionMap_.end(), IsMatch);
629 if (terminatingExtensionRecord != terminatingExtensionMap_.end()) {
630 return terminatingExtensionRecord->second;
631 }
632 return nullptr;
633 }
634
GetConnectRecordListByCallback(sptr<IAbilityConnection> callback)635 std::list<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRecordListByCallback(
636 sptr<IAbilityConnection> callback)
637 {
638 std::lock_guard<std::recursive_mutex> guard(Lock_);
639 std::list<std::shared_ptr<ConnectionRecord>> connectList;
640 auto connectMapIter = connectMap_.find(callback->AsObject());
641 if (connectMapIter != connectMap_.end()) {
642 connectList = connectMapIter->second;
643 }
644 return connectList;
645 }
646
GetAbilityRecordByEventId(int64_t eventId)647 std::shared_ptr<AbilityRecord> AbilityConnectManager::GetAbilityRecordByEventId(int64_t eventId)
648 {
649 std::lock_guard<std::recursive_mutex> guard(Lock_);
650 auto IsMatch = [eventId](auto service) {
651 if (!service.second) {
652 return false;
653 }
654 return eventId == service.second->GetEventId();
655 };
656 auto serviceRecord = std::find_if(serviceMap_.begin(), serviceMap_.end(), IsMatch);
657 if (serviceRecord != serviceMap_.end()) {
658 return serviceRecord->second;
659 }
660 return nullptr;
661 }
662
LoadAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)663 void AbilityConnectManager::LoadAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
664 {
665 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
666 CHECK_POINTER(abilityRecord);
667 abilityRecord->SetStartTime();
668
669 if (!abilityRecord->CanRestartRootLauncher()) {
670 HILOG_ERROR("Root launcher restart is out of max count.");
671 RemoveServiceAbility(abilityRecord);
672 return;
673 }
674
675 PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
676
677 sptr<Token> token = abilityRecord->GetToken();
678 sptr<Token> perToken = nullptr;
679 if (abilityRecord->IsCreateByConnect()) {
680 perToken = iface_cast<Token>(abilityRecord->GetConnectingRecord()->GetToken());
681 } else {
682 auto callerList = abilityRecord->GetCallerRecordList();
683 if (!callerList.empty() && callerList.back()) {
684 auto caller = callerList.back()->GetCaller();
685 if (caller) {
686 perToken = caller->GetToken();
687 }
688 }
689 }
690 DelayedSingleton<AppScheduler>::GetInstance()->LoadAbility(
691 token, perToken, abilityRecord->GetAbilityInfo(), abilityRecord->GetApplicationInfo(),
692 abilityRecord->GetWant());
693 }
694
PostRestartResidentTask(const AbilityRequest & abilityRequest)695 void AbilityConnectManager::PostRestartResidentTask(const AbilityRequest &abilityRequest)
696 {
697 HILOG_INFO("PostRestartResidentTask start.");
698 CHECK_POINTER(eventHandler_);
699 std::string taskName = std::string("RestartResident_") + std::string(abilityRequest.abilityInfo.name);
700 auto task = [abilityRequest, connectManager = shared_from_this()]() {
701 CHECK_POINTER(connectManager);
702 connectManager->HandleRestartResidentTask(abilityRequest);
703 };
704 int restartIntervalTime = 0;
705 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
706 if (abilityMgr) {
707 abilityMgr->GetRestartIntervalTime(restartIntervalTime);
708 }
709 HILOG_DEBUG("PostRestartResidentTask, time:%{public}d", restartIntervalTime);
710 eventHandler_->PostTask(task, taskName, restartIntervalTime);
711 HILOG_INFO("PostRestartResidentTask end.");
712 }
713
HandleRestartResidentTask(const AbilityRequest & abilityRequest)714 void AbilityConnectManager::HandleRestartResidentTask(const AbilityRequest &abilityRequest)
715 {
716 HILOG_INFO("HandleRestartResidentTask start.");
717 auto findRestartResidentTask = [abilityRequest](const AbilityRequest &requestInfo) {
718 return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
719 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
720 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
721 };
722 auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(), findRestartResidentTask);
723 if (findIter != restartResidentTaskList_.end()) {
724 restartResidentTaskList_.erase(findIter);
725 }
726 StartAbilityLocked(abilityRequest);
727 }
728
PostTimeOutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,uint32_t messageId)729 void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, uint32_t messageId)
730 {
731 CHECK_POINTER(abilityRecord);
732 CHECK_POINTER(eventHandler_);
733 if (messageId != AbilityConnectManager::LOAD_TIMEOUT_MSG &&
734 messageId != AbilityConnectManager::CONNECT_TIMEOUT_MSG) {
735 HILOG_ERROR("Timeout task messageId is error.");
736 return;
737 }
738
739 int recordId;
740 std::string taskName;
741 int resultCode;
742 uint32_t delayTime;
743 if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) {
744 // first load ability, There is at most one connect record.
745 recordId = abilityRecord->GetRecordId();
746 taskName = std::string("LoadTimeout_") + std::to_string(recordId);
747 resultCode = LOAD_ABILITY_TIMEOUT;
748 delayTime = AbilityManagerService::LOAD_TIMEOUT;
749 } else {
750 auto connectRecord = abilityRecord->GetConnectingRecord();
751 CHECK_POINTER(connectRecord);
752 recordId = connectRecord->GetRecordId();
753 taskName = std::string("ConnectTimeout_") + std::to_string(recordId);
754 resultCode = CONNECTION_TIMEOUT;
755 delayTime = AbilityManagerService::CONNECT_TIMEOUT;
756 }
757
758 // check libc.hook_mode
759 const int bufferLen = 128;
760 char paramOutBuf[bufferLen] = {0};
761 const char *hook_mode = "startup:";
762 int ret = GetParameter("libc.hook_mode", "", paramOutBuf, bufferLen - 1);
763 if (ret > 0 && strncmp(paramOutBuf, hook_mode, strlen(hook_mode)) == 0) {
764 HILOG_DEBUG("Hook_mode: no timeoutTask");
765 return;
766 }
767
768 auto timeoutTask = [abilityRecord, connectManager = shared_from_this(), resultCode]() {
769 HILOG_WARN("Connect or load ability timeout.");
770 connectManager->HandleStartTimeoutTask(abilityRecord, resultCode);
771 };
772
773 eventHandler_->PostTask(timeoutTask, taskName, delayTime);
774 }
775
HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int resultCode)776 void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord, int resultCode)
777 {
778 HILOG_DEBUG("Complete connect or load ability timeout.");
779 std::lock_guard<std::recursive_mutex> guard(Lock_);
780 CHECK_POINTER(abilityRecord);
781 auto connectingList = abilityRecord->GetConnectingRecordList();
782 for (auto &connectRecord : connectingList) {
783 if (connectRecord == nullptr) {
784 HILOG_WARN("ConnectRecord is nullptr.");
785 continue;
786 }
787 connectRecord->CompleteDisconnect(ERR_OK, true);
788 abilityRecord->RemoveConnectRecordFromList(connectRecord);
789 RemoveConnectionRecordFromMap(connectRecord);
790 }
791
792 if (GetExtensionByTokenFromSeriveMap(abilityRecord->GetToken()) == nullptr) {
793 HILOG_ERROR("Timeojut ability record is not exist in service map.");
794 return;
795 }
796 MoveToTerminatingMap(abilityRecord);
797
798 if (resultCode == LOAD_ABILITY_TIMEOUT) {
799 HILOG_WARN("Load time out , remove target service record from services map.");
800 RemoveServiceAbility(abilityRecord);
801 if (abilityRecord->GetAbilityInfo().name != AbilityConfig::LAUNCHER_ABILITY_NAME) {
802 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
803 if (IsAbilityNeedKeepAlive(abilityRecord)) {
804 HILOG_WARN("Load time out , try to restart.");
805 RestartAbility(abilityRecord, userId_);
806 }
807 }
808 }
809
810 if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
811 // terminate the timeout root launcher.
812 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
813 if (resultCode == LOAD_ABILITY_TIMEOUT) {
814 StartRootLauncher(abilityRecord);
815 }
816 }
817 }
818
HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord)819 void AbilityConnectManager::HandleCommandTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
820 {
821 HILOG_DEBUG("HandleCommandTimeoutTask start");
822 std::lock_guard<std::recursive_mutex> guard(Lock_);
823 CHECK_POINTER(abilityRecord);
824 if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
825 HILOG_DEBUG("Handle root launcher command timeout.");
826 // terminate the timeout root launcher.
827 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(abilityRecord->GetToken());
828 }
829 HILOG_DEBUG("HandleCommandTimeoutTask end");
830 }
831
StartRootLauncher(const std::shared_ptr<AbilityRecord> & abilityRecord)832 void AbilityConnectManager::StartRootLauncher(const std::shared_ptr<AbilityRecord> &abilityRecord)
833 {
834 CHECK_POINTER(abilityRecord);
835 AbilityRequest requestInfo;
836 requestInfo.want = abilityRecord->GetWant();
837 requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
838 requestInfo.appInfo = abilityRecord->GetApplicationInfo();
839 requestInfo.restartTime = abilityRecord->GetRestartTime();
840 requestInfo.restart = true;
841 requestInfo.restartCount = abilityRecord->GetRestartCount() - 1;
842
843 HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
844 StartAbilityLocked(requestInfo);
845 }
846
HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> & abilityRecord)847 void AbilityConnectManager::HandleStopTimeoutTask(const std::shared_ptr<AbilityRecord> &abilityRecord)
848 {
849 HILOG_DEBUG("Complete stop ability timeout start.");
850 std::lock_guard<std::recursive_mutex> guard(Lock_);
851 CHECK_POINTER(abilityRecord);
852 TerminateDone(abilityRecord);
853 }
854
HandleTerminateDisconnectTask(const ConnectListType & connectlist)855 void AbilityConnectManager::HandleTerminateDisconnectTask(const ConnectListType& connectlist)
856 {
857 HILOG_DEBUG("Disconnect ability when terminate.");
858 std::lock_guard<std::recursive_mutex> guard(Lock_);
859 for (auto& connectRecord : connectlist) {
860 if (!connectRecord) {
861 continue;
862 }
863 auto targetService = connectRecord->GetAbilityRecord();
864 if (targetService) {
865 HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
866 connectRecord->CompleteDisconnect(ERR_OK, true);
867 targetService->RemoveConnectRecordFromList(connectRecord);
868 RemoveConnectionRecordFromMap(connectRecord);
869 };
870 }
871 }
872
DispatchInactive(const std::shared_ptr<AbilityRecord> & abilityRecord,int state)873 int AbilityConnectManager::DispatchInactive(const std::shared_ptr<AbilityRecord> &abilityRecord, int state)
874 {
875 CHECK_POINTER_AND_RETURN(eventHandler_, ERR_INVALID_VALUE);
876 if (!abilityRecord->IsAbilityState(AbilityState::INACTIVATING)) {
877 HILOG_ERROR("Ability transition life state error. expect %{public}d, actual %{public}d callback %{public}d",
878 AbilityState::INACTIVATING,
879 abilityRecord->GetAbilityState(),
880 state);
881 return ERR_INVALID_VALUE;
882 }
883 eventHandler_->RemoveEvent(AbilityManagerService::INACTIVE_TIMEOUT_MSG, abilityRecord->GetEventId());
884
885 // complete inactive
886 abilityRecord->SetAbilityState(AbilityState::INACTIVE);
887 if (abilityRecord->IsCreateByConnect()) {
888 ConnectAbility(abilityRecord);
889 } else {
890 CommandAbility(abilityRecord);
891 }
892
893 return ERR_OK;
894 }
895
DispatchTerminate(const std::shared_ptr<AbilityRecord> & abilityRecord)896 int AbilityConnectManager::DispatchTerminate(const std::shared_ptr<AbilityRecord> &abilityRecord)
897 {
898 // remove terminate timeout task
899 if (eventHandler_ != nullptr) {
900 eventHandler_->RemoveTask(std::to_string(abilityRecord->GetEventId()));
901 }
902 // complete terminate
903 TerminateDone(abilityRecord);
904 return ERR_OK;
905 }
906
ConnectAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)907 void AbilityConnectManager::ConnectAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
908 {
909 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
910 CHECK_POINTER(abilityRecord);
911 PostTimeOutTask(abilityRecord, AbilityConnectManager::CONNECT_TIMEOUT_MSG);
912 abilityRecord->ConnectAbility();
913 }
914
CommandAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)915 void AbilityConnectManager::CommandAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
916 {
917 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
918 if (eventHandler_ != nullptr) {
919 // first connect ability, There is at most one connect record.
920 int recordId = abilityRecord->GetRecordId();
921 abilityRecord->AddStartId();
922 std::string taskName = std::string("CommandTimeout_") + std::to_string(recordId) + std::string("_") +
923 std::to_string(abilityRecord->GetStartId());
924 auto timeoutTask = [abilityRecord, connectManager = shared_from_this()]() {
925 HILOG_ERROR("Command ability timeout. %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
926 connectManager->HandleCommandTimeoutTask(abilityRecord);
927 };
928 eventHandler_->PostTask(timeoutTask, taskName, AbilityManagerService::COMMAND_TIMEOUT);
929 // scheduling command ability
930 abilityRecord->CommandAbility();
931 }
932 }
933
TerminateDone(const std::shared_ptr<AbilityRecord> & abilityRecord)934 void AbilityConnectManager::TerminateDone(const std::shared_ptr<AbilityRecord> &abilityRecord)
935 {
936 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
937 if (!abilityRecord->IsAbilityState(AbilityState::TERMINATING)) {
938 std::string expect = AbilityRecord::ConvertAbilityState(AbilityState::TERMINATING);
939 std::string actual = AbilityRecord::ConvertAbilityState(abilityRecord->GetAbilityState());
940 HILOG_ERROR(
941 "Transition life state error. expect %{public}s, actual %{public}s", expect.c_str(), actual.c_str());
942 return;
943 }
944 DelayedSingleton<AppScheduler>::GetInstance()->TerminateAbility(abilityRecord->GetToken(), false);
945 RemoveServiceAbility(abilityRecord);
946 }
947
IsAbilityConnected(const std::shared_ptr<AbilityRecord> & abilityRecord,const std::list<std::shared_ptr<ConnectionRecord>> & connectRecordList)948 bool AbilityConnectManager::IsAbilityConnected(const std::shared_ptr<AbilityRecord> &abilityRecord,
949 const std::list<std::shared_ptr<ConnectionRecord>> &connectRecordList)
950 {
951 auto isMatch = [abilityRecord](auto connectRecord) -> bool {
952 if (abilityRecord == nullptr || connectRecord == nullptr) {
953 return false;
954 }
955 if (abilityRecord != connectRecord->GetAbilityRecord()) {
956 return false;
957 }
958 return true;
959 };
960 return std::any_of(connectRecordList.begin(), connectRecordList.end(), isMatch);
961 }
962
RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> & connection)963 void AbilityConnectManager::RemoveConnectionRecordFromMap(const std::shared_ptr<ConnectionRecord> &connection)
964 {
965 for (auto &connectCallback : connectMap_) {
966 auto &connectList = connectCallback.second;
967 auto connectRecord = std::find(connectList.begin(), connectList.end(), connection);
968 if (connectRecord != connectList.end()) {
969 HILOG_INFO("Remove connrecord(%{public}d) from maplist.", (*connectRecord)->GetRecordId());
970 connectList.remove(connection);
971 if (connectList.empty()) {
972 HILOG_INFO("Remove connlist from map.");
973 sptr<IAbilityConnection> connect = iface_cast<IAbilityConnection>(connectCallback.first);
974 RemoveConnectDeathRecipient(connect);
975 connectMap_.erase(connectCallback.first);
976 }
977 return;
978 }
979 }
980 }
981
RemoveServiceAbility(const std::shared_ptr<AbilityRecord> & abilityRecord)982 void AbilityConnectManager::RemoveServiceAbility(const std::shared_ptr<AbilityRecord> &abilityRecord)
983 {
984 CHECK_POINTER(abilityRecord);
985 auto& abilityInfo = abilityRecord->GetAbilityInfo();
986 AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
987 abilityInfo.moduleName);
988 HILOG_DEBUG("Remove service(%{public}s) from terminating map.", element.GetURI().c_str());
989 terminatingExtensionMap_.erase(element.GetURI());
990 }
991
AddConnectDeathRecipient(const sptr<IAbilityConnection> & connect)992 void AbilityConnectManager::AddConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
993 {
994 CHECK_POINTER(connect);
995 CHECK_POINTER(connect->AsObject());
996 auto it = recipientMap_.find(connect->AsObject());
997 if (it != recipientMap_.end()) {
998 HILOG_ERROR("This death recipient has been added.");
999 return;
1000 } else {
1001 std::weak_ptr<AbilityConnectManager> thisWeakPtr(shared_from_this());
1002 sptr<IRemoteObject::DeathRecipient> deathRecipient =
1003 new AbilityConnectCallbackRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
1004 auto abilityConnectManager = thisWeakPtr.lock();
1005 if (abilityConnectManager) {
1006 abilityConnectManager->OnCallBackDied(remote);
1007 }
1008 });
1009 connect->AsObject()->AddDeathRecipient(deathRecipient);
1010 recipientMap_.emplace(connect->AsObject(), deathRecipient);
1011 }
1012 }
1013
RemoveConnectDeathRecipient(const sptr<IAbilityConnection> & connect)1014 void AbilityConnectManager::RemoveConnectDeathRecipient(const sptr<IAbilityConnection> &connect)
1015 {
1016 CHECK_POINTER(connect);
1017 CHECK_POINTER(connect->AsObject());
1018 auto it = recipientMap_.find(connect->AsObject());
1019 if (it != recipientMap_.end()) {
1020 it->first->RemoveDeathRecipient(it->second);
1021 recipientMap_.erase(it);
1022 return;
1023 }
1024 }
1025
OnCallBackDied(const wptr<IRemoteObject> & remote)1026 void AbilityConnectManager::OnCallBackDied(const wptr<IRemoteObject> &remote)
1027 {
1028 auto object = remote.promote();
1029 CHECK_POINTER(object);
1030 if (eventHandler_) {
1031 auto task = [object, connectManager = shared_from_this()]() { connectManager->HandleCallBackDiedTask(object); };
1032 eventHandler_->PostTask(task, TASK_ON_CALLBACK_DIED);
1033 }
1034 }
1035
HandleCallBackDiedTask(const sptr<IRemoteObject> & connect)1036 void AbilityConnectManager::HandleCallBackDiedTask(const sptr<IRemoteObject> &connect)
1037 {
1038 HILOG_INFO("Handle call back died task.");
1039 std::lock_guard<std::recursive_mutex> guard(Lock_);
1040 CHECK_POINTER(connect);
1041 auto it = connectMap_.find(connect);
1042 if (it != connectMap_.end()) {
1043 ConnectListType connectRecordList = it->second;
1044 for (auto &connRecord : connectRecordList) {
1045 connRecord->ClearConnCallBack();
1046 }
1047 } else {
1048 HILOG_INFO("Died object can't find from conn map.");
1049 return;
1050 }
1051 sptr<IAbilityConnection> object = iface_cast<IAbilityConnection>(connect);
1052 DisconnectAbilityLocked(object);
1053 }
1054
OnAbilityDied(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1055 void AbilityConnectManager::OnAbilityDied(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1056 {
1057 HILOG_INFO("On ability died.");
1058 CHECK_POINTER(abilityRecord);
1059 if (abilityRecord->GetAbilityInfo().type != AbilityType::SERVICE &&
1060 abilityRecord->GetAbilityInfo().type != AbilityType::EXTENSION) {
1061 HILOG_DEBUG("Ability type is not service.");
1062 return;
1063 }
1064 if (eventHandler_) {
1065 auto task = [abilityRecord, connectManager = shared_from_this(), currentUserId]() {
1066 connectManager->HandleAbilityDiedTask(abilityRecord, currentUserId);
1067 };
1068 eventHandler_->PostTask(task, TASK_ON_ABILITY_DIED);
1069 }
1070 }
1071
OnTimeOut(uint32_t msgId,int64_t eventId)1072 void AbilityConnectManager::OnTimeOut(uint32_t msgId, int64_t eventId)
1073 {
1074 HILOG_DEBUG("On timeout, msgId is %{public}d", msgId);
1075 std::lock_guard<std::recursive_mutex> guard(Lock_);
1076 auto abilityRecord = GetAbilityRecordByEventId(eventId);
1077 if (abilityRecord == nullptr) {
1078 HILOG_ERROR("AbilityConnectManager on time out event: ability record is nullptr.");
1079 return;
1080 }
1081 HILOG_DEBUG("Ability timeout ,msg:%{public}d,name:%{public}s", msgId, abilityRecord->GetAbilityInfo().name.c_str());
1082
1083 switch (msgId) {
1084 case AbilityManagerService::INACTIVE_TIMEOUT_MSG:
1085 HandleInactiveTimeout(abilityRecord);
1086 break;
1087 default:
1088 break;
1089 }
1090 }
1091
HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> & ability)1092 void AbilityConnectManager::HandleInactiveTimeout(const std::shared_ptr<AbilityRecord> &ability)
1093 {
1094 HILOG_DEBUG("HandleInactiveTimeout start");
1095 std::lock_guard<std::recursive_mutex> guard(Lock_);
1096 CHECK_POINTER(ability);
1097 if (ability->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1098 HILOG_DEBUG("Handle root launcher inactive timeout.");
1099 // terminate the timeout root launcher.
1100 DelayedSingleton<AppScheduler>::GetInstance()->AttachTimeOut(ability->GetToken());
1101 }
1102
1103 HILOG_DEBUG("HandleInactiveTimeout end");
1104 }
1105
IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> & abilityRecord)1106 bool AbilityConnectManager::IsAbilityNeedKeepAlive(const std::shared_ptr<AbilityRecord> &abilityRecord)
1107 {
1108 auto bms = AbilityUtil::GetBundleManager();
1109 CHECK_POINTER_AND_RETURN(bms, false);
1110 std::vector<AppExecFwk::BundleInfo> bundleInfos;
1111 bool getBundleInfos = bms->GetBundleInfos(OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, bundleInfos, USER_ID_NO_HEAD);
1112 if (!getBundleInfos) {
1113 HILOG_ERROR("Handle ability died task, get bundle infos failed");
1114 return false;
1115 }
1116
1117 auto CheckIsAbilityNeedKeepAlive = [](const AppExecFwk::HapModuleInfo &hapModuleInfo,
1118 const std::string processName, std::string &mainElement) {
1119 if (!hapModuleInfo.isModuleJson) {
1120 // old application model
1121 mainElement = hapModuleInfo.mainAbility;
1122 for (auto abilityInfo : hapModuleInfo.abilityInfos) {
1123 if (abilityInfo.process == processName && abilityInfo.name == mainElement) {
1124 return true;
1125 }
1126 }
1127 return false;
1128 }
1129
1130 // new application model
1131 if (hapModuleInfo.process == processName) {
1132 mainElement = hapModuleInfo.mainElementName;
1133 return true;
1134 }
1135 return false;
1136 };
1137
1138 auto GetKeepAliveAbilities = [&](std::vector<std::pair<std::string, std::string>> &keepAliveAbilities) {
1139 for (size_t i = 0; i < bundleInfos.size(); i++) {
1140 std::string processName = bundleInfos[i].applicationInfo.process;
1141 if (!bundleInfos[i].isKeepAlive || processName.empty()) {
1142 continue;
1143 }
1144 std::string bundleName = bundleInfos[i].name;
1145 for (auto hapModuleInfo : bundleInfos[i].hapModuleInfos) {
1146 std::string mainElement;
1147 if (CheckIsAbilityNeedKeepAlive(hapModuleInfo, processName, mainElement) && !mainElement.empty()) {
1148 keepAliveAbilities.push_back(std::make_pair(bundleName, mainElement));
1149 }
1150 }
1151 }
1152 };
1153
1154 auto findKeepAliveAbility = [abilityRecord](const std::pair<std::string, std::string> &keepAlivePair) {
1155 return ((abilityRecord->GetAbilityInfo().bundleName == keepAlivePair.first &&
1156 abilityRecord->GetAbilityInfo().name == keepAlivePair.second) ||
1157 abilityRecord->GetAbilityInfo().name == AbilityConfig::SYSTEM_UI_ABILITY_NAME ||
1158 abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME);
1159 };
1160
1161 std::vector<std::pair<std::string, std::string>> keepAliveAbilities;
1162 GetKeepAliveAbilities(keepAliveAbilities);
1163 auto findIter = find_if(keepAliveAbilities.begin(), keepAliveAbilities.end(), findKeepAliveAbility);
1164 if (findIter != keepAliveAbilities.end()) {
1165 abilityRecord->SetKeepAlive();
1166 return true;
1167 }
1168 return false;
1169 }
1170
HandleAbilityDiedTask(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1171 void AbilityConnectManager::HandleAbilityDiedTask(
1172 const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1173 {
1174 HILOG_INFO("Handle ability died task.");
1175 std::lock_guard<std::recursive_mutex> guard(Lock_);
1176 CHECK_POINTER(abilityRecord);
1177 ConnectListType connlist = abilityRecord->GetConnectRecordList();
1178 for (auto &connectRecord : connlist) {
1179 HILOG_WARN("This record complete disconnect directly. recordId:%{public}d", connectRecord->GetRecordId());
1180 connectRecord->CompleteDisconnect(ERR_OK, true);
1181 abilityRecord->RemoveConnectRecordFromList(connectRecord);
1182 RemoveConnectionRecordFromMap(connectRecord);
1183 }
1184
1185 if (abilityRecord->IsTerminating()) {
1186 HILOG_INFO("Handle extension DiedByTerminating.");
1187 RemoveServiceAbility(abilityRecord);
1188 if (IsAbilityNeedKeepAlive(abilityRecord)) {
1189 HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1190 RestartAbility(abilityRecord, currentUserId);
1191 }
1192 return;
1193 }
1194
1195 if (GetExtensionByTokenFromSeriveMap(abilityRecord->GetToken()) == nullptr) {
1196 HILOG_ERROR("Died ability record is not exist in service map.");
1197 return;
1198 }
1199
1200 MoveToTerminatingMap(abilityRecord);
1201 RemoveServiceAbility(abilityRecord);
1202 if (IsAbilityNeedKeepAlive(abilityRecord)) {
1203 HILOG_INFO("restart ability: %{public}s", abilityRecord->GetAbilityInfo().name.c_str());
1204 RestartAbility(abilityRecord, currentUserId);
1205 }
1206 }
1207
RestartAbility(const std::shared_ptr<AbilityRecord> & abilityRecord,int32_t currentUserId)1208 void AbilityConnectManager::RestartAbility(const std::shared_ptr<AbilityRecord> &abilityRecord, int32_t currentUserId)
1209 {
1210 HILOG_INFO("Restart ability");
1211 AbilityRequest requestInfo;
1212 requestInfo.want = abilityRecord->GetWant();
1213 requestInfo.abilityInfo = abilityRecord->GetAbilityInfo();
1214 requestInfo.appInfo = abilityRecord->GetApplicationInfo();
1215 requestInfo.restartTime = abilityRecord->GetRestartTime();
1216 requestInfo.restart = true;
1217 abilityRecord->SetRestarting(true);
1218
1219 if (currentUserId != userId_ &&
1220 abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1221 HILOG_WARN("delay restart root launcher until switch user.");
1222 return;
1223 }
1224
1225 if (abilityRecord->GetAbilityInfo().name == AbilityConfig::LAUNCHER_ABILITY_NAME) {
1226 requestInfo.restartCount = abilityRecord->GetRestartCount();
1227 HILOG_DEBUG("restart root launcher, number:%{public}d", requestInfo.restartCount);
1228 StartAbilityLocked(requestInfo);
1229 return;
1230 }
1231
1232 // restart other resident ability
1233 if (abilityRecord->CanRestartResident()) {
1234 requestInfo.restartCount = abilityRecord->GetRestartCount();
1235 requestInfo.restartTime = AbilityUtil::SystemTimeMillis();
1236 StartAbilityLocked(requestInfo);
1237 } else {
1238 auto findRestartResidentTask = [requestInfo](const AbilityRequest &abilityRequest) {
1239 return (requestInfo.want.GetElement().GetBundleName() == abilityRequest.want.GetElement().GetBundleName() &&
1240 requestInfo.want.GetElement().GetModuleName() == abilityRequest.want.GetElement().GetModuleName() &&
1241 requestInfo.want.GetElement().GetAbilityName() == abilityRequest.want.GetElement().GetAbilityName());
1242 };
1243 auto findIter = find_if(restartResidentTaskList_.begin(), restartResidentTaskList_.end(),
1244 findRestartResidentTask);
1245 if (findIter != restartResidentTaskList_.end()) {
1246 HILOG_WARN("The restart task has been registered.");
1247 return;
1248 }
1249 restartResidentTaskList_.emplace_back(requestInfo);
1250 PostRestartResidentTask(requestInfo);
1251 }
1252 }
1253
DumpState(std::vector<std::string> & info,bool isClient,const std::string & args) const1254 void AbilityConnectManager::DumpState(std::vector<std::string> &info, bool isClient, const std::string &args) const
1255 {
1256 HILOG_INFO("DumpState args:%{public}s.", args.c_str());
1257 if (!args.empty()) {
1258 auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
1259 return service.first.compare(args) == 0;
1260 });
1261 if (it != serviceMap_.end()) {
1262 info.emplace_back("uri [ " + it->first + " ]");
1263 it->second->DumpService(info, isClient);
1264 } else {
1265 info.emplace_back(args + ": Nothing to dump.");
1266 }
1267 } else {
1268 auto abilityMgr = DelayedSingleton<AbilityManagerService>::GetInstance();
1269 info.emplace_back(" ExtensionRecords:");
1270 for (auto &&service : serviceMap_) {
1271 info.emplace_back(" uri [" + service.first + "]");
1272 service.second->DumpService(info, isClient);
1273 }
1274 }
1275 }
1276
DumpStateByUri(std::vector<std::string> & info,bool isClient,const std::string & args,std::vector<std::string> & params) const1277 void AbilityConnectManager::DumpStateByUri(std::vector<std::string> &info, bool isClient, const std::string &args,
1278 std::vector<std::string> ¶ms) const
1279 {
1280 HILOG_INFO("DumpState args:%{public}s, params size: %{public}zu", args.c_str(), params.size());
1281 auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) {
1282 return service.first.compare(args) == 0;
1283 });
1284 if (it != serviceMap_.end()) {
1285 info.emplace_back("uri [ " + it->first + " ]");
1286 it->second->DumpService(info, params, isClient);
1287 } else {
1288 info.emplace_back(args + ": Nothing to dump.");
1289 }
1290 }
1291
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info,const int32_t userId,bool isPerm)1292 void AbilityConnectManager::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info,
1293 const int32_t userId, bool isPerm)
1294 {
1295 HILOG_INFO("Get extension running info.");
1296 std::lock_guard<std::recursive_mutex> guard(Lock_);
1297 auto mgr = shared_from_this();
1298 auto queryInfo = [&info, upperLimit, userId, isPerm, mgr](ServiceMapType::reference service) {
1299 if (static_cast<int>(info.size()) >= upperLimit) {
1300 return;
1301 }
1302 auto abilityRecord = service.second;
1303 CHECK_POINTER(abilityRecord);
1304
1305 if (isPerm) {
1306 mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1307 } else {
1308 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1309 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1310 if (callingTokenId == tokenID) {
1311 mgr->GetExtensionRunningInfo(abilityRecord, userId, info);
1312 }
1313 }
1314 };
1315 std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1316 }
1317
GetAbilityRunningInfos(std::vector<AbilityRunningInfo> & info,bool isPerm)1318 void AbilityConnectManager::GetAbilityRunningInfos(std::vector<AbilityRunningInfo> &info, bool isPerm)
1319 {
1320 HILOG_INFO("Query running ability infos.");
1321 std::lock_guard<std::recursive_mutex> guard(Lock_);
1322
1323 auto queryInfo = [&info, isPerm](ServiceMapType::reference service) {
1324 auto abilityRecord = service.second;
1325 CHECK_POINTER(abilityRecord);
1326
1327 if (isPerm) {
1328 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1329 } else {
1330 auto callingTokenId = IPCSkeleton::GetCallingTokenID();
1331 auto tokenID = abilityRecord->GetApplicationInfo().accessTokenId;
1332 if (callingTokenId == tokenID) {
1333 DelayedSingleton<AbilityManagerService>::GetInstance()->GetAbilityRunningInfo(info, abilityRecord);
1334 }
1335 }
1336 };
1337
1338 std::for_each(serviceMap_.begin(), serviceMap_.end(), queryInfo);
1339 }
1340
GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> & abilityRecord,const int32_t userId,std::vector<ExtensionRunningInfo> & info)1341 void AbilityConnectManager::GetExtensionRunningInfo(std::shared_ptr<AbilityRecord> &abilityRecord, const int32_t userId,
1342 std::vector<ExtensionRunningInfo> &info)
1343 {
1344 ExtensionRunningInfo extensionInfo;
1345 AppExecFwk::RunningProcessInfo processInfo;
1346 extensionInfo.extension = abilityRecord->GetWant().GetElement();
1347 auto bms = AbilityUtil::GetBundleManager();
1348 CHECK_POINTER(bms);
1349 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
1350 bool queryResult = IN_PROCESS_CALL(bms->QueryExtensionAbilityInfos(abilityRecord->GetWant(),
1351 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION, userId, extensionInfos));
1352 if (queryResult) {
1353 HILOG_INFO("Query Extension Ability Infos Success.");
1354 auto abilityInfo = abilityRecord->GetAbilityInfo();
1355 auto isExist = [&abilityInfo](const AppExecFwk::ExtensionAbilityInfo &extensionInfo) {
1356 HILOG_INFO("%{public}s, %{public}s", extensionInfo.bundleName.c_str(), extensionInfo.name.c_str());
1357 return extensionInfo.bundleName == abilityInfo.bundleName && extensionInfo.name == abilityInfo.name
1358 && extensionInfo.applicationInfo.uid == abilityInfo.applicationInfo.uid;
1359 };
1360 auto infoIter = std::find_if(extensionInfos.begin(), extensionInfos.end(), isExist);
1361 if (infoIter != extensionInfos.end()) {
1362 HILOG_INFO("Get target success.");
1363 extensionInfo.type = (*infoIter).type;
1364 }
1365 }
1366 DelayedSingleton<AppScheduler>::GetInstance()->
1367 GetRunningProcessInfoByToken(abilityRecord->GetToken(), processInfo);
1368 extensionInfo.pid = processInfo.pid_;
1369 extensionInfo.uid = processInfo.uid_;
1370 extensionInfo.processName = processInfo.processName_;
1371 extensionInfo.startTime = abilityRecord->GetStartTime();
1372 ConnectListType connectRecordList = abilityRecord->GetConnectRecordList();
1373 for (auto &connectRecord : connectRecordList) {
1374 if (connectRecord == nullptr) {
1375 HILOG_DEBUG("connectRecord is nullptr.");
1376 continue;
1377 }
1378 auto callerAbilityRecord = Token::GetAbilityRecordByToken(connectRecord->GetToken());
1379 if (callerAbilityRecord == nullptr) {
1380 HILOG_DEBUG("callerAbilityRecord is nullptr.");
1381 continue;
1382 }
1383 std::string package = callerAbilityRecord->GetAbilityInfo().bundleName;
1384 extensionInfo.clientPackage.emplace_back(package);
1385 }
1386 info.emplace_back(extensionInfo);
1387 }
1388
StopAllExtensions()1389 void AbilityConnectManager::StopAllExtensions()
1390 {
1391 HILOG_INFO("StopAllExtensions begin.");
1392 std::lock_guard<std::recursive_mutex> guard(Lock_);
1393 for (auto it = serviceMap_.begin(); it != serviceMap_.end();) {
1394 auto targetExtension = it->second;
1395 if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION) {
1396 terminatingExtensionMap_.emplace(it->first, it->second);
1397 serviceMap_.erase(it++);
1398 TerminateAbilityLocked(targetExtension->GetToken());
1399 } else {
1400 it++;
1401 }
1402 }
1403 HILOG_INFO("StopAllExtensions end.");
1404 }
1405
MoveToTerminatingMap(const std::shared_ptr<AbilityRecord> & abilityRecord)1406 void AbilityConnectManager::MoveToTerminatingMap(const std::shared_ptr<AbilityRecord>& abilityRecord)
1407 {
1408 CHECK_POINTER(abilityRecord);
1409 auto& abilityInfo = abilityRecord->GetAbilityInfo();
1410 AppExecFwk::ElementName element(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
1411 abilityInfo.moduleName);
1412 terminatingExtensionMap_.emplace(element.GetURI(), abilityRecord);
1413 serviceMap_.erase(element.GetURI());
1414 }
1415 } // namespace AAFwk
1416 } // namespace OHOS
1417