diff --git a/frameworks/kits/ability/native/src/ability_thread.cpp b/frameworks/kits/ability/native/src/ability_thread.cpp index 048f9c9b51919d8365e6897de9519024343768f0..4456feff058e75664f7d36b5070978a869877cab 100644 --- a/frameworks/kits/ability/native/src/ability_thread.cpp +++ b/frameworks/kits/ability/native/src/ability_thread.cpp @@ -104,7 +104,7 @@ std::string AbilityThread::CreateAbilityName(const std::shared_ptrtype == AbilityType::EXTENSION) { abilityName = BASE_SERVICE_EXTENSION; - if (abilityInfo->formEnabled || abilityInfo->extensionAbilityType == ExtensionAbilityType::FORM) { + if (abilityInfo->formEnabled == true) { abilityName = FORM_EXTENSION; } if (abilityInfo->extensionAbilityType == ExtensionAbilityType::STATICSUBSCRIBER) { diff --git a/frameworks/kits/appkit/BUILD.gn b/frameworks/kits/appkit/BUILD.gn index e6e6681578232aa887dc331817227ae94172a94c..18dcc08285743db8d84f294783b4a13d6979d13a 100644 --- a/frameworks/kits/appkit/BUILD.gn +++ b/frameworks/kits/appkit/BUILD.gn @@ -104,6 +104,8 @@ ohos_shared_library("appkit_native") { "${aafwk_path}/common/task_dispatcher/include/threading", "${aafwk_path}/frameworks/kits/appkit/native/app/include/task", "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common", + "//base/hiviewdfx/faultloggerd/interfaces/innerkits/faultloggerd_client/include", + "//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher/include", ] configs = [ ":appkit_config" ] @@ -144,6 +146,8 @@ ohos_shared_library("appkit_native") { "${appexecfwk_path}/interfaces/innerkits/appexecfwk_base:appexecfwk_base", "${appexecfwk_path}/interfaces/innerkits/appexecfwk_core:appexecfwk_core", "${appexecfwk_path}/interfaces/innerkits/libeventhandler:libeventhandler", + "//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher:lib_dfx_dump_catcher", + "//base/hiviewdfx/faultloggerd/interfaces/innerkits/faultloggerd_client:libfaultloggerd", "//foundation/distributedschedule/dmsfwk/interfaces/innerkits/uri:zuri", "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy", "//foundation/multimodalinput/input/frameworks/proxy:libmmi-client", diff --git a/frameworks/kits/appkit/native/app/include/main_thread.h b/frameworks/kits/appkit/native/app/include/main_thread.h index c5dda20920e01550d3163a7bc49fadddf2b689e6..3140fa4a62f6ef29a888c9fda9411cd1213b5461 100644 --- a/frameworks/kits/appkit/native/app/include/main_thread.h +++ b/frameworks/kits/appkit/native/app/include/main_thread.h @@ -376,6 +376,15 @@ private: */ void Init(const std::shared_ptr &runner, const std::shared_ptr &watchDogRunner); + /** + * + * @brief The ANR process handle. + * + * @param sigMessage Recieve the sig message. + * + */ + static void HandleANRProcess(int sigMessage); + /** * * @brief Task in event handler timeout detected. @@ -429,6 +438,7 @@ private: std::string aceApplicationName_ = "AceApplication"; std::string pathSeparator_ = "/"; std::string abilityLibraryType_ = ".so"; + static std::shared_ptr applicationForAnr_; #ifdef ABILITY_LIBRARY_LOADER /** diff --git a/frameworks/kits/appkit/native/app/src/main_thread.cpp b/frameworks/kits/appkit/native/app/src/main_thread.cpp index 1a97a51fafd506c1f365d258a0f6cd69899aeb28..d0248b10ea2dd1112099663ffc6db79721a1ec57 100644 --- a/frameworks/kits/appkit/native/app/src/main_thread.cpp +++ b/frameworks/kits/appkit/native/app/src/main_thread.cpp @@ -39,6 +39,8 @@ #include "sys_mgr_client.h" #include "system_ability_definition.h" #include "task_handler_client.h" +#include "faultloggerd_client.h" +#include "dfx_dump_catcher.h" #if defined(ABILITY_LIBRARY_LOADER) || defined(APPLICATION_LIBRARY_LOADER) #include @@ -47,6 +49,7 @@ namespace OHOS { namespace AppExecFwk { +std::shared_ptr MainThread::applicationForAnr_ = nullptr; namespace { constexpr int32_t DELIVERY_TIME = 200; constexpr int32_t DISTRIBUTE_TIME = 100; @@ -799,6 +802,7 @@ void MainThread::HandleLaunchApplication(const AppLaunchData &appLaunchData, con APP_LOGE("HandleLaunchApplication::application launch failed"); return; } + applicationForAnr_ = application_; // init resourceManager. std::shared_ptr resourceManager(Global::Resource::CreateResourceManager()); @@ -1294,6 +1298,32 @@ void MainThread::Init(const std::shared_ptr &runner, const std::sha APP_LOGI("MainThread:Init end."); } +void MainThread::HandleANRProcess(int sigMessage) +{ + if (sigMessage == SIGUSR1) { + int rFD = -1; + if ((rFD = RequestFileDescriptor(int32_t(FaultLoggerType::CPP_CRASH))) < 0) { + APP_LOGE("MainThread::HandleANRProcess request file eescriptor failed"); + } + auto jsRuntime = std::move((std::unique_ptr&)applicationForAnr_->GetRuntime()); + std::string mainThreadStackInfo = jsRuntime->BuildNativeAndJsBackStackTrace(); + if (write(rFD, mainThreadStackInfo.c_str(), mainThreadStackInfo.size()) != mainThreadStackInfo.size()) { + APP_LOGE("MainThread::HandleANRProcess write main thread stack info failed"); + } + OHOS::HiviewDFX::DfxDumpCatcher dumplog; + std::string proStackInfo; + if (dumplog.DumpCatch(getpid(), 0, proStackInfo) == false) { + APP_LOGE("MainThread::HandleANRProcess get process stack info failed"); + } + if (write(rFD, proStackInfo.c_str(), proStackInfo.size()) != proStackInfo.size()) { + APP_LOGE("MainThread::HandleANRProcess write process stack info failed"); + } + if (rFD != -1) { + close(rFD); + } + } +} + void MainThread::Start() { BYTRACE_NAME(BYTRACE_TAG_APP, __PRETTY_FUNCTION__); diff --git a/frameworks/kits/runtime/native/js_runtime.cpp b/frameworks/kits/runtime/native/js_runtime.cpp index 85c64e55541c1726fa611fd26c1ecce05689a3f5..264ab6b9df3ca946c3b1572f6bdfe6785075bb77 100644 --- a/frameworks/kits/runtime/native/js_runtime.cpp +++ b/frameworks/kits/runtime/native/js_runtime.cpp @@ -468,5 +468,10 @@ NativeValue* JsRuntime::ClearCallbackTimer(NativeEngine& engine, NativeCallbackI JsRuntime::RemoveTask(name); return engine.CreateUndefined(); } + +std::string JsRuntime::BuildNativeAndJsBackStackTrace() +{ + return nativeEngine_->BuildNativeAndJsBackStackTrace(); +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index cece1ddfc1b0a3e94d2d00942e0d2175c9a8e5bb..900ed7654d05336762cd9d0c52551a48f705ebbb 100644 --- a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h @@ -601,6 +601,12 @@ public: */ virtual int RegisterSnapshotHandler(const sptr& handler) = 0; + /** + * Send not response process ID to AMS. + * @param pid The not response process ID. + */ + virtual bool SendANRProcessID(int pid) = 0; + enum { // ipc id 1-1000 for kit // ipc id for terminating ability (1) @@ -803,6 +809,8 @@ public: GET_PENDING_WANT_SENDER_INFO, SET_SHOW_ON_LOCK_SCREEN, + SEND_ANR_PROCESS_ID, + // ipc id for starting ability by settings(1018) START_ABILITY_FOR_SETTINGS, diff --git a/interfaces/innerkits/runtime/include/js_runtime.h b/interfaces/innerkits/runtime/include/js_runtime.h index 0165f2f7908f6cd35026f514de1bb0de9e14a667..82611942c147f294a792060e8c8b9633fef07184 100644 --- a/interfaces/innerkits/runtime/include/js_runtime.h +++ b/interfaces/innerkits/runtime/include/js_runtime.h @@ -56,6 +56,7 @@ public: void RemoveTask(const std::string& name); NativeValue* SetCallbackTimer(NativeEngine& engine, NativeCallbackInfo& info, bool isInterval); NativeValue* ClearCallbackTimer(NativeEngine& engine, NativeCallbackInfo& info); + std::string BuildNativeAndJsBackStackTrace(); protected: JsRuntime() = default; diff --git a/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn b/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn index 511654f5cdc1c0a6e1a1941e0d7924b0bda54833..49082782e5345d77a71a62f643410099df9eae48 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn +++ b/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn @@ -81,8 +81,8 @@ ohos_shared_library("distributedmissionmanager") { ] sources = [ - "distributed_mission_manager.cpp", "mission_continue_stub.cpp", + "napi_mission_registration.cpp", ] deps = [ diff --git a/interfaces/kits/napi/aafwk/mission_manager/distributed_mission_manager.cpp b/interfaces/kits/napi/aafwk/mission_manager/napi_mission_registration.cpp similarity index 95% rename from interfaces/kits/napi/aafwk/mission_manager/distributed_mission_manager.cpp rename to interfaces/kits/napi/aafwk/mission_manager/napi_mission_registration.cpp index 79f1447ad99e7aac5c4c36e51e6959843ea8bee7..448373d4b53f66f4eac5d8847f6eed1c3405da6a 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/distributed_mission_manager.cpp +++ b/interfaces/kits/napi/aafwk/mission_manager/napi_mission_registration.cpp @@ -15,7 +15,7 @@ #include -#include "distributed_mission_manager.h" +#include "napi_mission_registration.h" #include "ability_manager_client.h" #include "hilog_wrapper.h" @@ -104,16 +104,7 @@ bool SetSyncRemoteMissionsContext(const napi_env &env, const napi_value &value, HILOG_ERROR("%{public}s, deviceId error type.", __func__); return false; } - - char deviceId[VALUE_BUFFER_SIZE + 1] = {0}; - napi_get_value_string_utf8(env, deviceIdValue, deviceId, VALUE_BUFFER_SIZE + 1, &context->valueLen); - if (context->valueLen > VALUE_BUFFER_SIZE) { - HILOG_ERROR("%{public}s, deviceId length not correct", __func__); - return false; - } - context->deviceId = deviceId; - HILOG_INFO("%{public}s deviceId:%{public}s", __func__, context->deviceId.c_str()); - + napi_get_value_string_utf16(env, deviceIdValue, context->deviceId, VALUE_BUFFER_SIZE, &context->valueLen); if (isStart) { if (!SetStartSyncMissionsContext (env, value, context)) { HILOG_ERROR("%{public}s, Wrong argument for start sync.", __func__); @@ -161,7 +152,7 @@ void StartSyncRemoteMissionsAsyncWork(napi_env env, const napi_value resourceNam [](napi_env env, void* data) { SyncRemoteMissionsContext* syncContext = (SyncRemoteMissionsContext*)data; syncContext->result = AbilityManagerClient::GetInstance()-> - StartSyncRemoteMissions(syncContext->deviceId, + StartSyncRemoteMissions(Str16ToStr8(syncContext->deviceId), syncContext->fixConflict, syncContext->tag); }, [](napi_env env, napi_status status, void* data) { @@ -203,7 +194,7 @@ void StartSyncRemoteMissionsAsyncWork(napi_env env, const napi_value resourceNam napi_value NAPI_StartSyncRemoteMissions(napi_env env, napi_callback_info info) { - HILOG_INFO("%{public}s, test1 called.", __func__); + HILOG_INFO("%{public}s, called.", __func__); auto syncContext = new SyncRemoteMissionsContext(); if (syncContext == nullptr) { HILOG_ERROR("%{public}s, syncContext is nullptr.", __func__); @@ -238,7 +229,7 @@ void StopSyncRemoteMissionsAsyncWork(napi_env env, napi_value resourceName, [](napi_env env, void* data) { SyncRemoteMissionsContext* syncContext = (SyncRemoteMissionsContext*)data; syncContext->result = AbilityManagerClient::GetInstance()-> - StopSyncRemoteMissions(syncContext->deviceId); + StopSyncRemoteMissions(Str16ToStr8(syncContext->deviceId)); }, [](napi_env env, napi_status status, void* data) { SyncRemoteMissionsContext* syncContext = (SyncRemoteMissionsContext*)data; @@ -355,7 +346,7 @@ void RegisterMissonExecuteCB(napi_env env, void *data) registerMissonCB->result = AbilityManagerClient::GetInstance()-> - RegisterMissionListener(registerMissonCB->deviceId, + RegisterMissionListener(Str16ToStr8(registerMissonCB->deviceId), registerMissonCB->missionRegistration); if (registerMissonCB->result == NO_ERROR) { HILOG_INFO("add registration."); @@ -528,20 +519,16 @@ napi_value RegisterMissonWrap(napi_env env, napi_callback_info info, RegisterMis return nullptr; } + char16_t deviceIdList[128] = {0}; + size_t valueLen = 0; napi_typeof(env, firstNApi, &valueType); if (valueType != napi_string) { HILOG_ERROR("%{public}s, deviceId error type.", __func__); return nullptr; } - char deviceId[VALUE_BUFFER_SIZE + 1] = {0}; - size_t valueLen = 0; - napi_get_value_string_utf8(env, firstNApi, deviceId, VALUE_BUFFER_SIZE + 1, &valueLen); - if (valueLen > VALUE_BUFFER_SIZE) { - HILOG_ERROR("%{public}s, deviceId length not correct", __func__); - return nullptr; - } - registerMissonCB->deviceId = deviceId; - HILOG_INFO("%{public}s deviceId:%{public}s", __func__, registerMissonCB->deviceId.c_str()); + napi_get_value_string_utf16(env, firstNApi, deviceIdList, VALUE_BUFFER_SIZE, &valueLen); + registerMissonCB->deviceId = deviceIdList; + HILOG_INFO("%{public}s deviceId:%{public}s", __func__, Str16ToStr8(registerMissonCB->deviceId).c_str()); if (argcAsync > 1 && !CreateCallbackReference(env, args[1], registerMissonCB)) { HILOG_ERROR("%{public}s, Wrong arguments.", __func__); @@ -621,9 +608,9 @@ void UvWorkNotifyMissionChanged(uv_work_t *work, int status) return; } napi_value result = nullptr; - HILOG_INFO("UvWorkNotifyMissionChanged, deviceId = %{public}s", registerMissonCB->deviceId.c_str()); + HILOG_INFO("UvWorkNotifyMissionChanged, deviceId = %{public}s", Str16ToStr8(registerMissonCB->deviceId).c_str()); result = - WrapString(registerMissonCB->cbBase.cbInfo.env, registerMissonCB->deviceId.c_str(), "deviceId"); + WrapString(registerMissonCB->cbBase.cbInfo.env, Str16ToStr8(registerMissonCB->deviceId).c_str(), "deviceId"); napi_value callback = nullptr; napi_value undefined = nullptr; @@ -666,7 +653,7 @@ void NAPIRemoteMissionListener::NotifyMissionsChanged(const std::string& deviceI } registerMissonCB->cbBase.cbInfo.env = env_; registerMissonCB->cbBase.cbInfo.callback = notifyMissionsChangedRef_; - registerMissonCB->deviceId = deviceId; + registerMissonCB->deviceId = Str8ToStr16(deviceId); work->data = (void *)registerMissonCB; int rev = uv_queue_work( @@ -693,9 +680,9 @@ void UvWorkNotifySnapshot(uv_work_t *work, int status) return; } napi_value result[2] = {0}; - HILOG_INFO("UvWorkNotifySnapshot, deviceId = %{public}s", registerMissonCB->deviceId.c_str()); + HILOG_INFO("UvWorkNotifySnapshot, deviceId = %{public}s", Str16ToStr8(registerMissonCB->deviceId).c_str()); result[0] = - WrapString(registerMissonCB->cbBase.cbInfo.env, registerMissonCB->deviceId.c_str(), "deviceId"); + WrapString(registerMissonCB->cbBase.cbInfo.env, Str16ToStr8(registerMissonCB->deviceId).c_str(), "deviceId"); HILOG_INFO("UvWorkNotifySnapshot, missionId = %{public}d", registerMissonCB->missionId); result[1] = WrapInt32(registerMissonCB->cbBase.cbInfo.env, registerMissonCB->missionId, "missionId"); @@ -741,7 +728,7 @@ void NAPIRemoteMissionListener::NotifySnapshot(const std::string& deviceId, int3 } registerMissonCB->cbBase.cbInfo.env = env_; registerMissonCB->cbBase.cbInfo.callback = notifySnapshotRef_; - registerMissonCB->deviceId = deviceId; + registerMissonCB->deviceId = Str8ToStr16(deviceId); registerMissonCB->missionId = missionId; work->data = (void *)registerMissonCB; @@ -769,9 +756,9 @@ void UvWorkNotifyNetDisconnect(uv_work_t *work, int status) return; } napi_value result[2] = {0}; - HILOG_INFO("UvWorkNotifyNetDisconnect, deviceId = %{public}s", registerMissonCB->deviceId.c_str()); + HILOG_INFO("UvWorkNotifyNetDisconnect, deviceId = %{public}s", Str16ToStr8(registerMissonCB->deviceId).c_str()); result[0] = - WrapString(registerMissonCB->cbBase.cbInfo.env, registerMissonCB->deviceId.c_str(), "deviceId"); + WrapString(registerMissonCB->cbBase.cbInfo.env, Str16ToStr8(registerMissonCB->deviceId).c_str(), "deviceId"); HILOG_INFO("UvWorkNotifyNetDisconnect, state = %{public}d", registerMissonCB->state); result[1] = WrapInt32(registerMissonCB->cbBase.cbInfo.env, registerMissonCB->state, "state"); @@ -818,7 +805,7 @@ void NAPIRemoteMissionListener::NotifyNetDisconnect(const std::string& deviceId, } registerMissonCB->cbBase.cbInfo.env = env_; registerMissonCB->cbBase.cbInfo.callback = notifyNetDisconnectRef_; - registerMissonCB->deviceId = deviceId; + registerMissonCB->deviceId = Str8ToStr16(deviceId); registerMissonCB->state = state; work->data = (void *)registerMissonCB; @@ -852,7 +839,7 @@ void UnRegisterMissonExecuteCB(napi_env env, void *data) registerMissonCB->result = AbilityManagerClient::GetInstance()-> - UnRegisterMissionListener(registerMissonCB->deviceId, + UnRegisterMissionListener(Str16ToStr8(registerMissonCB->deviceId), registerMissonCB->missionRegistration); if (registerMissonCB->result == NO_ERROR) { HILOG_INFO("remove registration."); @@ -944,20 +931,16 @@ bool GetUnRegisterMissonDeviceId(napi_env env, const napi_value& value, Register return false; } + char16_t deviceIdList[VALUE_BUFFER_SIZE] = {0}; size_t valueLen = 0; napi_typeof(env, firstNApi, &valueType); if (valueType != napi_string) { HILOG_ERROR("%{public}s, Wrong argument type.", __func__); return false; } - char deviceId[VALUE_BUFFER_SIZE + 1] = {0}; - napi_get_value_string_utf8(env, firstNApi, deviceId, VALUE_BUFFER_SIZE + 1, &valueLen); - if (valueLen > VALUE_BUFFER_SIZE) { - HILOG_ERROR("%{public}s, deviceId length not correct", __func__); - return false; - } - registerMissonCB->deviceId = deviceId; - HILOG_INFO("%{public}s deviceId:%{public}s", __func__, registerMissonCB->deviceId.c_str()); + napi_get_value_string_utf16(env, firstNApi, deviceIdList, VALUE_BUFFER_SIZE, &valueLen); + registerMissonCB->deviceId = deviceIdList; + HILOG_INFO("%{public}s deviceId:%{public}s", __func__, Str16ToStr8(registerMissonCB->deviceId).c_str()); HILOG_INFO("%{public}s called end.", __func__); return true; } diff --git a/interfaces/kits/napi/aafwk/mission_manager/distributed_mission_manager.h b/interfaces/kits/napi/aafwk/mission_manager/napi_mission_registration.h similarity index 97% rename from interfaces/kits/napi/aafwk/mission_manager/distributed_mission_manager.h rename to interfaces/kits/napi/aafwk/mission_manager/napi_mission_registration.h index a5c89d66fca466b49aceacb523923596abcbb535..2b81cf88099065ff77450899fe1806d8f57ce602 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/distributed_mission_manager.h +++ b/interfaces/kits/napi/aafwk/mission_manager/napi_mission_registration.h @@ -89,7 +89,7 @@ struct MissionRegistrationCB { struct RegisterMissonCB { CBBase cbBase; - std::string deviceId; + std::u16string deviceId; sptr missionRegistration; MissionRegistrationCB missionRegistrationCB; int result = 0; @@ -120,7 +120,7 @@ struct SyncRemoteMissionsContext { napi_env env; napi_async_work work; - std::string deviceId; + char16_t deviceId[128] = {0}; size_t valueLen = 0; bool fixConflict = false; int64_t tag = -1; @@ -135,7 +135,7 @@ bool SetSyncRemoteMissionsContext( bool ProcessSyncInput(napi_env env, napi_callback_info info, bool isStart, SyncRemoteMissionsContext* syncContext); mutex registrationLock_; -map> registration_; +map> registration_; enum ErrorCode { NO_ERROR = 0, diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index 41f29337ee1c9acfe113b384a899c95370a5a1e3..c9a9714278c2f2e57f9c9d6a3910ca1caeb05dbf 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -559,6 +559,12 @@ public: virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; + /** + * Send not response process ID to AMS. + * @param pid The not response process ID. + */ + virtual bool SendANRProcessID(int pid) override; + private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index f6ddc3d4b33bdb894f658b36ff8203725bf4fe62..051ca4791a59af74d0e16e2a7953e88d661889fd 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -741,6 +741,12 @@ public: bool IsAbilityControllerForeground(const std::string &bundleName); + /** + * Send not response process ID to AMS. + * @param pid The not response process ID. + */ + virtual bool SendANRProcessID(int pid) override; + // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; static constexpr uint32_t ACTIVE_TIMEOUT_MSG = 1; diff --git a/services/abilitymgr/include/ability_manager_stub.h b/services/abilitymgr/include/ability_manager_stub.h index 0ae6f7aa5a3a7751c7462ab1d13671c49ca25ca1..4063347728789201a6ff4b036ee66b3fc61a12a1 100644 --- a/services/abilitymgr/include/ability_manager_stub.h +++ b/services/abilitymgr/include/ability_manager_stub.h @@ -134,6 +134,7 @@ private: int StopSyncRemoteMissionsInner(MessageParcel &data, MessageParcel &reply); int RegisterSnapshotHandlerInner(MessageParcel &data, MessageParcel &reply); int GetMissionSnapshotInfoInner(MessageParcel &data, MessageParcel &reply); + int SendANRProcessIDInner(MessageParcel &data, MessageParcel &reply); int SetAbilityControllerInner(MessageParcel &data, MessageParcel &reply); int IsRunningInStabilityTestInner(MessageParcel &data, MessageParcel &reply); diff --git a/services/abilitymgr/include/ams_configuration_parameter.h b/services/abilitymgr/include/ams_configuration_parameter.h index ddb4c9fb37d637a580c438a73aff8bf4b2ad5864..c8fc99ada113cfdae25fc3623b9c04b1f79f0f67 100644 --- a/services/abilitymgr/include/ams_configuration_parameter.h +++ b/services/abilitymgr/include/ams_configuration_parameter.h @@ -33,6 +33,7 @@ const std::string STARTUP_STATUS_BAR {"startup_system_ui_status_bar"}; const std::string STARTUP_NAVIGATION_BAR {"startup_system_ui_navigation_bar"}; const std::string STARTUP_PHONE_SERVICE {"startup_phone_service"}; const std::string MISSION_SAVE_TIME {"mission_save_time"}; +const std::string ANR_PROCESS_TIMEOUT_TIME {"anr_process_timeout_time"}; const std::string SYSTEM_CONFIGURATION {"system_configuration"}; const std::string SYSTEM_ORIENTATION {"system_orientation"}; const std::string STARTUP_CONTACTS {"startup_contacts"}; @@ -113,6 +114,10 @@ public: * Get the max number of restart. */ int GetMaxRestartNum() const; + /** + * get the anr process timeout time. + */ + int GetANRTimeOutTime() const; enum { READ_OK = 0, READ_FAIL = 1, READ_JSON_FAIL = 2 }; @@ -139,6 +144,7 @@ private: int maxRestartNum_ = 0; std::string orientation_ {""}; int missionSaveTime_ {12 * 60 * 60 * 1000}; + int anrTime_ {5000}; std::map memThreshold_; }; } // namespace AAFwk diff --git a/services/abilitymgr/resource/ams_service_config.json b/services/abilitymgr/resource/ams_service_config.json index 5baa0584973c0103aad3f45fdcaf0e986090344e..dcf3dc6cd5bf43f3ac567bd90495179a9071fe93 100644 --- a/services/abilitymgr/resource/ams_service_config.json +++ b/services/abilitymgr/resource/ams_service_config.json @@ -9,7 +9,8 @@ "startup_mms":true, "mission_save_time" : 43200000, "root_launcher_restart_max":15, - "use_new_mission":true + "use_new_mission":true, + "anr_process_timeout_time" : 5000 }, "memorythreshold":{ "home_application": "20" diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index fa18e945abc490face65b7a5d852bfd7c47972d7..2c60d55438af69950081c9e2f4184bbc605016b1 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -2228,5 +2228,26 @@ bool AbilityManagerProxy::IsRunningInStabilityTest() } return reply.ReadBool(); } + +bool AbilityManagerProxy::SendANRProcessID(int pid) +{ + int error; + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!WriteInterfaceToken(data)) { + return false; + } + if (!data.WriteInt32(pid)) { + HILOG_ERROR("pid WriteInt32 fail."); + return false; + } + error = Remote()->SendRequest(IAbilityManager::SEND_ANR_PROCESS_ID, data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("SendANRProcessID error: %d", error); + return false; + } + return reply.ReadBool(); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 74cfbbd374007d7519bd6ee5cec8123fae550857..3ad82504af781142d3f277c417d06af69448a0dd 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "ability_info.h" #include "ability_manager_errors.h" @@ -2928,6 +2929,21 @@ void AbilityManagerService::InitPendWantManager(int32_t userId, bool switchUser) } } +bool AbilityManagerService::SendANRProcessID(int pid) +{ + int anrTimeOut = amsConfigResolver_->GetANRTimeOutTime(); + auto timeoutTask = [pid]() { + if (kill(pid,SIGKILL) != ERR_OK) { + HILOG_ERROR("Kill ANR process failed"); + } + }; + if (kill(pid,SIGUSR1) != ERR_OK) { + HILOG_ERROR("Send sig to ANR process failed"); + } + handler_->PostTask(timeoutTask, "TIME_OUT_TASK", anrTimeOut); + return true; +} + int AbilityManagerService::SetAbilityController(const sptr &abilityController, bool imAStabilityTest) { @@ -2998,7 +3014,20 @@ int32_t AbilityManagerService::InitAbilityInfoFromExtension(AppExecFwk::Extensio abilityInfo.isModuleJson = true; abilityInfo.isStageBasedModel = true; abilityInfo.process = extensionInfo.process; - abilityInfo.type = AppExecFwk::AbilityType::EXTENSION; + switch (extensionInfo.type) { + case AppExecFwk::ExtensionAbilityType::FORM: + abilityInfo.type = AppExecFwk::AbilityType::FORM; + break; + case AppExecFwk::ExtensionAbilityType::SERVICE: + abilityInfo.type = AppExecFwk::AbilityType::SERVICE; + break; + case AppExecFwk::ExtensionAbilityType::DATASHARE: + abilityInfo.type = AppExecFwk::AbilityType::DATA; + break; + default: + abilityInfo.type = AppExecFwk::AbilityType::EXTENSION; + break; + } return 0; } diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index 983dc9de9005acf586964f299733c028216ac40e..87187f7ee91f5ebbabd592b48553cf4a99b6a3e2 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -132,6 +132,7 @@ void AbilityManagerStub::SecondStepInit() requestFuncMap_[SET_ABILITY_CONTROLLER] = &AbilityManagerStub::SetAbilityControllerInner; requestFuncMap_[GET_MISSION_SNAPSHOT_INFO] = &AbilityManagerStub::GetMissionSnapshotInfoInner; requestFuncMap_[IS_USER_A_STABILITY_TEST] = &AbilityManagerStub::IsRunningInStabilityTestInner; + requestFuncMap_[SEND_ANR_PROCESS_ID] = &AbilityManagerStub::SendANRProcessIDInner; } int AbilityManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) @@ -1304,5 +1305,16 @@ int AbilityManagerStub::IsRunningInStabilityTestInner(MessageParcel &data, Messa } return NO_ERROR; } + +int AbilityManagerStub::SendANRProcessIDInner(MessageParcel &data, MessageParcel &reply) +{ + int32_t pid = data.ReadInt32(); + bool result = SendANRProcessID(pid); + if (!reply.WriteBool(result)) { + HILOG_ERROR("reply write failed."); + return ERR_INVALID_VALUE; + } + return NO_ERROR; +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ams_configuration_parameter.cpp b/services/abilitymgr/src/ams_configuration_parameter.cpp index 19b314dffb1e52ebda0e7eafd768b49c97ab8a99..93f1e17f643fc72b677cd9558e9cb6fcadee3c0a 100644 --- a/services/abilitymgr/src/ams_configuration_parameter.cpp +++ b/services/abilitymgr/src/ams_configuration_parameter.cpp @@ -82,6 +82,11 @@ bool AmsConfigurationParameter::IsUseNewMission() const return useNewMission_; } +int AmsConfigurationParameter::GetANRTimeOutTime() const +{ + return anrTime_; +} + int AmsConfigurationParameter::GetMaxRestartNum() const { return maxRestartNum_; @@ -147,6 +152,7 @@ int AmsConfigurationParameter::LoadAppConfigurationForStartUpService(nlohmann::j canStartContacts = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::STARTUP_CONTACTS).get(); canStartMms = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::STARTUP_MMS).get(); missionSaveTime_ = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::MISSION_SAVE_TIME).get(); + anrTime_ = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::ANR_PROCESS_TIMEOUT_TIME).get(); if (Object.at(AmsConfig::SERVICE_ITEM_AMS).contains(AmsConfig::USE_NEW_MISSION)) { useNewMission_ = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::USE_NEW_MISSION).get(); }