diff --git a/frameworks/native/appkit/ability_runtime/context/application_context.cpp b/frameworks/native/appkit/ability_runtime/context/application_context.cpp index ed0e09aa07..ea81ff1889 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 { @@ -790,6 +791,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()); @@ -835,5 +841,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 42e5cac5bb..f907ce2e5c 100644 --- a/frameworks/native/appkit/app/main_thread.cpp +++ b/frameworks/native/appkit/app/main_thread.cpp @@ -1644,7 +1644,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; @@ -1664,6 +1664,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 1f2c48b6ef..dd03794d0b 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; @@ -133,6 +135,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); @@ -141,6 +144,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; @@ -162,6 +166,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;