• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "fa_ability_thread.h"
17 
18 #include <chrono>
19 #include <functional>
20 #include <thread>
21 
22 #include "ability_context_impl.h"
23 #include "ability_impl.h"
24 #include "ability_impl_factory.h"
25 #include "ability_loader.h"
26 #include "abs_shared_result_set.h"
27 #include "application_impl.h"
28 #include "context_deal.h"
29 #include "data_ability_predicates.h"
30 #include "dataobs_mgr_client.h"
31 #ifdef WITH_DLP
32 #include "dlp_file_kits.h"
33 #endif // WITH_DLP
34 #include "freeze_util.h"
35 #include "hilog_tag_wrapper.h"
36 #include "hitrace_meter.h"
37 #include "ohos_application.h"
38 #ifdef SUPPORT_GRAPHICS
39 #include "page_ability_impl.h"
40 #endif
41 #include "time_util.h"
42 #include "ui_extension_utils.h"
43 #include "values_bucket.h"
44 
45 namespace OHOS {
46 using AbilityRuntime::FreezeUtil;
47 namespace AbilityRuntime {
48 using namespace std::chrono_literals;
49 using AbilityManagerClient = OHOS::AAFwk::AbilityManagerClient;
50 using DataObsMgrClient = OHOS::AAFwk::DataObsMgrClient;
51 namespace {
52 constexpr static char ACE_SERVICE_ABILITY_NAME[] = "AceServiceAbility";
53 constexpr static char ACE_DATA_ABILITY_NAME[] = "AceDataAbility";
54 #ifdef SUPPORT_GRAPHICS
55 constexpr static char ABILITY_NAME[] = "Ability";
56 constexpr static char ACE_ABILITY_NAME[] = "AceAbility";
57 constexpr static char ACE_FORM_ABILITY_NAME[] = "AceFormAbility";
58 constexpr static char FORM_EXTENSION[] = "FormExtension";
59 constexpr static char UI_EXTENSION[] = "UIExtensionAbility";
60 constexpr static char CUSTOM_EXTENSION[] = "ExtensionAbility";
61 constexpr static char MEDIA_CONTROL_EXTENSION[] = "MediaControlExtensionAbility";
62 constexpr static char USER_AUTH_EXTENSION[] = "UserAuthExtensionAbility";
63 constexpr static char ACTION_EXTENSION[] = "ActionExtensionAbility";
64 constexpr static char SHARE_EXTENSION[] = "ShareExtensionAbility";
65 #endif
66 constexpr static char BASE_SERVICE_EXTENSION[] = "ServiceExtension";
67 constexpr static char BASE_DRIVER_EXTENSION[] = "DriverExtension";
68 constexpr static char STATIC_SUBSCRIBER_EXTENSION[] = "StaticSubscriberExtension";
69 constexpr static char DATA_SHARE_EXT_ABILITY[] = "DataShareExtAbility";
70 constexpr static char WORK_SCHEDULER_EXTENSION[] = "WorkSchedulerExtension";
71 constexpr static char ACCESSIBILITY_EXTENSION[] = "AccessibilityExtension";
72 constexpr static char WALLPAPER_EXTENSION[] = "WallpaperExtension";
73 constexpr static char FILEACCESS_EXT_ABILITY[] = "FileAccessExtension";
74 constexpr static char ENTERPRISE_ADMIN_EXTENSION[] = "EnterpriseAdminExtension";
75 constexpr static char INPUTMETHOD_EXTENSION[] = "InputMethodExtensionAbility";
76 constexpr static char APP_ACCOUNT_AUTHORIZATION_EXTENSION[] = "AppAccountAuthorizationExtension";
77 #ifdef WITH_DLP
78 constexpr static char DLP_PARAMS_SANDBOX[] = "ohos.dlp.params.sandbox";
79 #endif // WITH_DLP
80 const int32_t PREPARE_TO_TERMINATE_TIMEOUT_MILLISECONDS = 3000;
81 }
82 
FAAbilityThread()83 FAAbilityThread::FAAbilityThread() : abilityImpl_(nullptr), currentAbility_(nullptr) {}
84 
~FAAbilityThread()85 FAAbilityThread::~FAAbilityThread()
86 {
87     if (isExtension_) {
88         if (currentExtension_) {
89             currentExtension_.reset();
90         }
91     } else {
92         if (currentAbility_) {
93             currentAbility_->DetachBaseContext();
94             currentAbility_.reset();
95         }
96     }
97 
98     DelayedSingleton<AppExecFwk::AbilityImplFactory>::DestroyInstance();
99 }
100 
CreateAbilityName(const std::shared_ptr<AppExecFwk::AbilityLocalRecord> & abilityRecord,const std::shared_ptr<AppExecFwk::OHOSApplication> & application)101 std::string FAAbilityThread::CreateAbilityName(const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
102     const std::shared_ptr<AppExecFwk::OHOSApplication> &application)
103 {
104     std::string abilityName;
105     if (abilityRecord == nullptr || application == nullptr) {
106         TAG_LOGE(AAFwkTag::FA, "abilityRecord or application is nullptr");
107         return abilityName;
108     }
109 
110     std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo = abilityRecord->GetAbilityInfo();
111     if (abilityInfo == nullptr) {
112         TAG_LOGE(AAFwkTag::FA, "null abilityInfo");
113         return abilityName;
114     }
115 
116     if (abilityInfo->isNativeAbility) {
117         TAG_LOGD(AAFwkTag::FA, "AbilityInfo name is %{public}s", abilityInfo->name.c_str());
118         return abilityInfo->name;
119     }
120 #ifdef SUPPORT_GRAPHICS
121     if (abilityInfo->type == AppExecFwk::AbilityType::PAGE) {
122         if (abilityInfo->isStageBasedModel) {
123             abilityName = ABILITY_NAME;
124         } else {
125             abilityName = ACE_ABILITY_NAME;
126         }
127     } else if (abilityInfo->type == AppExecFwk::AbilityType::SERVICE) {
128 #else
129     if (abilityInfo->type == AppExecFwk::AbilityType::SERVICE) {
130 #endif
131 #ifdef SUPPORT_GRAPHICS
132         if (abilityInfo->formEnabled == true) {
133             abilityName = ACE_FORM_ABILITY_NAME;
134         } else {
135 #endif
136             abilityName = ACE_SERVICE_ABILITY_NAME;
137 #ifdef SUPPORT_GRAPHICS
138         }
139 #endif
140     } else if (abilityInfo->type == AppExecFwk::AbilityType::DATA) {
141         abilityName = ACE_DATA_ABILITY_NAME;
142     } else if (abilityInfo->type == AppExecFwk::AbilityType::EXTENSION) {
143         CreateExtensionAbilityName(application, abilityInfo, abilityName);
144     } else {
145         abilityName = abilityInfo->name;
146     }
147 
148     TAG_LOGD(AAFwkTag::FA, "ability name is %{public}s", abilityName.c_str());
149     return abilityName;
150 }
151 
152 void FAAbilityThread::CreateExtensionAbilityName(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
153     const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo, std::string &abilityName)
154 {
155     application->GetExtensionNameByType(static_cast<int32_t>(abilityInfo->extensionAbilityType), abilityName);
156     if (abilityName.length() > 0) {
157         TAG_LOGD(AAFwkTag::FA, "extension name: %{public}s", abilityName.c_str());
158         return;
159     }
160     abilityName = BASE_SERVICE_EXTENSION;
161     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::STATICSUBSCRIBER) {
162         abilityName = STATIC_SUBSCRIBER_EXTENSION;
163     }
164     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::DRIVER) {
165         abilityName = BASE_DRIVER_EXTENSION;
166     }
167     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::DATASHARE) {
168         abilityName = DATA_SHARE_EXT_ABILITY;
169     }
170     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::WORK_SCHEDULER) {
171         abilityName = WORK_SCHEDULER_EXTENSION;
172     }
173     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::ACCESSIBILITY) {
174         abilityName = ACCESSIBILITY_EXTENSION;
175     }
176     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::WALLPAPER) {
177         abilityName = WALLPAPER_EXTENSION;
178     }
179     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION) {
180         abilityName = FILEACCESS_EXT_ABILITY;
181     }
182     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::ENTERPRISE_ADMIN) {
183         abilityName = ENTERPRISE_ADMIN_EXTENSION;
184     }
185     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::INPUTMETHOD) {
186         abilityName = INPUTMETHOD_EXTENSION;
187     }
188     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION) {
189         abilityName = APP_ACCOUNT_AUTHORIZATION_EXTENSION;
190     }
191     CreateExtensionAbilityNameSupportGraphics(abilityInfo, abilityName);
192     TAG_LOGD(AAFwkTag::FA, "extension abilityName: %{public}s", abilityName.c_str());
193 }
194 
195 void FAAbilityThread::CreateExtensionAbilityNameSupportGraphics(
196     const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo,
197     std::string &abilityName)
198 {
199 #ifdef SUPPORT_GRAPHICS
200     if (abilityInfo->formEnabled || abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::FORM) {
201         abilityName = FORM_EXTENSION;
202     }
203 #endif
204     if (AAFwk::UIExtensionUtils::IsUIExtension(abilityInfo->extensionAbilityType)) {
205         if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::SHARE) {
206             abilityName = SHARE_EXTENSION;
207         } else if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::ACTION) {
208             abilityName = ACTION_EXTENSION;
209         } else {
210             abilityName = UI_EXTENSION;
211         }
212     }
213     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::SYSDIALOG_USERAUTH) {
214         abilityName = USER_AUTH_EXTENSION;
215     }
216     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::SYSPICKER_MEDIACONTROL) {
217         abilityName = MEDIA_CONTROL_EXTENSION;
218     }
219     if (abilityInfo->extensionAbilityType == AppExecFwk::ExtensionAbilityType::UNSPECIFIED &&
220         abilityInfo->type == AppExecFwk::AbilityType::EXTENSION) {
221         abilityName = abilityInfo->extensionTypeName + CUSTOM_EXTENSION;
222     }
223 }
224 
225 std::shared_ptr<AppExecFwk::ContextDeal> FAAbilityThread::CreateAndInitContextDeal(
226     const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
227     const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
228     const std::shared_ptr<AppExecFwk::AbilityContext> &abilityObject)
229 {
230     TAG_LOGD(AAFwkTag::FA, "begin");
231     std::shared_ptr<AppExecFwk::ContextDeal> contextDeal = nullptr;
232     if ((application == nullptr) || (abilityRecord == nullptr) || (abilityObject == nullptr)) {
233         TAG_LOGE(AAFwkTag::FA, "application or abilityRecord or abilityObject is nullptr");
234         return contextDeal;
235     }
236 
237     contextDeal = std::make_shared<AppExecFwk::ContextDeal>();
238     contextDeal->SetAbilityInfo(abilityRecord->GetAbilityInfo());
239     contextDeal->SetApplicationInfo(application->GetApplicationInfo());
240     abilityObject->SetProcessInfo(application->GetProcessInfo());
241 
242     std::shared_ptr<AppExecFwk::Context> tmpContext = application->GetApplicationContext();
243     contextDeal->SetApplicationContext(tmpContext);
244 
245     contextDeal->SetBundleCodePath(abilityRecord->GetAbilityInfo()->codePath);
246     contextDeal->SetContext(abilityObject);
247     return contextDeal;
248 }
249 
250 void FAAbilityThread::Attach(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
251     const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
252     const std::shared_ptr<AppExecFwk::EventRunner> &mainRunner, const std::shared_ptr<Context> &stageContext)
253 {
254     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
255     if ((application == nullptr) || (abilityRecord == nullptr) || (mainRunner == nullptr)) {
256         TAG_LOGE(AAFwkTag::FA, "application or abilityRecord or mainRunner is nullptr");
257         return;
258     }
259     InitExtensionFlag(abilityRecord);
260     if (isExtension_) {
261         AttachExtension(application, abilityRecord, mainRunner);
262         TAG_LOGD(AAFwkTag::FA, "Execute AttachExtension");
263         return;
264     }
265 
266     // 1.new AbilityHandler
267     std::string abilityName = CreateAbilityName(abilityRecord, application);
268     if (abilityName.empty()) {
269         TAG_LOGE(AAFwkTag::FA, "abilityName is empty");
270         return;
271     }
272     TAG_LOGD(AAFwkTag::FA, "begin ability: %{public}s", abilityRecord->GetAbilityInfo()->name.c_str());
273     abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(mainRunner);
274     if (abilityHandler_ == nullptr) {
275         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
276         return;
277     }
278 
279     // 2.new ability
280     auto ability = AppExecFwk::AbilityLoader::GetInstance().GetAbilityByName(abilityName);
281     if (ability == nullptr) {
282         TAG_LOGE(AAFwkTag::FA, "null ability");
283         return;
284     }
285     currentAbility_.reset(ability);
286     token_ = abilityRecord->GetToken();
287     abilityRecord->SetEventHandler(abilityHandler_);
288     abilityRecord->SetEventRunner(mainRunner);
289     abilityRecord->SetAbilityThread(this);
290     std::shared_ptr<AppExecFwk::AbilityContext> abilityObject = currentAbility_;
291     std::shared_ptr<AppExecFwk::ContextDeal> contextDeal =
292         CreateAndInitContextDeal(application, abilityRecord, abilityObject);
293     ability->AttachBaseContext(contextDeal);
294     // new hap requires
295     ability->AttachAbilityContext(
296         BuildAbilityContext(abilityRecord->GetAbilityInfo(), application, token_, stageContext));
297 
298     AttachInner(application, abilityRecord, stageContext);
299 }
300 
301 void FAAbilityThread::AttachInner(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
302     const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
303     const std::shared_ptr<Context> &stageContext)
304 {
305     // 3.new abilityImpl
306     abilityImpl_ = DelayedSingleton<AppExecFwk::AbilityImplFactory>::GetInstance()->MakeAbilityImplObject(
307         abilityRecord->GetAbilityInfo());
308     if (abilityImpl_ == nullptr) {
309         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
310         return;
311     }
312     abilityImpl_->Init(application, abilityRecord, currentAbility_, abilityHandler_, token_);
313     // 4. ability attach : ipc
314     TAG_LOGD(AAFwkTag::FA, "attach ability");
315     FreezeUtil::LifecycleFlow flow = { token_, FreezeUtil::TimeoutState::LOAD };
316     std::string entry = "AbilityThread::Attach; the load lifecycle.";
317     FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
318     ErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);
319     if (err != ERR_OK) {
320         TAG_LOGE(AAFwkTag::FA, "err = %{public}d", err);
321         return;
322     }
323     FreezeUtil::GetInstance().DeleteLifecycleEvent(flow);
324     FreezeUtil::GetInstance().DeleteAppLifecycleEvent(0);
325 }
326 
327 void FAAbilityThread::AttachExtension(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
328     const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord,
329     const std::shared_ptr<AppExecFwk::EventRunner> &mainRunner)
330 {
331     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
332     if ((application == nullptr) || (abilityRecord == nullptr) || (mainRunner == nullptr)) {
333         TAG_LOGE(AAFwkTag::FA, "application or abilityRecord or mainRunner is nullptr");
334         return;
335     }
336 
337     // 1.new AbilityHandler
338     std::string abilityName = CreateAbilityName(abilityRecord, application);
339     if (abilityName.empty()) {
340         TAG_LOGE(AAFwkTag::FA, "empty abilityName");
341         return;
342     }
343     TAG_LOGD(AAFwkTag::FA, "extension: %{public}s", abilityRecord->GetAbilityInfo()->name.c_str());
344     abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(mainRunner);
345     if (abilityHandler_ == nullptr) {
346         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
347         return;
348     }
349 
350     // 2.new ability
351     auto extension = AppExecFwk::AbilityLoader::GetInstance().GetExtensionByName(abilityName);
352     if (extension == nullptr) {
353         TAG_LOGE(AAFwkTag::FA, "extension is nullptr");
354         return;
355     }
356 
357     currentExtension_.reset(extension);
358     token_ = abilityRecord->GetToken();
359     abilityRecord->SetEventHandler(abilityHandler_);
360     abilityRecord->SetEventRunner(mainRunner);
361     abilityRecord->SetAbilityThread(this);
362     extensionImpl_ = std::make_shared<ExtensionImpl>();
363     if (extensionImpl_ == nullptr) {
364         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
365         return;
366     }
367     // 3.new init
368     extensionImpl_->Init(application, abilityRecord, currentExtension_, abilityHandler_, token_);
369     // 4.ipc attach init
370     ErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);
371     if (err != ERR_OK) {
372         TAG_LOGE(AAFwkTag::FA, "err = %{public}d", err);
373     }
374 }
375 
376 void FAAbilityThread::AttachExtension(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
377     const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord)
378 {
379     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
380     TAG_LOGD(AAFwkTag::FA, "begin");
381     if ((application == nullptr) || (abilityRecord == nullptr)) {
382         TAG_LOGE(AAFwkTag::FA, "application or abilityRecord is nullptr");
383         return;
384     }
385 
386     // 1.new AbilityHandler
387     std::string abilityName = CreateAbilityName(abilityRecord, application);
388     runner_ = AppExecFwk::EventRunner::Create(abilityName);
389     if (runner_ == nullptr) {
390         TAG_LOGE(AAFwkTag::FA, "runner is nullptr");
391         return;
392     }
393     abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(runner_);
394     if (abilityHandler_ == nullptr) {
395         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
396         return;
397     }
398 
399     // 2.new ability
400     auto extension = AppExecFwk::AbilityLoader::GetInstance().GetExtensionByName(abilityName);
401     if (extension == nullptr) {
402         TAG_LOGE(AAFwkTag::FA, "extension is nullptr");
403         return;
404     }
405 
406     currentExtension_.reset(extension);
407     token_ = abilityRecord->GetToken();
408     abilityRecord->SetEventHandler(abilityHandler_);
409     abilityRecord->SetEventRunner(runner_);
410     abilityRecord->SetAbilityThread(this);
411     extensionImpl_ = std::make_shared<ExtensionImpl>();
412     if (extensionImpl_ == nullptr) {
413         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
414         return;
415     }
416     // 3.new init
417     extensionImpl_->Init(application, abilityRecord, currentExtension_, abilityHandler_, token_);
418     // 4.ipc attach init
419     ErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);
420     if (err != ERR_OK) {
421         TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
422         return;
423     }
424 }
425 
426 void FAAbilityThread::Attach(const std::shared_ptr<AppExecFwk::OHOSApplication> &application,
427     const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord, const std::shared_ptr<Context> &stageContext)
428 {
429     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
430     TAG_LOGD(AAFwkTag::FA, "begin");
431     if ((application == nullptr) || (abilityRecord == nullptr)) {
432         TAG_LOGE(AAFwkTag::FA, "application or abilityRecord is nullptr");
433         return;
434     }
435     InitExtensionFlag(abilityRecord);
436     if (isExtension_) {
437         AttachExtension(application, abilityRecord);
438         TAG_LOGD(AAFwkTag::FA, "Execute AttachExtension");
439         return;
440     }
441 
442     // 1.new AbilityHandler
443     std::string abilityName = CreateAbilityName(abilityRecord, application);
444     runner_ = AppExecFwk::EventRunner::Create(abilityName);
445     if (runner_ == nullptr) {
446         TAG_LOGE(AAFwkTag::FA, "null runner_");
447         return;
448     }
449     abilityHandler_ = std::make_shared<AppExecFwk::AbilityHandler>(runner_);
450     if (abilityHandler_ == nullptr) {
451         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
452         return;
453     }
454 
455     // 2.new ability
456     auto ability = AppExecFwk::AbilityLoader::GetInstance().GetAbilityByName(abilityName);
457     if (ability == nullptr) {
458         TAG_LOGE(AAFwkTag::FA, "null ability");
459         return;
460     }
461     currentAbility_.reset(ability);
462     token_ = abilityRecord->GetToken();
463     abilityRecord->SetEventHandler(abilityHandler_);
464     abilityRecord->SetEventRunner(runner_);
465     abilityRecord->SetAbilityThread(this);
466     std::shared_ptr<AppExecFwk::AbilityContext> abilityObject = currentAbility_;
467     std::shared_ptr<AppExecFwk::ContextDeal> contextDeal =
468         CreateAndInitContextDeal(application, abilityRecord, abilityObject);
469     ability->AttachBaseContext(contextDeal);
470     // new hap requires
471     ability->AttachAbilityContext(
472         BuildAbilityContext(abilityRecord->GetAbilityInfo(), application, token_, stageContext));
473 
474     AttachInner(application, abilityRecord, stageContext);
475 }
476 
477 void FAAbilityThread::HandleAbilityTransaction(
478     const Want &want, const LifeCycleStateInfo &lifeCycleStateInfo, sptr<AAFwk::SessionInfo> sessionInfo)
479 {
480     std::string connector = "##";
481     std::string traceName = __PRETTY_FUNCTION__ + connector + want.GetElement().GetAbilityName();
482     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, traceName);
483     TAG_LOGD(AAFwkTag::FA, "Lifecycle: name is %{public}s.", want.GetElement().GetAbilityName().c_str());
484     if (abilityImpl_ == nullptr) {
485         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
486         return;
487     }
488     std::string methodName = "HandleAbilityTransaction";
489     AddLifecycleEvent(lifeCycleStateInfo.state, methodName);
490 
491     abilityImpl_->SetCallingContext(lifeCycleStateInfo.caller.deviceId, lifeCycleStateInfo.caller.bundleName,
492         lifeCycleStateInfo.caller.abilityName, lifeCycleStateInfo.caller.moduleName);
493     abilityImpl_->HandleAbilityTransaction(want, lifeCycleStateInfo, sessionInfo);
494 }
495 
496 void FAAbilityThread::AddLifecycleEvent(uint32_t state, std::string &methodName) const
497 {
498     if (!isUIAbility_) {
499         return;
500     }
501     if (state == AAFwk::ABILITY_STATE_FOREGROUND_NEW) {
502         FreezeUtil::LifecycleFlow flow = { token_, FreezeUtil::TimeoutState::FOREGROUND };
503         std::string entry = "AbilityThread::" + methodName + "; the foreground lifecycle.";
504         FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
505     }
506     if (state == AAFwk::ABILITY_STATE_BACKGROUND_NEW) {
507         FreezeUtil::LifecycleFlow flow = { token_, FreezeUtil::TimeoutState::BACKGROUND };
508         std::string entry = "AbilityThread::" + methodName + "; the background lifecycle.";
509         FreezeUtil::GetInstance().AddLifecycleEvent(flow, entry);
510     }
511 }
512 
513 void FAAbilityThread::HandleShareData(const int32_t &uniqueId)
514 {
515     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
516     if (abilityImpl_ == nullptr) {
517         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
518         return;
519     }
520     abilityImpl_->HandleShareData(uniqueId);
521 }
522 
523 void FAAbilityThread::HandleExtensionTransaction(
524     const Want &want, const LifeCycleStateInfo &lifeCycleStateInfo, sptr<AAFwk::SessionInfo> sessionInfo)
525 {
526     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
527     TAG_LOGD(AAFwkTag::FA, "begin");
528     if (extensionImpl_ == nullptr) {
529         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
530         return;
531     }
532     extensionImpl_->HandleExtensionTransaction(want, lifeCycleStateInfo, sessionInfo);
533 }
534 
535 void FAAbilityThread::HandleConnectAbility(const Want &want)
536 {
537     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
538     TAG_LOGD(AAFwkTag::FA, "begin");
539     if (abilityImpl_ == nullptr) {
540         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
541         return;
542     }
543 
544     sptr<IRemoteObject> service = abilityImpl_->ConnectAbility(want);
545     ErrCode err = AbilityManagerClient::GetInstance()->ScheduleConnectAbilityDone(token_, service);
546     if (err != ERR_OK) {
547         TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
548     }
549 }
550 
551 void FAAbilityThread::HandleDisconnectAbility(const Want &want)
552 {
553     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
554     TAG_LOGD(AAFwkTag::FA, "begin");
555     if (abilityImpl_ == nullptr) {
556         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
557         return;
558     }
559 
560     abilityImpl_->DisconnectAbility(want);
561     ErrCode err = AbilityManagerClient::GetInstance()->ScheduleDisconnectAbilityDone(token_);
562     if (err != ERR_OK) {
563         TAG_LOGE(AAFwkTag::FA, "err = %{public}d", err);
564     }
565 }
566 
567 void FAAbilityThread::HandleCommandAbility(const Want &want, bool restart, int32_t startId)
568 {
569     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
570     TAG_LOGD(AAFwkTag::FA, "begin");
571     if (abilityImpl_ == nullptr) {
572         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
573         return;
574     }
575     abilityImpl_->CommandAbility(want, restart, startId);
576     ErrCode err = AbilityManagerClient::GetInstance()->ScheduleCommandAbilityDone(token_);
577     if (err != ERR_OK) {
578         TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
579     }
580 }
581 
582 void FAAbilityThread::HandleConnectExtension(const Want &want)
583 {
584     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
585     TAG_LOGD(AAFwkTag::FA, "begin");
586     if (extensionImpl_ == nullptr) {
587         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
588         return;
589     }
590     bool isAsyncCallback = false;
591     sptr<IRemoteObject> service = extensionImpl_->ConnectExtension(want, isAsyncCallback);
592     if (!isAsyncCallback) {
593         extensionImpl_->ConnectExtensionCallback(service);
594     }
595 }
596 
597 void FAAbilityThread::HandleDisconnectExtension(const Want &want)
598 {
599     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
600     TAG_LOGD(AAFwkTag::FA, "begin");
601     if (extensionImpl_ == nullptr) {
602         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
603         return;
604     }
605 
606     bool isAsyncCallback = false;
607     extensionImpl_->DisconnectExtension(want, isAsyncCallback);
608     if (!isAsyncCallback) {
609         extensionImpl_->DisconnectExtensionCallback();
610     }
611 }
612 
613 void FAAbilityThread::HandleCommandExtension(const Want &want, bool restart, int32_t startId)
614 {
615     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
616     TAG_LOGD(AAFwkTag::FA, "begin");
617     if (extensionImpl_ == nullptr) {
618         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
619         return;
620     }
621     extensionImpl_->CommandExtension(want, restart, startId);
622     ErrCode err = AbilityManagerClient::GetInstance()->ScheduleCommandAbilityDone(token_);
623     if (err != ERR_OK) {
624         TAG_LOGE(AAFwkTag::FA, "failed err = %{public}d", err);
625     }
626 }
627 
628 void FAAbilityThread::HandleCommandExtensionWindow(
629     const Want &want, const sptr<AAFwk::SessionInfo> &sessionInfo, AAFwk::WindowCommand winCmd)
630 {
631     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
632     TAG_LOGD(AAFwkTag::FA, "begin");
633     if (extensionImpl_ == nullptr) {
634         TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
635         return;
636     }
637     extensionImpl_->CommandExtensionWindow(want, sessionInfo, winCmd);
638 }
639 
640 void FAAbilityThread::HandleRestoreAbilityState(const AppExecFwk::PacMap &state)
641 {
642     TAG_LOGD(AAFwkTag::FA, "begin");
643     if (abilityImpl_ == nullptr) {
644         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
645         return;
646     }
647 
648     abilityImpl_->DispatchRestoreAbilityState(state);
649 }
650 
651 void FAAbilityThread::ScheduleSaveAbilityState()
652 {
653     TAG_LOGD(AAFwkTag::FA, "begin");
654     if (abilityImpl_ == nullptr) {
655         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
656         return;
657     }
658 
659     abilityImpl_->DispatchSaveAbilityState();
660 }
661 
662 void FAAbilityThread::ScheduleRestoreAbilityState(const AppExecFwk::PacMap &state)
663 {
664     TAG_LOGD(AAFwkTag::FA, "begin");
665     if (abilityImpl_ == nullptr) {
666         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
667         return;
668     }
669     abilityImpl_->DispatchRestoreAbilityState(state);
670 }
671 
672 void FAAbilityThread::ScheduleUpdateConfiguration(const AppExecFwk::Configuration &config)
673 {
674     TAG_LOGD(AAFwkTag::FA, "begin");
675     if (abilityHandler_ == nullptr) {
676         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
677         return;
678     }
679     wptr<FAAbilityThread> weak = this;
680     auto task = [weak, config]() {
681         auto abilityThread = weak.promote();
682         if (abilityThread == nullptr) {
683             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
684             return;
685         }
686 
687         if (abilityThread->isExtension_) {
688             abilityThread->HandleExtensionUpdateConfiguration(config);
689         } else {
690             abilityThread->HandleUpdateConfiguration(config);
691         }
692     };
693     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:UpdateConfiguration");
694     if (!ret) {
695         TAG_LOGE(AAFwkTag::FA, "PostTask error");
696     }
697 }
698 
699 void FAAbilityThread::HandleUpdateConfiguration(const AppExecFwk::Configuration &config)
700 {
701     TAG_LOGD(AAFwkTag::FA, "begin");
702     if (abilityImpl_ == nullptr) {
703         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
704         return;
705     }
706 
707     abilityImpl_->ScheduleUpdateConfiguration(config);
708 }
709 
710 void FAAbilityThread::HandleExtensionUpdateConfiguration(const AppExecFwk::Configuration &config)
711 {
712     TAG_LOGD(AAFwkTag::FA, "begin");
713     if (extensionImpl_ == nullptr) {
714         TAG_LOGE(AAFwkTag::FA, "null extensionImpl_");
715         return;
716     }
717 
718     extensionImpl_->ScheduleUpdateConfiguration(config);
719 }
720 
721 bool FAAbilityThread::ScheduleAbilityTransaction(
722     const Want &want, const LifeCycleStateInfo &lifeCycleStateInfo, sptr<AAFwk::SessionInfo> sessionInfo)
723 {
724     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
725     TAG_LOGD(AAFwkTag::FA, "Lifecycle: name:%{public}s,targeState:%{public}d,isNewWant:%{public}d",
726         want.GetElement().GetAbilityName().c_str(),
727         lifeCycleStateInfo.state,
728         lifeCycleStateInfo.isNewWant);
729     std::string methodName = "ScheduleAbilityTransaction";
730     AddLifecycleEvent(lifeCycleStateInfo.state, methodName);
731 
732     if (token_ == nullptr) {
733         TAG_LOGE(AAFwkTag::FA, "null token_");
734         return false;
735     }
736     if (abilityHandler_ == nullptr) {
737         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
738         return false;
739     }
740     wptr<FAAbilityThread> weak = this;
741     auto task = [weak, want, lifeCycleStateInfo, sessionInfo]() {
742         auto abilityThread = weak.promote();
743         if (abilityThread == nullptr) {
744             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
745             return;
746         }
747         if (abilityThread->isExtension_) {
748             abilityThread->HandleExtensionTransaction(want, lifeCycleStateInfo, sessionInfo);
749             Want newWant(want);
750             newWant.CloseAllFd();
751         } else {
752             abilityThread->HandleAbilityTransaction(want, lifeCycleStateInfo, sessionInfo);
753         }
754     };
755     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:AbilityTransaction");
756     if (!ret) {
757         TAG_LOGE(AAFwkTag::FA, "PostTask error");
758         return false;
759     }
760     return true;
761 }
762 
763 void FAAbilityThread::ScheduleShareData(const int32_t &uniqueId)
764 {
765     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
766     if (token_ == nullptr) {
767         TAG_LOGE(AAFwkTag::FA, "token_ is nullptr");
768         return;
769     }
770     if (abilityHandler_ == nullptr) {
771         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
772         return;
773     }
774     wptr<FAAbilityThread> weak = this;
775     auto task = [weak, uniqueId]() {
776         auto abilityThread = weak.promote();
777         if (abilityThread == nullptr) {
778             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
779             return;
780         }
781         abilityThread->HandleShareData(uniqueId);
782     };
783     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:ShareData");
784     if (!ret) {
785         TAG_LOGE(AAFwkTag::FA, "postTask error");
786     }
787 }
788 
789 void FAAbilityThread::ScheduleConnectAbility(const Want &want)
790 {
791     TAG_LOGD(AAFwkTag::FA, "begin, isExtension_: %{public}d", isExtension_);
792     if (abilityHandler_ == nullptr) {
793         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
794         return;
795     }
796     wptr<FAAbilityThread> weak = this;
797     auto task = [weak, want]() {
798         auto abilityThread = weak.promote();
799         if (abilityThread == nullptr) {
800             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
801             return;
802         }
803         if (abilityThread->isExtension_) {
804             abilityThread->HandleConnectExtension(want);
805         } else {
806             abilityThread->HandleConnectAbility(want);
807         }
808     };
809     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:ConnectAbility");
810     if (!ret) {
811         TAG_LOGE(AAFwkTag::FA, "PostTask error");
812     }
813 }
814 
815 void FAAbilityThread::ScheduleDisconnectAbility(const Want &want)
816 {
817     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
818     TAG_LOGD(AAFwkTag::FA, "begin, isExtension: %{public}d", isExtension_);
819     if (abilityHandler_ == nullptr) {
820         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
821         return;
822     }
823     wptr<FAAbilityThread> weak = this;
824     auto task = [weak, want]() {
825         auto abilityThread = weak.promote();
826         if (abilityThread == nullptr) {
827             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
828             return;
829         }
830         if (abilityThread->isExtension_) {
831             abilityThread->HandleDisconnectExtension(want);
832         } else {
833             abilityThread->HandleDisconnectAbility(want);
834         }
835     };
836     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:DisconnectAbility");
837     if (!ret) {
838         TAG_LOGE(AAFwkTag::FA, "PostTask error");
839     }
840 }
841 
842 void FAAbilityThread::ScheduleCommandAbility(const Want &want, bool restart, int startId)
843 {
844     TAG_LOGD(AAFwkTag::FA, "begin. startId: %{public}d", startId);
845     if (abilityHandler_ == nullptr) {
846         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
847         return;
848     }
849     wptr<FAAbilityThread> weak = this;
850     auto task = [weak, want, restart, startId]() {
851         auto abilityThread = weak.promote();
852         if (abilityThread == nullptr) {
853             TAG_LOGE(AAFwkTag::FA, "null abilityThread");
854             return;
855         }
856         if (abilityThread->isExtension_) {
857             Want newWant(want);
858 #ifdef WITH_DLP
859             bool sandboxFlag = Security::DlpPermission::DlpFileKits::GetSandboxFlag(newWant);
860             newWant.SetParam(DLP_PARAMS_SANDBOX, sandboxFlag);
861             if (sandboxFlag) {
862                 newWant.CloseAllFd();
863             }
864 #endif // WITH_DLP
865             abilityThread->HandleCommandExtension(newWant, restart, startId);
866             newWant.CloseAllFd();
867         } else {
868             abilityThread->HandleCommandAbility(want, restart, startId);
869         }
870     };
871     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:CommandAbility");
872     if (!ret) {
873         TAG_LOGE(AAFwkTag::FA, "PostTask error");
874     }
875 }
876 
877 bool FAAbilityThread::SchedulePrepareTerminateAbility()
878 {
879     TAG_LOGD(AAFwkTag::FA, "begin");
880     if (abilityImpl_ == nullptr) {
881         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
882         return false;
883     }
884     if (abilityHandler_ == nullptr) {
885         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
886         return false;
887     }
888     if (getpid() == gettid()) {
889         bool ret = abilityImpl_->PrepareTerminateAbility();
890         TAG_LOGD(AAFwkTag::FA, "end, ret = %{public}d", ret);
891         return ret;
892     }
893     wptr<FAAbilityThread> weak = this;
894     auto task = [weak]() {
895         auto abilityThread = weak.promote();
896         if (abilityThread == nullptr) {
897             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
898             return;
899         }
900         abilityThread->HandlePrepareTermianteAbility();
901     };
902     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:PrepareTerminateAbility");
903     if (!ret) {
904         TAG_LOGE(AAFwkTag::FA, "PostTask error");
905         return false;
906     }
907 
908     std::unique_lock<std::mutex> lock(mutex_);
909     auto condition = [weak] {
910         auto abilityThread = weak.promote();
911         if (abilityThread == nullptr) {
912             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
913             return false;
914         }
915         return abilityThread->isPrepareTerminateAbilityDone_.load();
916     };
917     if (!cv_.wait_for(lock, std::chrono::milliseconds(PREPARE_TO_TERMINATE_TIMEOUT_MILLISECONDS), condition)) {
918         TAG_LOGW(AAFwkTag::FA, "Wait timeout");
919     }
920     TAG_LOGD(AAFwkTag::FA, "end, ret = %{public}d", isPrepareTerminate_);
921     return isPrepareTerminate_;
922 }
923 
924 void FAAbilityThread::ScheduleCommandAbilityWindow(
925     const Want &want, const sptr<AAFwk::SessionInfo> &sessionInfo, AAFwk::WindowCommand winCmd)
926 {
927     TAG_LOGD(AAFwkTag::FA, "begin");
928     if (abilityHandler_ == nullptr) {
929         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
930         return;
931     }
932     wptr<FAAbilityThread> weak = this;
933     auto task = [weak, want, sessionInfo, winCmd]() {
934         auto abilityThread = weak.promote();
935         if (abilityThread == nullptr) {
936             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
937             return;
938         }
939         abilityThread->HandleCommandExtensionWindow(want, sessionInfo, winCmd);
940     };
941     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:CommandAbilityWindow");
942     if (!ret) {
943         TAG_LOGE(AAFwkTag::FA, "PostTask error");
944     }
945 }
946 
947 void FAAbilityThread::SendResult(int requestCode, int resultCode, const Want &want)
948 {
949     TAG_LOGD(AAFwkTag::FA, "begin");
950     if (abilityHandler_ == nullptr) {
951         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
952         return;
953     }
954     wptr<FAAbilityThread> weak = this;
955     auto task = [weak, requestCode, resultCode, want]() {
956         auto abilityThread = weak.promote();
957         if (abilityThread == nullptr) {
958             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
959             return;
960         }
961         if (requestCode == -1) {
962             TAG_LOGE(AAFwkTag::FA, "requestCode is -1");
963             return;
964         }
965         if (abilityThread->isExtension_ && abilityThread->extensionImpl_ != nullptr) {
966             abilityThread->extensionImpl_->SendResult(requestCode, resultCode, want);
967             return;
968         }
969         if (!abilityThread->isExtension_ && abilityThread->abilityImpl_ != nullptr) {
970             abilityThread->abilityImpl_->SendResult(requestCode, resultCode, want);
971             return;
972         }
973         TAG_LOGE(AAFwkTag::FA, "%{public}s impl is nullptr", abilityThread->isExtension_ ? "extension" : "ability");
974     };
975     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:SendResult");
976     if (!ret) {
977         TAG_LOGE(AAFwkTag::FA, "PostTask error");
978     }
979 }
980 
981 std::vector<std::string> FAAbilityThread::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
982 {
983     TAG_LOGD(AAFwkTag::FA, "begin");
984     std::vector<std::string> types;
985     if (abilityImpl_ == nullptr) {
986         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
987         return types;
988     }
989 
990     types = abilityImpl_->GetFileTypes(uri, mimeTypeFilter);
991     return types;
992 }
993 
994 int FAAbilityThread::OpenFile(const Uri &uri, const std::string &mode)
995 {
996     TAG_LOGD(AAFwkTag::FA, "called");
997     if (abilityImpl_ == nullptr) {
998         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
999         return -1;
1000     }
1001     return abilityImpl_->OpenFile(uri, mode);
1002 }
1003 
1004 int FAAbilityThread::OpenRawFile(const Uri &uri, const std::string &mode)
1005 {
1006     TAG_LOGD(AAFwkTag::FA, "called");
1007     if (abilityImpl_ == nullptr) {
1008         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1009         return -1;
1010     }
1011 
1012     return abilityImpl_->OpenRawFile(uri, mode);
1013 }
1014 
1015 int FAAbilityThread::Insert(const Uri &uri, const NativeRdb::ValuesBucket &value)
1016 {
1017     TAG_LOGD(AAFwkTag::FA, "called");
1018     if (abilityImpl_ == nullptr) {
1019         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1020         return -1;
1021     }
1022 
1023     return abilityImpl_->Insert(uri, value);
1024 }
1025 
1026 std::shared_ptr<AppExecFwk::PacMap> FAAbilityThread::Call(
1027     const Uri &uri, const std::string &method, const std::string &arg, const AppExecFwk::PacMap &pacMap)
1028 {
1029     TAG_LOGD(AAFwkTag::FA, "called");
1030     if (abilityImpl_ == nullptr) {
1031         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1032         return nullptr;
1033     }
1034 
1035     return abilityImpl_->Call(uri, method, arg, pacMap);
1036 }
1037 
1038 int FAAbilityThread::Update(
1039     const Uri &uri, const NativeRdb::ValuesBucket &value, const NativeRdb::DataAbilityPredicates &predicates)
1040 {
1041     TAG_LOGD(AAFwkTag::FA, "called");
1042     if (abilityImpl_ == nullptr) {
1043         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1044         return -1;
1045     }
1046 
1047     return abilityImpl_->Update(uri, value, predicates);
1048 }
1049 
1050 int FAAbilityThread::Delete(const Uri &uri, const NativeRdb::DataAbilityPredicates &predicates)
1051 {
1052     TAG_LOGD(AAFwkTag::FA, "called");
1053     if (abilityImpl_ == nullptr) {
1054         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1055         return -1;
1056     }
1057     return abilityImpl_->Delete(uri, predicates);
1058 }
1059 
1060 std::shared_ptr<NativeRdb::AbsSharedResultSet> FAAbilityThread::Query(
1061     const Uri &uri, std::vector<std::string> &columns, const NativeRdb::DataAbilityPredicates &predicates)
1062 {
1063     TAG_LOGD(AAFwkTag::FA, "called");
1064     if (abilityImpl_ == nullptr) {
1065         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1066         return nullptr;
1067     }
1068 
1069     return abilityImpl_->Query(uri, columns, predicates);
1070 }
1071 
1072 std::string FAAbilityThread::GetType(const Uri &uri)
1073 {
1074     TAG_LOGD(AAFwkTag::FA, "called");
1075     std::string type;
1076     if (abilityImpl_ == nullptr) {
1077         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1078         return "";
1079     }
1080 
1081     return abilityImpl_->GetType(uri);
1082 }
1083 
1084 bool FAAbilityThread::Reload(const Uri &uri, const AppExecFwk::PacMap &extras)
1085 {
1086     TAG_LOGD(AAFwkTag::FA, "called");
1087     if (abilityImpl_ == nullptr) {
1088         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1089         return false;
1090     }
1091     return abilityImpl_->Reload(uri, extras);
1092 }
1093 
1094 int FAAbilityThread::BatchInsert(const Uri &uri, const std::vector<NativeRdb::ValuesBucket> &values)
1095 {
1096     TAG_LOGD(AAFwkTag::FA, "called");
1097     if (abilityImpl_ == nullptr) {
1098         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1099         return -1;
1100     }
1101 
1102     return abilityImpl_->BatchInsert(uri, values);
1103 }
1104 
1105 void FAAbilityThread::ContinueAbility(const std::string &deviceId, uint32_t versionCode)
1106 {
1107     TAG_LOGD(AAFwkTag::FA, "begin");
1108     if (abilityImpl_ == nullptr) {
1109         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1110         return;
1111     }
1112     abilityImpl_->ContinueAbility(deviceId, versionCode);
1113 }
1114 
1115 void FAAbilityThread::NotifyContinuationResult(int32_t result)
1116 {
1117     TAG_LOGD(AAFwkTag::FA, "begin, result: %{public}d", result);
1118     if (abilityImpl_ == nullptr) {
1119         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1120         return;
1121     }
1122     abilityImpl_->NotifyContinuationResult(result);
1123 }
1124 
1125 void FAAbilityThread::NotifyMemoryLevel(int32_t level)
1126 {
1127     TAG_LOGD(AAFwkTag::FA, "begin, result: %{public}d", level);
1128     if (isExtension_) {
1129         if (extensionImpl_ == nullptr) {
1130             TAG_LOGE(AAFwkTag::FA, "extensionImpl_ is nullptr");
1131             return;
1132         }
1133         extensionImpl_->NotifyMemoryLevel(level);
1134         return;
1135     }
1136     if (abilityImpl_ == nullptr) {
1137         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1138         return;
1139     }
1140     abilityImpl_->NotifyMemoryLevel(level);
1141 }
1142 
1143 void FAAbilityThread::InitExtensionFlag(const std::shared_ptr<AppExecFwk::AbilityLocalRecord> &abilityRecord)
1144 {
1145     TAG_LOGD(AAFwkTag::FA, "begin");
1146     if (abilityRecord == nullptr) {
1147         TAG_LOGE(AAFwkTag::FA, "abilityRecord is nullptr");
1148         return;
1149     }
1150     std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo = abilityRecord->GetAbilityInfo();
1151     if (abilityInfo == nullptr) {
1152         TAG_LOGE(AAFwkTag::FA, "null ability");
1153         return;
1154     }
1155     if (abilityInfo->type == AppExecFwk::AbilityType::EXTENSION) {
1156         TAG_LOGD(AAFwkTag::FA, "InitExtensionFlag is true");
1157         isExtension_ = true;
1158     } else {
1159         isExtension_ = false;
1160     }
1161     if (abilityInfo->type == AppExecFwk::AbilityType::PAGE) {
1162         TAG_LOGD(AAFwkTag::FA, "isUIAbility_ is assigned true");
1163         isUIAbility_ = true;
1164     }
1165 }
1166 
1167 Uri FAAbilityThread::NormalizeUri(const Uri &uri)
1168 {
1169     TAG_LOGD(AAFwkTag::FA, "begin");
1170     Uri urivalue("");
1171     if (abilityImpl_ == nullptr) {
1172         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1173         return urivalue;
1174     }
1175 
1176     urivalue = abilityImpl_->NormalizeUri(uri);
1177     return urivalue;
1178 }
1179 
1180 Uri FAAbilityThread::DenormalizeUri(const Uri &uri)
1181 {
1182     TAG_LOGD(AAFwkTag::FA, "begin");
1183     Uri urivalue("");
1184     if (abilityImpl_ == nullptr) {
1185         TAG_LOGE(AAFwkTag::FA, "abilityImpl is nullptr");
1186         return urivalue;
1187     }
1188 
1189     urivalue = abilityImpl_->DenormalizeUri(uri);
1190     return urivalue;
1191 }
1192 
1193 bool FAAbilityThread::HandleRegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1194 {
1195     auto obsMgrClient = DataObsMgrClient::GetInstance();
1196     if (obsMgrClient == nullptr) {
1197         TAG_LOGE(AAFwkTag::FA, "obsMgrClient is nullptr");
1198         return false;
1199     }
1200 
1201     ErrCode ret = obsMgrClient->RegisterObserver(uri, dataObserver);
1202     if (ret != ERR_OK) {
1203         TAG_LOGE(AAFwkTag::FA, "error %{public}d", ret);
1204         return false;
1205     }
1206     return true;
1207 }
1208 
1209 bool FAAbilityThread::HandleUnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1210 {
1211     auto obsMgrClient = DataObsMgrClient::GetInstance();
1212     if (obsMgrClient == nullptr) {
1213         TAG_LOGE(AAFwkTag::FA, "obsMgrClient is nullptr");
1214         return false;
1215     }
1216 
1217     ErrCode ret = obsMgrClient->UnregisterObserver(uri, dataObserver);
1218     if (ret != ERR_OK) {
1219         TAG_LOGE(AAFwkTag::FA, "error %{public}d", ret);
1220         return false;
1221     }
1222     return true;
1223 }
1224 
1225 bool FAAbilityThread::HandleNotifyChange(const Uri &uri)
1226 {
1227     auto obsMgrClient = DataObsMgrClient::GetInstance();
1228     if (obsMgrClient == nullptr) {
1229         TAG_LOGE(AAFwkTag::FA, "obsMgrClient is nullptr");
1230         return false;
1231     }
1232 
1233     ErrCode ret = obsMgrClient->NotifyChange(uri);
1234     if (ret != ERR_OK) {
1235         TAG_LOGE(AAFwkTag::FA, "error %{public}d", ret);
1236         return false;
1237     }
1238     return true;
1239 }
1240 
1241 bool FAAbilityThread::ScheduleRegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1242 {
1243     TAG_LOGD(AAFwkTag::FA, "called");
1244     if (abilityHandler_ == nullptr) {
1245         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1246         return false;
1247     }
1248     wptr<FAAbilityThread> weak = this;
1249     auto task = [weak, uri, dataObserver]() {
1250         auto abilityThread = weak.promote();
1251         if (abilityThread == nullptr) {
1252             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1253             return;
1254         }
1255         abilityThread->HandleRegisterObserver(uri, dataObserver);
1256     };
1257     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:RegisterObserver");
1258     if (!ret) {
1259         TAG_LOGE(AAFwkTag::FA, "PostTask error");
1260     }
1261     return ret;
1262 }
1263 
1264 bool FAAbilityThread::ScheduleUnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
1265 {
1266     TAG_LOGD(AAFwkTag::FA, "called");
1267     if (abilityHandler_ == nullptr) {
1268         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1269         return false;
1270     }
1271     wptr<FAAbilityThread> weak = this;
1272     auto task = [weak, uri, dataObserver]() {
1273         auto abilityThread = weak.promote();
1274         if (abilityThread == nullptr) {
1275             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1276             return;
1277         }
1278         abilityThread->HandleUnregisterObserver(uri, dataObserver);
1279     };
1280     bool ret = abilityHandler_->PostSyncTask(task, "FAAbilityThread:UnregisterObserver");
1281     if (!ret) {
1282         TAG_LOGE(AAFwkTag::FA, "PostTask error");
1283     }
1284     return ret;
1285 }
1286 
1287 bool FAAbilityThread::ScheduleNotifyChange(const Uri &uri)
1288 {
1289     TAG_LOGD(AAFwkTag::FA, "called");
1290     if (abilityHandler_ == nullptr) {
1291         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1292         return false;
1293     }
1294     wptr<FAAbilityThread> weak = this;
1295     auto task = [weak, uri]() {
1296         auto abilityThread = weak.promote();
1297         if (abilityThread == nullptr) {
1298             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1299             return;
1300         }
1301         abilityThread->HandleNotifyChange(uri);
1302     };
1303     bool ret = abilityHandler_->PostTask(task, "FAAbilityThread:NotifyChange");
1304     if (!ret) {
1305         TAG_LOGE(AAFwkTag::FA, "PostTask error");
1306     }
1307     return ret;
1308 }
1309 
1310 std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> FAAbilityThread::ExecuteBatch(
1311     const std::vector<std::shared_ptr<AppExecFwk::DataAbilityOperation>> &operations)
1312 {
1313     TAG_LOGD(AAFwkTag::FA, "begin");
1314     std::vector<std::shared_ptr<AppExecFwk::DataAbilityResult>> results;
1315     if (abilityImpl_ == nullptr) {
1316         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1317         results.clear();
1318         return results;
1319     }
1320     results = abilityImpl_->ExecuteBatch(operations);
1321     return results;
1322 }
1323 
1324 std::shared_ptr<AbilityContext> FAAbilityThread::BuildAbilityContext(
1325     const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo,
1326     const std::shared_ptr<AppExecFwk::OHOSApplication> &application, const sptr<IRemoteObject> &token,
1327     const std::shared_ptr<Context> &stageContext)
1328 {
1329     auto abilityContextImpl = std::make_shared<AbilityContextImpl>();
1330     if (abilityContextImpl == nullptr) {
1331         TAG_LOGE(AAFwkTag::FA, "abilityContextImpl is nullptr");
1332         return abilityContextImpl;
1333     }
1334     abilityContextImpl->SetStageContext(stageContext);
1335     abilityContextImpl->SetToken(token);
1336     abilityContextImpl->SetAbilityInfo(abilityInfo);
1337     abilityContextImpl->SetConfiguration(application->GetConfiguration());
1338     return abilityContextImpl;
1339 }
1340 
1341 void FAAbilityThread::DumpAbilityInfo(const std::vector<std::string> &params, std::vector<std::string> &info)
1342 {
1343     TAG_LOGD(AAFwkTag::FA, "begin");
1344     if (token_ == nullptr) {
1345         TAG_LOGE(AAFwkTag::FA, "token_ is nullptr");
1346         return;
1347     }
1348     if (abilityHandler_ == nullptr) {
1349         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1350         return;
1351     }
1352     wptr<FAAbilityThread> weak = this;
1353     auto task = [weak, params, token = token_]() {
1354         auto abilityThread = weak.promote();
1355         if (abilityThread == nullptr) {
1356             TAG_LOGE(AAFwkTag::FA, "abilityThread is nullptr");
1357             return;
1358         }
1359         std::vector<std::string> dumpInfo;
1360         abilityThread->DumpAbilityInfoInner(params, dumpInfo);
1361         ErrCode err = AbilityManagerClient::GetInstance()->DumpAbilityInfoDone(dumpInfo, token);
1362         if (err != ERR_OK) {
1363             TAG_LOGE(AAFwkTag::FA, "failed = %{public}d", err);
1364         }
1365     };
1366     abilityHandler_->PostTask(task, "FAAbilityThread:DumpAbilityInfo");
1367 }
1368 
1369 #ifdef SUPPORT_GRAPHICS
1370 void FAAbilityThread::DumpAbilityInfoInner(const std::vector<std::string> &params, std::vector<std::string> &info)
1371 {
1372     TAG_LOGD(AAFwkTag::FA, "begin");
1373     if (currentAbility_ == nullptr && currentExtension_ == nullptr) {
1374         TAG_LOGD(AAFwkTag::FA, "currentAbility and currentExtension_ is nullptr");
1375         return;
1376     }
1377     if (currentAbility_ != nullptr) {
1378         if (abilityImpl_->IsStageBasedModel()) {
1379             auto scene = currentAbility_->GetScene();
1380             if (scene == nullptr) {
1381                 TAG_LOGE(AAFwkTag::FA, "scene is nullptr");
1382                 return;
1383             }
1384             auto window = scene->GetMainWindow();
1385             if (window == nullptr) {
1386                 TAG_LOGE(AAFwkTag::FA, "window is nullptr");
1387                 return;
1388             }
1389             window->DumpInfo(params, info);
1390         }
1391         currentAbility_->Dump(params, info);
1392     }
1393     if (currentExtension_ != nullptr) {
1394         currentExtension_->Dump(params, info);
1395     }
1396     if (params.empty()) {
1397         DumpOtherInfo(info);
1398         return;
1399     }
1400 }
1401 #else
1402 void FAAbilityThread::DumpAbilityInfoInner(const std::vector<std::string> &params, std::vector<std::string> &info)
1403 {
1404     TAG_LOGD(AAFwkTag::FA, "begin");
1405     if (currentAbility_ != nullptr) {
1406         currentAbility_->Dump(params, info);
1407     }
1408 
1409     if (currentExtension_ != nullptr) {
1410         currentExtension_->Dump(params, info);
1411     }
1412     DumpOtherInfo(info);
1413 }
1414 #endif
1415 
1416 void FAAbilityThread::DumpOtherInfo(std::vector<std::string> &info)
1417 {
1418     std::string dumpInfo = "        event:";
1419     info.push_back(dumpInfo);
1420     if (abilityHandler_ == nullptr) {
1421         TAG_LOGD(AAFwkTag::FA, "null abilityHandler_");
1422         return;
1423     }
1424     auto runner = abilityHandler_->GetEventRunner();
1425     if (runner == nullptr) {
1426         TAG_LOGD(AAFwkTag::FA, "null runner_");
1427         return;
1428     }
1429     dumpInfo = "";
1430     runner->DumpRunnerInfo(dumpInfo);
1431     info.push_back(dumpInfo);
1432     if (currentAbility_ != nullptr) {
1433         const auto ablityContext = currentAbility_->GetAbilityContext();
1434         if (ablityContext == nullptr) {
1435             TAG_LOGD(AAFwkTag::FA, "abilitycontext is nullptr");
1436             return;
1437         }
1438         const auto localCallContainer = ablityContext->GetLocalCallContainer();
1439         if (localCallContainer == nullptr) {
1440             TAG_LOGD(AAFwkTag::FA, "localCallContainer is nullptr");
1441             return;
1442         }
1443         localCallContainer->DumpCalls(info);
1444     }
1445 }
1446 
1447 void FAAbilityThread::CallRequest()
1448 {
1449     TAG_LOGD(AAFwkTag::FA, "begin");
1450     if (currentAbility_ == nullptr) {
1451         TAG_LOGE(AAFwkTag::FA, "null ability");
1452         return;
1453     }
1454     if (abilityHandler_ == nullptr) {
1455         TAG_LOGE(AAFwkTag::FA, "null abilityHandler_");
1456         return;
1457     }
1458 
1459     sptr<IRemoteObject> retval = nullptr;
1460     std::weak_ptr<OHOS::AppExecFwk::Ability> weakAbility = currentAbility_;
1461     auto syncTask = [ability = weakAbility, &retval]() {
1462         auto currentAbility = ability.lock();
1463         if (currentAbility == nullptr) {
1464             TAG_LOGE(AAFwkTag::FA, "null ability");
1465             return;
1466         }
1467 
1468         retval = currentAbility->CallRequest();
1469     };
1470     abilityHandler_->PostSyncTask(syncTask, "FAAbilityThread:CallRequest");
1471     AbilityManagerClient::GetInstance()->CallRequestDone(token_, retval);
1472 }
1473 
1474 void FAAbilityThread::HandlePrepareTermianteAbility()
1475 {
1476     std::unique_lock<std::mutex> lock(mutex_);
1477     if (abilityImpl_ == nullptr) {
1478         TAG_LOGE(AAFwkTag::FA, "null abilityImpl_");
1479         return;
1480     }
1481     isPrepareTerminate_ = abilityImpl_->PrepareTerminateAbility();
1482     TAG_LOGD(AAFwkTag::FA, "end, ret = %{public}d", isPrepareTerminate_);
1483     isPrepareTerminateAbilityDone_.store(true);
1484     cv_.notify_all();
1485 }
1486 
1487 int FAAbilityThread::CreateModalUIExtension(const Want &want)
1488 {
1489     TAG_LOGD(AAFwkTag::FA, "Call");
1490     if (currentAbility_ == nullptr) {
1491         TAG_LOGE(AAFwkTag::FA, "current ability is nullptr");
1492         return ERR_INVALID_VALUE;
1493     }
1494     return currentAbility_->CreateModalUIExtension(want);
1495 }
1496 
1497 void FAAbilityThread::UpdateSessionToken(sptr<IRemoteObject> sessionToken)
1498 {
1499     if (currentAbility_ == nullptr) {
1500         TAG_LOGE(AAFwkTag::FA, "current ability is nullptr");
1501         return;
1502     }
1503     currentAbility_->UpdateSessionToken(sessionToken);
1504 }
1505 } // namespace AbilityRuntime
1506 } // namespace OHOS
1507