From c29e4591a33bc85421f025717291c8dc6405c15f Mon Sep 17 00:00:00 2001 From: zhangyuhang72 Date: Tue, 30 Dec 2025 20:50:04 +0800 Subject: [PATCH] =?UTF-8?q?Connect=20Extension=E8=87=AA=E5=AE=9A=E4=B9=89l?= =?UTF-8?q?oadTimeout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyuhang72 --- .../include/ability_manager_client.h | 14 ++++- .../include/ability_manager_interface.h | 4 +- .../include/ability_connect_manager.h | 6 ++- .../include/ability_manager_proxy.h | 3 +- .../include/ability_manager_service.h | 7 ++- .../include/ability_record/ability_request.h | 1 + .../ui_extension_ability_manager.h | 2 +- .../src/ability_connect_manager.cpp | 54 ++++++++++++++----- .../abilitymgr/src/ability_manager_client.cpp | 14 +++-- .../abilitymgr/src/ability_manager_proxy.cpp | 3 +- .../src/ability_manager_service.cpp | 10 ++-- .../abilitymgr/src/ability_manager_stub.cpp | 3 +- .../ui_extension_ability_manager.cpp | 8 ++- .../appmgr/include/app_mgr_service_inner.h | 2 + services/appmgr/src/app_mgr_service_inner.cpp | 16 ++++-- .../include/mock_ability_manager_client.cpp | 6 +++ .../ability_connect_manager_first_test.cpp | 48 +++++++++++++++++ .../mock/src/mock_ability_connect_manager.cpp | 6 +-- .../app_mgr_service_inner_tdd_test/BUILD.gn | 1 + .../app_mgr_service_inner_tdd_test.cpp | 36 +++++++++++++ .../mock_ability_manager_client.cpp | 8 ++- utils/server/startup/include/param.h | 1 + utils/server/startup/src/param.cpp | 4 ++ 23 files changed, 218 insertions(+), 39 deletions(-) diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_client.h b/interfaces/inner_api/ability_manager/include/ability_manager_client.h index a90e8c0b0c..3516d79bf7 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_client.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_client.h @@ -592,6 +592,17 @@ public: */ ErrCode ConnectAbility(const Want &want, sptr connect, int32_t userId); + /** + * ConnectAbility, connect session with service ability. + * + * @param want, Special want for service type's ability. + * @param connect, Callback used to notify caller the result of connecting or disconnecting. + * @param loadTimeout, timeout multiply for ability loading stage, range 1-30, not work on asan + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode ConnectAbility(const Want &want, sptr connect, int32_t userId, + int32_t loadTimeout); + /** * ConnectAbility, connect session with service ability. * @@ -654,10 +665,11 @@ public: * @param want, special want for the extension ability. * @param connect, callback used to notify caller the result of connecting or disconnecting. * @param userId, the extension runs in. + * @param loadTimeout, timeout multiply for ability loading stage, range 1-30, not work on asan * @return Returns ERR_OK on success, others on failure. */ ErrCode ConnectExtensionAbility(const Want &want, sptr connect, - int32_t userId = DEFAULT_INVAL_VALUE); + int32_t userId = DEFAULT_INVAL_VALUE, int32_t loadTimeout = 0); /** * Connect ui extension ability. diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_interface.h b/interfaces/inner_api/ability_manager/include/ability_manager_interface.h index 4358f17da1..14170e45be 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_interface.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_interface.h @@ -725,6 +725,7 @@ public: * @param extensionType, type of the extension. * @param userId, the service user ID. * @param specifiedFullTokenId, The specified full token ID. + * @param loadTimeout, timeout multiply for ability loading stage, range 1-30, not work on asan. * @return Returns ERR_OK on success, others on failure. */ virtual int32_t ConnectAbilityCommon( @@ -734,7 +735,8 @@ public: AppExecFwk::ExtensionAbilityType extensionType, int32_t userId = DEFAULT_INVAL_VALUE, bool isQueryExtensionOnly = false, - uint64_t specifiedFullTokenId = 0) + uint64_t specifiedFullTokenId = 0, + int32_t loadTimeout = 0) { return 0; } diff --git a/services/abilitymgr/include/ability_connect_manager.h b/services/abilitymgr/include/ability_connect_manager.h index ab6fa35d68..d296628165 100644 --- a/services/abilitymgr/include/ability_connect_manager.h +++ b/services/abilitymgr/include/ability_connect_manager.h @@ -389,10 +389,11 @@ protected: * @param abilityRecord The ability record to load. * @param updateRecordCallback Callback to update record after loading. * @param isPreloadUIExtension Whether loading for UI Extension preload. + * @param timeout, timeout multiply for ability loading stage, not work on asan */ void LoadAbility(const std::shared_ptr &abilityRecord, std::function &)> updateRecordCallback = nullptr, - bool isPreloadUIExtension = false); + bool isPreloadUIExtension = false, int32_t loadTimeout = 0); /** * RemoveServiceAbility. @@ -526,7 +527,7 @@ protected: virtual bool HandleExtensionAbilityRemove(const std::shared_ptr &abilityRecord); - virtual void HandlePostLoadTimeout(const std::shared_ptr &abilityRecord, int64_t recordId); + virtual void PostLoadTimeoutTask(const std::shared_ptr &abilityRecord, int32_t loadTimeout); virtual int DispatchForeground(const std::shared_ptr &abilityRecord, const sptr &token); @@ -770,6 +771,7 @@ private: void PostTimeOutTask(const std::shared_ptr &abilityRecord, uint32_t messageId); void PostTimeOutTask(const std::shared_ptr &abilityRecord, int connectRecordId, uint32_t messageId); + int32_t GetLoadTimeout(int32_t loadTimeout); void CompleteForeground(const std::shared_ptr &abilityRecord); diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index af22b630cb..619b27f3a4 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -538,7 +538,8 @@ public: AppExecFwk::ExtensionAbilityType extensionType, int32_t userId = DEFAULT_INVAL_VALUE, bool isQueryExtensionOnly = false, - uint64_t specifiedFullTokenId = 0) override; + uint64_t specifiedFullTokenId = 0, + int32_t loadTimeout = 0) override; virtual int ConnectUIExtensionAbility( const Want &want, diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index f4e735e10f..dd956de170 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -713,7 +713,8 @@ public: AppExecFwk::ExtensionAbilityType extensionType, int32_t userId = DEFAULT_INVAL_VALUE, bool isQueryExtensionOnly = false, - uint64_t specifiedFullTokenId = 0) override; + uint64_t specifiedFullTokenId = 0, + int32_t loadTimeout = 0) override; virtual int ConnectUIExtensionAbility( const Want &want, @@ -2476,7 +2477,9 @@ private: const sptr &sessionInfo = nullptr, bool isQueryExtensionOnly = false, sptr connectInfo = nullptr, - uint64_t specifiedFullTokenId = 0); + uint64_t specifiedFullTokenId = 0, + int32_t loadTimeout = 0); + int DisconnectLocalAbility(const sptr &connect); int32_t HandleExtensionConnectionByUserId(sptr connect, int32_t userId, std::function, sptr)> func); diff --git a/services/abilitymgr/include/ability_record/ability_request.h b/services/abilitymgr/include/ability_record/ability_request.h index 4d73b71b6d..6e5586ba66 100644 --- a/services/abilitymgr/include/ability_record/ability_request.h +++ b/services/abilitymgr/include/ability_record/ability_request.h @@ -105,6 +105,7 @@ struct AbilityRequest { bool isFromOpenLink = false; sptr uiExtensionAbilityConnectInfo = nullptr; std::pair IsContinuation() const; + int32_t loadExtensionTimeout = 0; // only for connectAbility bool IsAcquireShareData() const { diff --git a/services/abilitymgr/include/ui_extension/ui_extension_ability_manager.h b/services/abilitymgr/include/ui_extension/ui_extension_ability_manager.h index bc30f2af63..c7be56fde8 100644 --- a/services/abilitymgr/include/ui_extension/ui_extension_ability_manager.h +++ b/services/abilitymgr/include/ui_extension/ui_extension_ability_manager.h @@ -220,7 +220,7 @@ private: void HandleAbilityDiedTaskInner(const std::shared_ptr &abilityRecord) override; - void HandlePostLoadTimeout(const std::shared_ptr &abilityRecord, int64_t recordId) override; + void PostLoadTimeoutTask(const std::shared_ptr &abilityRecord, int32_t loadTimeout) override; int DispatchForeground(const std::shared_ptr &abilityRecord, const sptr &token) override; diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index f5526bf53b..ddb2820aac 100644 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -70,6 +70,7 @@ const int COMMAND_TIMEOUT_MULTIPLE = 5; const int COMMAND_TIMEOUT_MULTIPLE_NEW = 21; const int COMMAND_WINDOW_TIMEOUT_MULTIPLE = 5; #endif +constexpr const int32_t LOAD_TIMEOUT_MAX = 30; const int32_t AUTO_DISCONNECT_INFINITY = -1; constexpr const char* FROZEN_WHITE_DIALOG = "com.huawei.hmos.huaweicast"; constexpr char BUNDLE_NAME_DIALOG[] = "com.ohos.amsdialog"; @@ -402,7 +403,7 @@ int AbilityConnectManager::ConnectAbilityLockedInner(bool isLoadedAbility, { if (!isLoadedAbility) { TAG_LOGI(AAFwkTag::EXT, "load"); - LoadAbility(targetService); + LoadAbility(targetService, nullptr, false, abilityRequest.loadExtensionTimeout); } else if (targetService->IsAbilityState(AbilityState::ACTIVE)) { targetService->SetWant(abilityRequest.want); HandleActiveAbility(targetService, connectRecord); @@ -1198,7 +1199,8 @@ std::list> AbilityConnectManager::GetConnectRe } void AbilityConnectManager::LoadAbility(const std::shared_ptr &abilityRecord, - std::function&)> updateRecordCallback, bool isPreloadUIExtension) + std::function&)> updateRecordCallback, bool isPreloadUIExtension, + int32_t loadTimeout) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); CHECK_POINTER(abilityRecord); @@ -1209,9 +1211,11 @@ void AbilityConnectManager::LoadAbility(const std::shared_ptrIsDebugApp()) { TAG_LOGD(AAFwkTag::EXT, "IsDebug is false, here is not debug app"); - PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG); + PostLoadTimeoutTask(abilityRecord, loadTimeoutFinal); } sptr token = abilityRecord->GetToken(); sptr perToken = nullptr; @@ -1241,6 +1245,7 @@ void AbilityConnectManager::LoadAbility(const std::shared_ptrGetCustomProcessFlag(); loadParam.extensionProcessMode = abilityRecord->GetExtensionProcessMode(); loadParam.isPreloadUIExtension = isPreloadUIExtension; + loadParam.loadTimeout = loadTimeoutFinal; SetExtensionLoadParam(loadParam, abilityRecord); AbilityRuntime::FreezeUtil::GetInstance().AddLifecycleEvent(loadParam.token, "AbilityConnectManager::LoadAbility"); HandleLoadAbilityOrStartSpecifiedProcess(loadParam, abilityRecord); @@ -1430,11 +1435,10 @@ void AbilityConnectManager::PostTimeOutTask(const std::shared_ptrGetAbilityRecordId(); - TAG_LOGD(AAFwkTag::EXT, "task: %{public}s, %{public}d, %{public}" PRId64, - abilityRecord->GetURI().c_str(), connectRecordId, recordId); - if (messageId == AbilityManagerService::LOAD_TIMEOUT_MSG) { - HandlePostLoadTimeout(abilityRecord, recordId); - } else if (messageId == AbilityManagerService::CONNECT_TIMEOUT_MSG) { + TAG_LOGD(AAFwkTag::EXT, "task: %{public}s/%{public}s, %{public}d, %{public}" PRId64, + abilityRecord->GetAbilityInfo().bundleName.c_str(), abilityRecord->GetAbilityInfo().name.c_str(), + connectRecordId, recordId); + if (messageId == AbilityManagerService::CONNECT_TIMEOUT_MSG) { HandlePostConnectTimeout(abilityRecord, connectRecordId, recordId); } else { TAG_LOGE(AAFwkTag::EXT, "messageId error"); @@ -1442,13 +1446,16 @@ void AbilityConnectManager::PostTimeOutTask(const std::shared_ptr &abilityRecord, - int64_t recordId) +void AbilityConnectManager::PostLoadTimeoutTask(const std::shared_ptr &abilityRecord, + int32_t loadTimeout) { - int32_t delayTime = AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * LOAD_TIMEOUT_MULTIPLE; - abilityRecord->SendEvent(AbilityManagerService::LOAD_HALF_TIMEOUT_MSG, delayTime / HALF_TIMEOUT, + CHECK_POINTER(abilityRecord); + auto recordId = abilityRecord->GetAbilityRecordId(); + TAG_LOGD(AAFwkTag::EXT, "task: %{public}s/%{public}s, %{public}" PRId64, + abilityRecord->GetAbilityInfo().bundleName.c_str(), abilityRecord->GetAbilityInfo().name.c_str(), recordId); + abilityRecord->SendEvent(AbilityManagerService::LOAD_HALF_TIMEOUT_MSG, loadTimeout / HALF_TIMEOUT, recordId, true); - abilityRecord->SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, delayTime, recordId, true); + abilityRecord->SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, loadTimeout, recordId, true); } void AbilityConnectManager::HandlePostConnectTimeout(const std::shared_ptr &abilityRecord, @@ -1465,6 +1472,27 @@ void AbilityConnectManager::HandlePostConnectTimeout(const std::shared_ptrGetUid(), delayTime, recordId); } +int32_t AbilityConnectManager::GetLoadTimeout(int32_t loadTimeout) +{ +#ifdef SUPPORT_ASAN + return LOAD_TIMEOUT_MULTIPLE; +#else + if (loadTimeout == 0) { + TAG_LOGD(AAFwkTag::EXT, "loadTimeout 0, reset to default"); + return LOAD_TIMEOUT_MULTIPLE; + } + if (loadTimeout < 0 || loadTimeout > LOAD_TIMEOUT_MAX) { + TAG_LOGW(AAFwkTag::EXT, "loadTimeout %{public}d invalid, reset to default", loadTimeout); + return LOAD_TIMEOUT_MULTIPLE; + } + if (!AAFwk::PermissionVerification::GetInstance()->IsSACall()) { + TAG_LOGW(AAFwkTag::EXT, "not sa call"); + return LOAD_TIMEOUT_MULTIPLE; + } + return loadTimeout; +#endif +} + void AbilityConnectManager::HandleStartTimeoutTask(const std::shared_ptr &abilityRecord) { TAG_LOGW(AAFwkTag::EXT, "load timeout"); diff --git a/services/abilitymgr/src/ability_manager_client.cpp b/services/abilitymgr/src/ability_manager_client.cpp index 979a5d7151..457fc437e8 100644 --- a/services/abilitymgr/src/ability_manager_client.cpp +++ b/services/abilitymgr/src/ability_manager_client.cpp @@ -570,13 +570,20 @@ ErrCode AbilityManagerClient::MinimizeUIAbilityBySCB(sptr sessionIn } ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr connect, int32_t userId) +{ + return ConnectAbility(want, connect, userId, 0); +} + +ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr connect, int32_t userId, + int32_t loadTimeout) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); auto abms = GetAbilityManager(); CHECK_POINTER_RETURN_NOT_CONNECTED(abms); TAG_LOGI(AAFwkTag::SERVICE_EXT, "name:%{public}s %{public}s, userId:%{public}d", want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId); - return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::SERVICE, userId); + return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::SERVICE, userId, + false, 0, loadTimeout); } ErrCode AbilityManagerClient::ConnectAbility( @@ -636,7 +643,7 @@ ErrCode AbilityManagerClient::ConnectDataShareExtensionAbility(const Want &want, } ErrCode AbilityManagerClient::ConnectExtensionAbility(const Want &want, sptr connect, - int32_t userId) + int32_t userId, int32_t loadTimeout) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); auto abms = GetAbilityManager(); @@ -648,7 +655,8 @@ ErrCode AbilityManagerClient::ConnectExtensionAbility(const Want &want, sptrConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::UNSPECIFIED, userId); + return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::UNSPECIFIED, userId, + false, 0, loadTimeout); } ErrCode AbilityManagerClient::ConnectUIExtensionAbility(const Want &want, sptr connect, diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 09461eadaf..ea55d11ca0 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -1394,7 +1394,7 @@ int AbilityManagerProxy::ConnectAbility( int AbilityManagerProxy::ConnectAbilityCommon( const Want &want, const sptr &connect, const sptr &callerToken, AppExecFwk::ExtensionAbilityType extensionType, int32_t userId, bool isQueryExtensionOnly, - uint64_t specifiedFullTokenId) + uint64_t specifiedFullTokenId, int32_t loadTimeout) { if (AppUtils::GetInstance().IsForbidStart()) { TAG_LOGW(AAFwkTag::ABILITYMGR, "forbid start: %{public}s", want.GetElement().GetBundleName().c_str()); @@ -1425,6 +1425,7 @@ int AbilityManagerProxy::ConnectAbilityCommon( PROXY_WRITE_PARCEL_AND_RETURN_IF_FAIL(data, Int32, static_cast(extensionType)); PROXY_WRITE_PARCEL_AND_RETURN_IF_FAIL(data, Bool, isQueryExtensionOnly); PROXY_WRITE_PARCEL_AND_RETURN_IF_FAIL(data, Uint64, specifiedFullTokenId); + PROXY_WRITE_PARCEL_AND_RETURN_IF_FAIL(data, Int32, loadTimeout); int error = SendRequest(AbilityManagerInterfaceCode::CONNECT_ABILITY_WITH_TYPE, data, reply, option); if (error != NO_ERROR) { TAG_LOGE(AAFwkTag::ABILITYMGR, "%{public}s, request error:%{public}d", __func__, error); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index c432f6fb32..2dc853f95b 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -5203,7 +5203,7 @@ int32_t AbilityManagerService::ConnectAbility( int32_t AbilityManagerService::ConnectAbilityCommon( const Want &want, const sptr &connect, const sptr &callerToken, AppExecFwk::ExtensionAbilityType extensionType, int32_t userId, bool isQueryExtensionOnly, - uint64_t specifiedFullTokenId) + uint64_t specifiedFullTokenId, int32_t loadTimeout) { if (AppUtils::GetInstance().IsForbidStart()) { TAG_LOGW(AAFwkTag::ABILITYMGR, "forbid start: %{public}s", want.GetElement().GetBundleName().c_str()); @@ -5326,7 +5326,7 @@ int32_t AbilityManagerService::ConnectAbilityCommon( if (callerToken != nullptr && callerToken->GetObjectDescriptor() != u"ohos.aafwk.AbilityToken") { TAG_LOGD(AAFwkTag::SERVICE_EXT, "invalid Token."); eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, nullptr, extensionType, nullptr, - false, nullptr, specifiedFullTokenId); + false, nullptr, specifiedFullTokenId, loadTimeout); if (eventInfo.errCode != ERR_OK) { if (extensionType == AppExecFwk::ExtensionAbilityType::UI_SERVICE) { eventInfo.errReason = "ConnectLocalAbility error"; @@ -5338,7 +5338,7 @@ int32_t AbilityManagerService::ConnectAbilityCommon( return eventInfo.errCode; } eventInfo.errCode = ConnectLocalAbility(abilityWant, validUserId, connect, callerToken, extensionType, nullptr, - isQueryExtensionOnly, nullptr, specifiedFullTokenId); + isQueryExtensionOnly, nullptr, specifiedFullTokenId, loadTimeout); if (eventInfo.errCode != ERR_OK) { if (extensionType == AppExecFwk::ExtensionAbilityType::UI_SERVICE) { eventInfo.errReason = "ConnectLocalAbility error"; @@ -5516,7 +5516,8 @@ int AbilityManagerService::DisconnectAbility(sptr connect) int32_t AbilityManagerService::ConnectLocalAbility(const Want &want, const int32_t userId, const sptr &connect, const sptr &callerToken, AppExecFwk::ExtensionAbilityType extensionType, const sptr &sessionInfo, - bool isQueryExtensionOnly, sptr connectInfo, uint64_t specifiedFullTokenId) + bool isQueryExtensionOnly, sptr connectInfo, uint64_t specifiedFullTokenId, + int32_t loadTimeout) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGD(AAFwkTag::SERVICE_EXT, "called"); @@ -5538,6 +5539,7 @@ int32_t AbilityManagerService::ConnectLocalAbility(const Want &want, const int32 result = GenerateAbilityRequest(want, DEFAULT_INVAL_VALUE, abilityRequest, callerToken, userId); } abilityRequest.sessionInfo = sessionInfo; + abilityRequest.loadExtensionTimeout = loadTimeout; Want requestWant = want; CHECK_POINTER_AND_RETURN_LOG(connect, ERR_INVALID_VALUE, "connect is nullptr"); diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index a7096c1e01..1a76ff410d 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -1834,8 +1834,9 @@ int AbilityManagerStub::ConnectAbilityWithTypeInner(MessageParcel &data, Message AppExecFwk::ExtensionAbilityType extensionType = static_cast(data.ReadInt32()); bool isQueryExtensionOnly = data.ReadBool(); uint64_t specifiedFullTokenId = data.ReadUint64(); + int32_t loadTimeout = data.ReadInt32(); int32_t result = ConnectAbilityCommon(*want, callback, token, extensionType, userId, isQueryExtensionOnly, - specifiedFullTokenId); + specifiedFullTokenId, loadTimeout); reply.WriteInt32(result); return NO_ERROR; } diff --git a/services/abilitymgr/src/ui_extension/ui_extension_ability_manager.cpp b/services/abilitymgr/src/ui_extension/ui_extension_ability_manager.cpp index c13802bacc..8c0a510011 100644 --- a/services/abilitymgr/src/ui_extension/ui_extension_ability_manager.cpp +++ b/services/abilitymgr/src/ui_extension/ui_extension_ability_manager.cpp @@ -1140,9 +1140,13 @@ void UIExtensionAbilityManager::HandleAbilityDiedTaskInner(const std::shared_ptr HandleAfterServiceRemoved(abilityRecord, isRemove); } -void UIExtensionAbilityManager::HandlePostLoadTimeout(const std::shared_ptr &abilityRecord, - int64_t recordId) +void UIExtensionAbilityManager::PostLoadTimeoutTask(const std::shared_ptr &abilityRecord, + int32_t loadTimeout) { + CHECK_POINTER(abilityRecord); + auto recordId = abilityRecord->GetAbilityRecordId(); + TAG_LOGD(AAFwkTag::EXT, "task: %{public}s/%{public}s, %{public}" PRId64, + abilityRecord->GetAbilityInfo().bundleName.c_str(), abilityRecord->GetAbilityInfo().name.c_str(), recordId); if (UIExtensionUtils::IsUIExtension(abilityRecord->GetAbilityInfo().extensionAbilityType)) { return abilityRecord->PostUIExtensionAbilityTimeoutTask(AbilityManagerService::LOAD_TIMEOUT_MSG); } diff --git a/services/appmgr/include/app_mgr_service_inner.h b/services/appmgr/include/app_mgr_service_inner.h index f997f12369..c50b74aacc 100644 --- a/services/appmgr/include/app_mgr_service_inner.h +++ b/services/appmgr/include/app_mgr_service_inner.h @@ -1908,6 +1908,8 @@ private: void AfterLoadAbility(std::shared_ptr appRecord, std::shared_ptr abilityInfo, std::shared_ptr loadParam); + static int32_t GetLoadTimeout(int32_t loadTimeout); + void RemoveRenderRecordNoAttach(const std::shared_ptr &hostRecord, int32_t renderPid); void HandleExistingAppRecordAfterFound(std::shared_ptr appRecord, diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index ac4cfe81cd..7773d7305d 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -1242,17 +1242,18 @@ void AppMgrServiceInner::AfterLoadAbility(std::shared_ptr appR PerfProfile::GetInstance().Dump(); PerfProfile::GetInstance().Reset(); - auto reportLoadTask = [appRecord, abilityRecordId = loadParam->abilityRecordId]() { + auto reportLoadTask = [appRecord, abilityRecordId = loadParam->abilityRecordId, + loadTimeout = loadParam->loadTimeout]() { auto priorityObj = appRecord->GetPriorityObject(); if (priorityObj) { - auto timeOut = AbilityRuntime::GlobalConstant::GetLoadTimeOutBase() * - AAFwk::AppUtils::GetInstance().GetTimeoutUnitTimeRatio(); + auto timeOut = AppMgrServiceInner::GetLoadTimeout(loadTimeout); if (appRecord->GetExtensionType() == ExtensionAbilityType::SERVICE) { timeOut = AbilityRuntime::GlobalConstant::GetLoadAndInactiveTimeout() * AAFwk::AppUtils::GetInstance().GetTimeoutUnitTimeRatio(); } auto stage = appRecord->GetPreloadMode() == PreloadMode::PRE_LAUNCH ? AAFwk::LoadingStage::PRE_LAUNCH_BEGIN : AAFwk::LoadingStage::LOAD_BEGIN; + TAG_LOGD(AAFwkTag::APPMGR, "report load,timeout:%{public}d", timeOut); AAFwk::ResSchedUtil::GetInstance().ReportLoadingEventToRss(stage, priorityObj->GetPid(), appRecord->GetUid(), timeOut, static_cast(abilityRecordId)); } @@ -1267,6 +1268,15 @@ void AppMgrServiceInner::AfterLoadAbility(std::shared_ptr appR appRecord->UpdateAbilityState(loadParam->token, AbilityState::ABILITY_STATE_CREATE); } +int32_t AppMgrServiceInner::GetLoadTimeout(int32_t loadTimeout) +{ + if (loadTimeout > 0) { + return loadTimeout; + } + return AbilityRuntime::GlobalConstant::GetLoadTimeOutBase() * + AAFwk::AppUtils::GetInstance().GetTimeoutUnitTimeRatio(); +} + void AppMgrServiceInner::HandleExistingAppRecordAfterFound(std::shared_ptr appRecord, std::shared_ptr abilityInfo, const HapModuleInfo &hapModuleInfo, std::shared_ptr want, bool isProcCache, const std::shared_ptr &loadParam) diff --git a/test/mock/frameworks_kits_ability_native_test/include/mock_ability_manager_client.cpp b/test/mock/frameworks_kits_ability_native_test/include/mock_ability_manager_client.cpp index f4d413a172..f004bdb491 100644 --- a/test/mock/frameworks_kits_ability_native_test/include/mock_ability_manager_client.cpp +++ b/test/mock/frameworks_kits_ability_native_test/include/mock_ability_manager_client.cpp @@ -98,6 +98,12 @@ ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr connect, int32_t userId, + int32_t loadTimeout) +{ + return -1; +} + ErrCode AbilityManagerClient::ConnectAbility(const Want& want, sptr connect, sptr callerToken, int32_t userId, uint64_t specifiedFullTokenId) { diff --git a/test/unittest/ability_connect_manager_first_test/ability_connect_manager_first_test.cpp b/test/unittest/ability_connect_manager_first_test/ability_connect_manager_first_test.cpp index b0735c45c1..43c00fa216 100644 --- a/test/unittest/ability_connect_manager_first_test/ability_connect_manager_first_test.cpp +++ b/test/unittest/ability_connect_manager_first_test/ability_connect_manager_first_test.cpp @@ -705,5 +705,53 @@ HWTEST_F(AbilityConnectManagerTest, ResumeExtensionAbilityLocked_001, TestSize.L EXPECT_EQ(result, OHOS::ERR_OK); TAG_LOGI(AAFwkTag::TEST, "ResumeExtensionAbilityLocked end"); } + +/* + * Feature: AbilityConnectManager + * Function: GetLoadTimeout + */ +HWTEST_F(AbilityConnectManagerTest, GetLoadTimeout_001, TestSize.Level1) +{ + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_001 start"); + std::shared_ptr connectManager = std::make_shared(0); + EXPECT_NE(connectManager, nullptr); + + auto timeout = connectManager->GetLoadTimeout(0); + EXPECT_NE(timeout, 0); + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_001 end"); +} + +/* + * Feature: AbilityConnectManager + * Function: GetLoadTimeout + */ +HWTEST_F(AbilityConnectManagerTest, GetLoadTimeout_002, TestSize.Level1) +{ + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_002 start"); + std::shared_ptr connectManager = std::make_shared(0); + EXPECT_NE(connectManager, nullptr); + + auto timeout = connectManager->GetLoadTimeout(-1); + EXPECT_NE(timeout, -1); + + timeout = connectManager->GetLoadTimeout(100); + EXPECT_NE(timeout, 100); + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_002 end"); +} + +/* + * Feature: AbilityConnectManager + * Function: GetLoadTimeout + */ +HWTEST_F(AbilityConnectManagerTest, GetLoadTimeout_003, TestSize.Level1) +{ + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_003 start"); + std::shared_ptr connectManager = std::make_shared(0); + EXPECT_NE(connectManager, nullptr); + + auto timeout = connectManager->GetLoadTimeout(10); + EXPECT_EQ(timeout, 10); + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_003 end"); +} } // namespace AAFwk } // namespace OHOS diff --git a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_connect_manager.cpp b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_connect_manager.cpp index 0dd44df76b..cc5527c221 100644 --- a/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_connect_manager.cpp +++ b/test/unittest/ability_manager_service_thirteenth_test/mock/src/mock_ability_connect_manager.cpp @@ -255,7 +255,7 @@ std::shared_ptr AbilityConnectManager::GetExtensionByTokenF void AbilityConnectManager::LoadAbility(const std::shared_ptr &abilityRecord, std::function&)> updateRecordCallback, - bool isPreloadUIExtension) + bool isPreloadUIExtension, int32_t loadTimeout) { } @@ -669,8 +669,8 @@ bool AbilityConnectManager::HandleExtensionAbilityRemove(const std::shared_ptr &abilityRecord, int64_t recordId) +void AbilityConnectManager::PostLoadTimeoutTask( + const std::shared_ptr &abilityRecord, int32_t loadTimeout) { } diff --git a/test/unittest/app_mgr_service_inner_tdd_test/BUILD.gn b/test/unittest/app_mgr_service_inner_tdd_test/BUILD.gn index 752714ee95..04bc61b863 100644 --- a/test/unittest/app_mgr_service_inner_tdd_test/BUILD.gn +++ b/test/unittest/app_mgr_service_inner_tdd_test/BUILD.gn @@ -44,6 +44,7 @@ ohos_unittest("app_mgr_service_inner_tdd_test") { deps = [ "${ability_runtime_services_path}/appmgr:libappms", + "${ability_runtime_services_path}/common:app_util", "${ability_runtime_services_path}/common:task_handler_wrap", ] diff --git a/test/unittest/app_mgr_service_inner_tdd_test/app_mgr_service_inner_tdd_test.cpp b/test/unittest/app_mgr_service_inner_tdd_test/app_mgr_service_inner_tdd_test.cpp index fa0bf44d9b..ef02da78e4 100644 --- a/test/unittest/app_mgr_service_inner_tdd_test/app_mgr_service_inner_tdd_test.cpp +++ b/test/unittest/app_mgr_service_inner_tdd_test/app_mgr_service_inner_tdd_test.cpp @@ -22,11 +22,13 @@ #include "remote_client_manager.h" #undef private #include "app_scheduler.h" +#include "app_utils.h" #include "app_mgr_event.h" #include "app_spawn_client.h" #include "event_handler.h" #include "hilog_tag_wrapper.h" #include "ipc_skeleton.h" +#include "global_constant.h" #include "mock_ability_token.h" #include "mock_app_scheduler.h" #include "mock_bundle_manager.h" @@ -1481,5 +1483,39 @@ HWTEST_F(AppMgrServiceInnerTest, KillSubProcessBypid_005, TestSize.Level1) TAG_LOGI(AAFwkTag::TEST, "KillSubProcessBypid_005 end"); } + +/** + * @tc.name: GetLoadTimeout + * @tc.desc: Get load timeout + * @tc.type: FUNC + * @tc.Function: GetLoadTimeout + * @tc.SubFunction: NA + * @tc.EnvConditions: NA + */ +HWTEST_F(AppMgrServiceInnerTest, GetLoadTimeout_001, TestSize.Level1) +{ + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_001 start"); + auto timeout = AppMgrServiceInner::GetLoadTimeout(12); + EXPECT_EQ(timeout, 12); + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_001 end"); +} + +/** + * @tc.name: GetLoadTimeout + * @tc.desc: Get load timeout + * @tc.type: FUNC + * @tc.Function: GetLoadTimeout + * @tc.SubFunction: NA + * @tc.EnvConditions: NA + */ +HWTEST_F(AppMgrServiceInnerTest, GetLoadTimeout_002, TestSize.Level1) +{ + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_002 start"); + auto timeout = AppMgrServiceInner::GetLoadTimeout(0); + auto timeoutDefault = AbilityRuntime::GlobalConstant::GetLoadTimeOutBase() * + AAFwk::AppUtils::GetInstance().GetTimeoutUnitTimeRatio(); + EXPECT_EQ(timeout, timeoutDefault); + TAG_LOGI(AAFwkTag::TEST, "GetLoadTimeout_002 end"); +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/test/unittest/frameworks_kits_ability_ability_runtime_test/mock_ability_manager_client.cpp b/test/unittest/frameworks_kits_ability_ability_runtime_test/mock_ability_manager_client.cpp index 1e7fe31501..40cdc21e2f 100644 --- a/test/unittest/frameworks_kits_ability_ability_runtime_test/mock_ability_manager_client.cpp +++ b/test/unittest/frameworks_kits_ability_ability_runtime_test/mock_ability_manager_client.cpp @@ -278,6 +278,12 @@ ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr connect, int32_t userId, + int32_t loadTimeout) +{ + return ERR_OK; +} + ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr connect, sptr callerToken, int32_t userId, uint64_t specifiedFullTokenId) { @@ -297,7 +303,7 @@ ErrCode AbilityManagerClient::ConnectDataShareExtensionAbility(const Want &want, } ErrCode AbilityManagerClient::ConnectExtensionAbility(const Want &want, sptr connect, - int32_t userId) + int32_t userId, int32_t loadTimeout) { return ERR_OK; } diff --git a/utils/server/startup/include/param.h b/utils/server/startup/include/param.h index 5ea41c41a3..5c3590f992 100644 --- a/utils/server/startup/include/param.h +++ b/utils/server/startup/include/param.h @@ -60,6 +60,7 @@ struct LoadParam : public Parcelable { bool isPreloadStart = false; pid_t selfPid = -1; bool isPreloadUIExtension = false; + int32_t loadTimeout = 0; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/utils/server/startup/src/param.cpp b/utils/server/startup/src/param.cpp index 309d4954e5..91a4fc53eb 100644 --- a/utils/server/startup/src/param.cpp +++ b/utils/server/startup/src/param.cpp @@ -86,6 +86,9 @@ bool LoadParam::MarshallingTwo(Parcel &parcel) const if (!parcel.WriteBool(isPreloadStart)) { return false; } + if (!parcel.WriteInt32(loadTimeout)) { + return false; + } return true; } @@ -120,6 +123,7 @@ bool LoadParam::ReadFromParcel(Parcel &parcel) loadAbilityCallbackId = parcel.ReadUint64(); isPrelaunch = parcel.ReadBool(); isPreloadStart = parcel.ReadBool(); + loadTimeout = parcel.ReadInt32(); return true; }