From 40d477802bd972451ff1032766dd714c3091dd1d Mon Sep 17 00:00:00 2001 From: chenzexin Date: Mon, 22 Jul 2024 11:11:37 +0800 Subject: [PATCH] UIextension schedule secure exit when timeout in application_context Signed-off-by: chenzexin Change-Id: I895bb0f9adb8ed3e4081562989b267967cd5ad0a Please enter the commit message for your changes. Lines starting Change-Id: I2fecd5fadd1c0d470f2d53715cce3012ecf8bc9d --- .../context/application_context.cpp | 17 +++++++++++++++++ frameworks/native/appkit/app/main_thread.cpp | 12 +++++++++++- .../context/application_context.h | 5 +++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/frameworks/native/appkit/ability_runtime/context/application_context.cpp b/frameworks/native/appkit/ability_runtime/context/application_context.cpp index cb10a3767f..89103146f1 100644 --- a/frameworks/native/appkit/ability_runtime/context/application_context.cpp +++ b/frameworks/native/appkit/ability_runtime/context/application_context.cpp @@ -22,6 +22,7 @@ #include "hilog_tag_wrapper.h" #include "hitrace_meter.h" #include "running_process_info.h" +#include "exit_reason.h" namespace OHOS { namespace AbilityRuntime { @@ -772,6 +773,11 @@ void ApplicationContext::RegisterAppFontObserver(AppConfigUpdateCallback appFont appFontCallback_ = appFontCallback; } +void ApplicationContext::RegisterProcessSecurityExit(AppProcessExitCallback appProcessExitCallback) +{ + appProcessExitCallback_ = appProcessExitCallback; +} + std::string ApplicationContext::GetAppRunningUniqueId() const { TAG_LOGD(AAFwkTag::APPKIT, "GetAppRunningUniqueId is %{public}s.", appRunningUniqueId_.c_str()); @@ -817,5 +823,16 @@ void ApplicationContext::SetCurrentAppMode(int32_t appMode) TAG_LOGD(AAFwkTag::APPKIT, "setCurrentAppMode is %{public}d.", appMode); appMode_ = appMode; } + +void ApplicationContext::ProcessSecurityExit(const AAFwk::ExitReason &exitReason) +{ + if (appProcessExitCallback_ == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "callback is invalid"); + return; + } + + TAG_LOGI(AAFwkTag::APPKIT, "Proc exit, reason: %{public}s", exitReason.exitMsg.c_str()); + appProcessExitCallback_(exitReason); +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/native/appkit/app/main_thread.cpp b/frameworks/native/appkit/app/main_thread.cpp index 757f2499c3..70d86fe553 100644 --- a/frameworks/native/appkit/app/main_thread.cpp +++ b/frameworks/native/appkit/app/main_thread.cpp @@ -1652,7 +1652,7 @@ void MainThread::HandleLaunchApplication(const AppLaunchData &appLaunchData, con TAG_LOGI(AAFwkTag::APPKIT, "hisysevent write result=%{public}d, send event [FRAMEWORK,PROCESS_KILL]," " pid=%{public}d, processName=%{public}s, msg=%{public}s", result, pid, processName.c_str(), KILL_REASON); - + if (ApplicationDataManager::GetInstance().NotifyUnhandledException(summary) && ApplicationDataManager::GetInstance().NotifyExceptionObject(appExecErrorObj)) { return; @@ -1672,6 +1672,16 @@ void MainThread::HandleLaunchApplication(const AppLaunchData &appLaunchData, con (static_cast(*runtime)).RegisterUncaughtExceptionHandler(expectionInfo); } #endif + wptr weak = this; + auto callback = [weak](const AAFwk::ExitReason &exitReason) { + auto appThread = weak.promote(); + if (appThread == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "Main thread is nullptr"); + } + AbilityManagerClient::GetInstance()->RecordAppExitReason(exitReason); + appThread->ScheduleProcessSecurityExit(); + }; + applicationContext->RegisterProcessSecurityExit(callback); application_->SetRuntime(std::move(runtime)); diff --git a/interfaces/kits/native/appkit/ability_runtime/context/application_context.h b/interfaces/kits/native/appkit/ability_runtime/context/application_context.h index 40c8641e14..8cfdb830ee 100644 --- a/interfaces/kits/native/appkit/ability_runtime/context/application_context.h +++ b/interfaces/kits/native/appkit/ability_runtime/context/application_context.h @@ -27,9 +27,11 @@ namespace OHOS { namespace AAFwk { class Want; +struct ExitReason; } namespace AbilityRuntime { using AppConfigUpdateCallback = std::function; +using AppProcessExitCallback = std::function; class ApplicationContext : public Context { public: ApplicationContext() = default; @@ -131,6 +133,7 @@ public: void SetApplicationInfoUpdateFlag(bool flag); void RegisterAppConfigUpdateObserver(AppConfigUpdateCallback appConfigChangeCallback); void RegisterAppFontObserver(AppConfigUpdateCallback appFontCallback); + void RegisterProcessSecurityExit(AppProcessExitCallback appProcessExitCallback); std::string GetAppRunningUniqueId() const; void SetAppRunningUniqueId(const std::string &appRunningUniqueId); @@ -139,6 +142,7 @@ public: void SetCurrentAppCloneIndex(int32_t appIndex); int32_t GetCurrentAppMode(); void SetCurrentAppMode(int32_t appIndex); + void ProcessSecurityExit(const AAFwk::ExitReason &exitReason); using SelfType = ApplicationContext; static const size_t CONTEXT_TYPE_ID; @@ -160,6 +164,7 @@ private: bool applicationInfoUpdateFlag_ = false; AppConfigUpdateCallback appConfigChangeCallback_ = nullptr; AppConfigUpdateCallback appFontCallback_ = nullptr; + AppProcessExitCallback appProcessExitCallback_ = nullptr; std::string appRunningUniqueId_; int32_t appIndex_ = 0; int32_t appMode_ = 0;