!17685 merge timeout into master

Extension自定义LoadTimeout

Created-by: zhangyuhang72
Commit-by: zhangyuhang72
Merged-by: openharmony_ci
Description: **IssueNo**: https://gitcode.com/openharmony/ability_ability_runtime/issues/13829

**Description**: Extension自定义LoadTimeout

**稳定性自检:**
| 自检项                                                       | 自检结果  |
| ------------------------------------------------------------ | -------- |
| 涉及跨进程调用的相关操作需要抛至主线程或加锁防止并发              |      Y    |
| 成员变量进行赋值或创建需要排查并发                               |      Y    |
| 谨慎在lambda表达式中使用引用捕获                                |       Y   |
| 谨慎在未经拷贝的情况下使用外部传入的string、C字符串               |    Y      |
| map\vector\list\set等stl模板类使用时需要排查并发                |      Y    |
| 谨慎考虑加锁范围                                               |    Y      |
| 在IPC通信中谨慎使用同步通信方式                                 |   Y      |
| 禁止传递this指针至其他模块或线程(特别是eventhandler任务)        |       Y   |
| 禁止将外部传入的裸指针在内部直接构造智能指针                      |    Y      |
| 禁止多个独立创建的智能指针管理同一地址                           |      Y    |
| 禁止在析构函数中抛异步任务                                      |        Y  |
| 禁止js对象在非js线程(例如在IPC线程)创建、使用或销毁             |   Y       |
| 禁止在对外接口中未经判空直接使用外部传入的指针                    |     Y     |
| 禁止接口返回局部变量引用                                        |     Y     |
| 禁止在信号函数中加锁                                            |      Y    |
| 禁止在关键流程(SA启动、应用启动等主流程)执行耗时的操作           |    Y      |
| 禁止将同一个cpp编译在不同的so中                                 |      Y    |

**安全编码自检:**
| 自检项                                                          | 自检结果 |
| -------------------------------------------------------------- | -------- |
| 裸指针避免通过隐式转换构造为sptr                                 |   Y       |
| json对象在取值之前必须先判断类型,避免类型不匹配                   |   Y       |
| 序列化时必须对传入的数组大小进行校验,避免出现超大数组              |      Y    |
| 避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型            |     Y     |
| 外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验 |    Y      |
| 指针变量、表示资源描述符的变量、bool变量必须赋初值                  |   Y       |
| readParcelable获取的对象使用前需要判空                            |         Y |
| 分配和释放内存的函数需要成对出现                                   |      Y    |
| 申请内存后异常退出前需要及时进行内存释放                            |    Y      |
| 内存申请前必须对内存大小进行合法性校验                              |      Y    |
| 内存分配后必须判断是否成功                                         |    Y      |
| 禁止使用realloc、alloca函数                                       |      Y    |
| 禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰          |    Y      |
| 禁止打印内存地址                                                  |    Y      |
| 整数之间运算时必须严格检查,确保不会出现溢出、反转、除0               | Y         |
| 禁止对有符号整数进行位操作符运算                                    |    Y      |
| 禁止对指针进行逻辑或位运算                                         |     Y     |
| 循环次数如果收外部数据控制,需要检验其合法性                         |    Y      |
| 禁止使用内存操作类危险函数,需要使用安全函数                         |    Y      |
| 谨慎使用不可重入函数                                               |       Y   |
| 必须检查安全函数的返回值,并进行正确处理                             |       Y   |
| 禁止仅通过TokenType类型判断绕过权限校验                             |     Y     |

**TDD Result**: PASS

**XTS Result**: PASS

### 是否已执行L0用例
- [Y] 已验证
- [ ] 不涉及。如不涉及,请写明理由


See merge request: openharmony/ability_ability_runtime!17685
This commit is contained in:
openharmony_ci
2025-12-31 09:25:57 +08:00
23 changed files with 218 additions and 39 deletions
@@ -592,6 +592,17 @@ public:
*/
ErrCode ConnectAbility(const Want &want, sptr<IAbilityConnection> 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<IAbilityConnection> 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<IAbilityConnection> connect,
int32_t userId = DEFAULT_INVAL_VALUE);
int32_t userId = DEFAULT_INVAL_VALUE, int32_t loadTimeout = 0);
/**
* Connect ui extension ability.
@@ -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;
}
@@ -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<BaseExtensionRecord> &abilityRecord,
std::function<void(const std::shared_ptr<BaseExtensionRecord> &)> 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<BaseExtensionRecord> &abilityRecord);
virtual void HandlePostLoadTimeout(const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int64_t recordId);
virtual void PostLoadTimeoutTask(const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int32_t loadTimeout);
virtual int DispatchForeground(const std::shared_ptr<BaseExtensionRecord> &abilityRecord,
const sptr<IRemoteObject> &token);
@@ -770,6 +771,7 @@ private:
void PostTimeOutTask(const std::shared_ptr<BaseExtensionRecord> &abilityRecord, uint32_t messageId);
void PostTimeOutTask(const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int connectRecordId,
uint32_t messageId);
int32_t GetLoadTimeout(int32_t loadTimeout);
void CompleteForeground(const std::shared_ptr<BaseExtensionRecord> &abilityRecord);
@@ -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,
@@ -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,
@@ -2486,7 +2487,9 @@ private:
const sptr<SessionInfo> &sessionInfo = nullptr,
bool isQueryExtensionOnly = false,
sptr<UIExtensionAbilityConnectInfo> connectInfo = nullptr,
uint64_t specifiedFullTokenId = 0);
uint64_t specifiedFullTokenId = 0,
int32_t loadTimeout = 0);
int DisconnectLocalAbility(const sptr<IAbilityConnection> &connect);
int32_t HandleExtensionConnectionByUserId(sptr<IAbilityConnection> connect, int32_t userId,
std::function<int32_t(std::shared_ptr<AbilityConnectManager>, sptr<IAbilityConnection>)> func);
@@ -105,6 +105,7 @@ struct AbilityRequest {
bool isFromOpenLink = false;
sptr<UIExtensionAbilityConnectInfo> uiExtensionAbilityConnectInfo = nullptr;
std::pair<bool, LaunchReason> IsContinuation() const;
int32_t loadExtensionTimeout = 0; // only for connectAbility
bool IsAcquireShareData() const
{
@@ -220,7 +220,7 @@ private:
void HandleAbilityDiedTaskInner(const std::shared_ptr<BaseExtensionRecord> &abilityRecord) override;
void HandlePostLoadTimeout(const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int64_t recordId) override;
void PostLoadTimeoutTask(const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int32_t loadTimeout) override;
int DispatchForeground(const std::shared_ptr<BaseExtensionRecord> &abilityRecord,
const sptr<IRemoteObject> &token) override;
@@ -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<std::shared_ptr<ConnectionRecord>> AbilityConnectManager::GetConnectRe
}
void AbilityConnectManager::LoadAbility(const std::shared_ptr<BaseExtensionRecord> &abilityRecord,
std::function<void(const std::shared_ptr<BaseExtensionRecord>&)> updateRecordCallback, bool isPreloadUIExtension)
std::function<void(const std::shared_ptr<BaseExtensionRecord>&)> 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_ptr<BaseExtensionRecor
RemoveServiceAbility(abilityRecord);
return;
}
int32_t loadTimeoutFinal =
AmsConfigurationParameter::GetInstance().GetAppStartTimeoutTime() * GetLoadTimeout(loadTimeout);
if (!abilityRecord->IsDebugApp()) {
TAG_LOGD(AAFwkTag::EXT, "IsDebug is false, here is not debug app");
PostTimeOutTask(abilityRecord, AbilityManagerService::LOAD_TIMEOUT_MSG);
PostLoadTimeoutTask(abilityRecord, loadTimeoutFinal);
}
sptr<Token> token = abilityRecord->GetToken();
sptr<Token> perToken = nullptr;
@@ -1241,6 +1245,7 @@ void AbilityConnectManager::LoadAbility(const std::shared_ptr<BaseExtensionRecor
loadParam.customProcessFlag = abilityRecord->GetCustomProcessFlag();
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_ptr<BaseExtensionR
std::string taskName;
auto recordId = abilityRecord->GetAbilityRecordId();
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<BaseExtensionR
}
}
void AbilityConnectManager::HandlePostLoadTimeout(const std::shared_ptr<BaseExtensionRecord> &abilityRecord,
int64_t recordId)
void AbilityConnectManager::PostLoadTimeoutTask(const std::shared_ptr<BaseExtensionRecord> &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<BaseExtensionRecord> &abilityRecord,
@@ -1465,6 +1472,27 @@ void AbilityConnectManager::HandlePostConnectTimeout(const std::shared_ptr<BaseE
abilityRecord->GetUid(), 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<BaseExtensionRecord> &abilityRecord)
{
TAG_LOGW(AAFwkTag::EXT, "load timeout");
@@ -570,13 +570,20 @@ ErrCode AbilityManagerClient::MinimizeUIAbilityBySCB(sptr<SessionInfo> sessionIn
}
ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConnection> connect, int32_t userId)
{
return ConnectAbility(want, connect, userId, 0);
}
ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConnection> 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<IAbilityConnection> 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, sptr<IAb
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::UNSPECIFIED, userId);
return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::UNSPECIFIED, userId,
false, 0, loadTimeout);
}
ErrCode AbilityManagerClient::ConnectUIExtensionAbility(const Want &want, sptr<IAbilityConnection> connect,
@@ -1394,7 +1394,7 @@ int AbilityManagerProxy::ConnectAbility(
int AbilityManagerProxy::ConnectAbilityCommon(
const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &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<int32_t>(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);
@@ -5203,7 +5203,7 @@ int32_t AbilityManagerService::ConnectAbility(
int32_t AbilityManagerService::ConnectAbilityCommon(
const Want &want, const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &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<IAbilityConnection> connect)
int32_t AbilityManagerService::ConnectLocalAbility(const Want &want, const int32_t userId,
const sptr<IAbilityConnection> &connect, const sptr<IRemoteObject> &callerToken,
AppExecFwk::ExtensionAbilityType extensionType, const sptr<SessionInfo> &sessionInfo,
bool isQueryExtensionOnly, sptr<UIExtensionAbilityConnectInfo> connectInfo, uint64_t specifiedFullTokenId)
bool isQueryExtensionOnly, sptr<UIExtensionAbilityConnectInfo> 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");
@@ -1834,8 +1834,9 @@ int AbilityManagerStub::ConnectAbilityWithTypeInner(MessageParcel &data, Message
AppExecFwk::ExtensionAbilityType extensionType = static_cast<AppExecFwk::ExtensionAbilityType>(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;
}
@@ -1140,9 +1140,13 @@ void UIExtensionAbilityManager::HandleAbilityDiedTaskInner(const std::shared_ptr
HandleAfterServiceRemoved(abilityRecord, isRemove);
}
void UIExtensionAbilityManager::HandlePostLoadTimeout(const std::shared_ptr<BaseExtensionRecord> &abilityRecord,
int64_t recordId)
void UIExtensionAbilityManager::PostLoadTimeoutTask(const std::shared_ptr<BaseExtensionRecord> &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);
}
@@ -1914,6 +1914,8 @@ private:
void AfterLoadAbility(std::shared_ptr<AppRunningRecord> appRecord, std::shared_ptr<AbilityInfo> abilityInfo,
std::shared_ptr<AbilityRuntime::LoadParam> loadParam);
static int32_t GetLoadTimeout(int32_t loadTimeout);
void RemoveRenderRecordNoAttach(const std::shared_ptr<AppRunningRecord> &hostRecord, int32_t renderPid);
void HandleExistingAppRecordAfterFound(std::shared_ptr<AppRunningRecord> appRecord,
+13 -3
View File
@@ -1249,17 +1249,18 @@ void AppMgrServiceInner::AfterLoadAbility(std::shared_ptr<AppRunningRecord> 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<int64_t>(abilityRecordId));
}
@@ -1274,6 +1275,15 @@ void AppMgrServiceInner::AfterLoadAbility(std::shared_ptr<AppRunningRecord> 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<AppRunningRecord> appRecord,
std::shared_ptr<AbilityInfo> abilityInfo, const HapModuleInfo &hapModuleInfo,
std::shared_ptr<AAFwk::Want> want, bool isProcCache, const std::shared_ptr<AbilityRuntime::LoadParam> &loadParam)
@@ -98,6 +98,12 @@ ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConn
return -1;
}
ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConnection> connect, int32_t userId,
int32_t loadTimeout)
{
return -1;
}
ErrCode AbilityManagerClient::ConnectAbility(const Want& want, sptr<IAbilityConnection> connect,
sptr<IRemoteObject> callerToken, int32_t userId, uint64_t specifiedFullTokenId)
{
@@ -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<CommonExtensionManager> connectManager = std::make_shared<CommonExtensionManager>(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<CommonExtensionManager> connectManager = std::make_shared<CommonExtensionManager>(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<CommonExtensionManager> connectManager = std::make_shared<CommonExtensionManager>(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
@@ -255,7 +255,7 @@ std::shared_ptr<BaseExtensionRecord> AbilityConnectManager::GetExtensionByTokenF
void AbilityConnectManager::LoadAbility(const std::shared_ptr<BaseExtensionRecord> &abilityRecord,
std::function<void(const std::shared_ptr<BaseExtensionRecord>&)> updateRecordCallback,
bool isPreloadUIExtension)
bool isPreloadUIExtension, int32_t loadTimeout)
{
}
@@ -669,8 +669,8 @@ bool AbilityConnectManager::HandleExtensionAbilityRemove(const std::shared_ptr<B
return false;
}
void AbilityConnectManager::HandlePostLoadTimeout(
const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int64_t recordId)
void AbilityConnectManager::PostLoadTimeoutTask(
const std::shared_ptr<BaseExtensionRecord> &abilityRecord, int32_t loadTimeout)
{
}
@@ -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",
]
@@ -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
@@ -278,6 +278,12 @@ ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConn
return ERR_OK;
}
ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConnection> connect, int32_t userId,
int32_t loadTimeout)
{
return ERR_OK;
}
ErrCode AbilityManagerClient::ConnectAbility(const Want &want, sptr<IAbilityConnection> connect,
sptr<IRemoteObject> callerToken, int32_t userId, uint64_t specifiedFullTokenId)
{
@@ -297,7 +303,7 @@ ErrCode AbilityManagerClient::ConnectDataShareExtensionAbility(const Want &want,
}
ErrCode AbilityManagerClient::ConnectExtensionAbility(const Want &want, sptr<IAbilityConnection> connect,
int32_t userId)
int32_t userId, int32_t loadTimeout)
{
return ERR_OK;
}
+1
View File
@@ -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
+4
View File
@@ -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;
}