mirror of
https://github.com/openharmony/ability_ability_runtime.git
synced 2026-08-25 12:23:20 -04:00
!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:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
+48
@@ -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
|
||||
|
||||
+3
-3
@@ -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
|
||||
+7
-1
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user