From 9bd8979bbc4cb5a2c1157ae8fe2321385e094916 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Mon, 23 Jun 2025 14:11:02 +0800 Subject: [PATCH] =?UTF-8?q?bugfix=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzezhong --- .../ani/app_manager/src/sts_app_manager.cpp | 25 +-- frameworks/ets/ani/application/BUILD.gn | 4 + .../ani/application/src/ets_application.cpp | 136 ++++++++++---- frameworks/ets/ets/application/Context.ets | 11 +- .../ability_runtime/app/sts_ability_stage.cpp | 10 +- .../context/sts_context_utils.cpp | 166 +++++++++--------- .../native/appkit/app/ohos_application.cpp | 6 +- .../context/sts_context_utils.h | 11 +- .../sts_environment_test.cpp | 23 +++ 9 files changed, 246 insertions(+), 146 deletions(-) diff --git a/frameworks/ets/ani/app_manager/src/sts_app_manager.cpp b/frameworks/ets/ani/app_manager/src/sts_app_manager.cpp index b8ed791f62f..723c621c395 100644 --- a/frameworks/ets/ani/app_manager/src/sts_app_manager.cpp +++ b/frameworks/ets/ani/app_manager/src/sts_app_manager.cpp @@ -142,7 +142,7 @@ public: { TAG_LOGD(AAFwkTag::APPMGR, "GetRunningProcessInformation called"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::APPMGR, "appManager null ptr"); + TAG_LOGE(AAFwkTag::APPMGR, "env null ptr"); return; } ani_object emptyArray = CreateEmptyAniArray(env); @@ -215,24 +215,26 @@ public: { TAG_LOGD(AAFwkTag::APPMGR, "GetRunningMultiAppInfo called"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::APPMGR, "invalid argc"); + TAG_LOGE(AAFwkTag::APPMGR, "env null ptr"); return; } ani_object emtpyMultiAppInfo = CreateEmptyMultiAppInfo(env); #ifdef SUPPORT_SCREEN if (!CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::APPMGR, "Non-system app"); - AppExecFwk::AsyncCallback(env, callback, - OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, - static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP)), emtpyMultiAppInfo); + AppExecFwk::AsyncCallback(env, callback, OHOS::AbilityRuntime::CreateStsError(env, + AbilityRuntime::AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), emtpyMultiAppInfo); + return; } #endif std::string bundleName; - if (!OHOS::AppExecFwk::GetStdString(env, stsBundleName, bundleName)) { + if (!OHOS::AppExecFwk::GetStdString(env, stsBundleName, bundleName) || bundleName.empty()) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); AppExecFwk::AsyncCallback(env, callback, - OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, - static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INVALID_PARAM)), emtpyMultiAppInfo); + OHOS::AbilityRuntime::CreateStsError(env, + static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INVALID_PARAM), + "Parse param bundleName failed, must be a string."), emtpyMultiAppInfo); + return; } auto appManager = GetAppManagerInstance(); if (appManager == nullptr) { @@ -248,8 +250,7 @@ public: TAG_LOGD(AAFwkTag::APPMGR, "GetRunningMultiAppInfoByBundleName ret: %{public}d", innerErrorCode); if (innerErrorCode != ERR_OK) { AppExecFwk::AsyncCallback(env, callback, - OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, - static_cast(innerErrorCode)), emtpyMultiAppInfo); + OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, innerErrorCode), emtpyMultiAppInfo); return; } ani_object appinfoObj = WrapRunningMultiAppInfo(env, info); @@ -259,8 +260,7 @@ public: static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER)), emtpyMultiAppInfo); } else { AppExecFwk::AsyncCallback(env, callback, - OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, - static_cast(innerErrorCode)), appinfoObj); + OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, innerErrorCode), appinfoObj); } TAG_LOGD(AAFwkTag::APPMGR, "GetRunningMultiAppInfo end"); } @@ -308,6 +308,7 @@ public: if (ret != ERR_OK) { AppExecFwk::AsyncCallback(env, callback, OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, static_cast(ret)), emptyArray); + return; } ani_object aniInfos = CreateRunningProcessInfoArray(env, infos); if (aniInfos == nullptr) { diff --git a/frameworks/ets/ani/application/BUILD.gn b/frameworks/ets/ani/application/BUILD.gn index 8eeeeaaf6f3..18c2ecb3b96 100644 --- a/frameworks/ets/ani/application/BUILD.gn +++ b/frameworks/ets/ani/application/BUILD.gn @@ -39,12 +39,16 @@ ohos_shared_library("application_ani") { "${ability_runtime_native_path}/appkit:app_context", "${ability_runtime_native_path}/appkit:app_context_utils", "${ability_runtime_path}/frameworks/ets/ani/ani_common:ani_common", + "${ability_runtime_services_path}/common:perm_verification", ] external_deps = [ "ability_base:configuration", + "access_token:libaccesstoken_sdk", + "access_token:libtokenid_sdk", "bundle_framework:appexecfwk_core", "hilog:libhilog", + "ipc:ipc_core", "napi:ace_napi", "runtime_core:ani", ] diff --git a/frameworks/ets/ani/application/src/ets_application.cpp b/frameworks/ets/ani/application/src/ets_application.cpp index de59116f3bf..7f8579de3ae 100644 --- a/frameworks/ets/ani/application/src/ets_application.cpp +++ b/frameworks/ets/ani/application/src/ets_application.cpp @@ -13,16 +13,66 @@ * limitations under the License. */ #include "ets_application.h" -#include "sts_error_utils.h" + +#include "accesstoken_kit.h" #include "ani_base_context.h" #include "ani_common_util.h" -#include "sts_context_utils.h" #include "application_context.h" #include "context_impl.h" #include "hilog_tag_wrapper.h" +#include "ipc_skeleton.h" +#include "permission_verification.h" +#include "sts_context_utils.h" +#include "sts_error_utils.h" +#include "tokenid_kit.h" namespace OHOS { namespace AbilityRuntime { +namespace { +constexpr const char* PERMISSION_GET_BUNDLE_INFO = "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED"; +} + +ani_object CreateEmptyObject(ani_env *env) +{ + ani_class cls = nullptr; + ani_status status = env->FindClass("Lapplication/Context/Context;", &cls); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "find Context failed status: %{public}d", status); + return nullptr; + } + ani_method method = nullptr; + status = env->Class_FindMethod(cls, "", ":V", &method); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "Class_FindMethod ctor failed status: %{public}d", status); + return nullptr; + } + ani_object objValue = nullptr; + if (env->Object_New(cls, method, &objValue) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "Object_New failed status: %{public}d", status); + return nullptr; + } + return objValue; +} + +bool CheckIsSystemAppOrPermisson(ani_env *env, ani_object callback) +{ + auto emptyObject = CreateEmptyObject(env); + if (!AAFwk::PermissionVerification::GetInstance()->IsSystemAppCall()) { + TAG_LOGE(AAFwkTag::APPKIT, "no system app"); + AppExecFwk::AsyncCallback(env, callback, CreateStsError(env, + static_cast(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), + "The application is not system-app, can not use system-api."), emptyObject); + return false; + } + if (!AAFwk::PermissionVerification::GetInstance()->VerifyGetBundleInfoPrivilegedPermission()) { + TAG_LOGE(AAFwkTag::APPKIT, "no permission"); + AppExecFwk::AsyncCallback(env, callback, + CreateStsNoPermissionError(env, PERMISSION_GET_BUNDLE_INFO), emptyObject); + return false; + } + return true; +} + bool SetNativeContextLong(ani_env *env, std::shared_ptr context, ani_class& cls, ani_object& contextObj) { if (env == nullptr || context == nullptr) { @@ -33,30 +83,25 @@ bool SetNativeContextLong(ani_env *env, std::shared_ptr context, ani_cl ani_method method {}; if ((status = env->Class_FindMethod(cls, "", ":V", &method)) != ANI_OK) { TAG_LOGE(AAFwkTag::APPKIT, "status: %{public}d", status); - ThrowStsInvalidParamError(env, "find method failed."); return false; } if ((status = env->Object_New(cls, method, &contextObj)) != ANI_OK) { TAG_LOGE(AAFwkTag::APPKIT, "status: %{public}d", status); - ThrowStsInvalidParamError(env, "new object failed."); return false; } ani_field field = nullptr; if ((status = env->Class_FindField(cls, "nativeContext", &field)) != ANI_OK) { TAG_LOGE(AAFwkTag::APPKIT, "status: %{public}d", status); - ThrowStsInvalidParamError(env, "find nativeContext failed."); return false; } auto workContext = new (std::nothrow) std::weak_ptr(context); if (workContext == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "workContext nullptr"); - ThrowStsInvalidParamError(env, "workContext is null."); return false; } ani_long nativeContextLong = (ani_long)workContext; if ((status = env->Object_SetField_Long(contextObj, field, nativeContextLong)) != ANI_OK) { TAG_LOGE(AAFwkTag::APPKIT, "status: %{public}d", status); - ThrowStsInvalidParamError(env, "set field failed."); delete workContext; workContext = nullptr; return false; @@ -73,29 +118,15 @@ void SetCreateCompleteCallback(ani_env *env, std::shared_ptrFindClass("Lapplication/Context/Context;", &cls); - if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "find Context failed status: %{public}d", status); - } - ani_method method = nullptr; - status = env->Class_FindMethod(cls, "", ":V", &method); - if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Class_FindMethod ctor failed status: %{public}d", status); - } - ani_object objValue = nullptr; - if (env->Object_New(cls, method, &objValue) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Object_New failed status: %{public}d", status); - } + auto emptyObject = CreateEmptyObject(env); AppExecFwk::AsyncCallback(env, callback, CreateStsError(env, - AbilityErrorCode::ERROR_CODE_INVALID_PARAM), objValue); + AbilityErrorCode::ERROR_CODE_INVALID_PARAM), emptyObject); return; } ani_class cls {}; ani_status status = ANI_ERROR; if ((status = env->FindClass("Lapplication/Context/Context;", &cls)) != ANI_OK) { TAG_LOGE(AAFwkTag::APPKIT, "status: %{public}d", status); - ThrowStsInvalidParamError(env, "find class failed."); return; } ani_object contextObj = nullptr; @@ -113,6 +144,27 @@ void SetCreateCompleteCallback(ani_env *env, std::shared_ptr GetStageModeContext(ani_env *env, ani_object &contextObj, + ani_object callback, ani_object emptyObject) +{ + ani_boolean stageMode = false; + ani_status status = IsStageContext(env, contextObj, stageMode); + if (status != ANI_OK || !stageMode) { + TAG_LOGE(AAFwkTag::APPKIT, "not stageMode"); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "Parse param context failed, must be a context of stageMode."), emptyObject); + return nullptr; + } + auto context = GetStageModeContext(env, contextObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null context"); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "Parse param context failed, must not be nullptr."), emptyObject); + return nullptr; + } + return context; +} + static void CreateModuleContext([[maybe_unused]] ani_env *env, ani_object contextObj, ani_string bundleName, ani_string moduleName, ani_object callback) { @@ -121,40 +173,37 @@ static void CreateModuleContext([[maybe_unused]] ani_env *env, TAG_LOGE(AAFwkTag::APPKIT, "null env"); return; } + ani_object emptyObject = CreateEmptyObject(env); std::string stdBundleName = ""; std::string stdModuleName = ""; AppExecFwk::GetStdString(env, bundleName, stdBundleName); AppExecFwk::GetStdString(env, moduleName, stdModuleName); - ani_boolean stageMode = false; - ani_status status = OHOS::AbilityRuntime::IsStageContext(env, contextObj, stageMode); - if (status != ANI_OK || !stageMode) { - TAG_LOGE(AAFwkTag::APPKIT, "not stageMode"); - ThrowStsInvalidParamError(env, "Parse param context failed, must be a context of stageMode."); - return; - } - auto context = OHOS::AbilityRuntime::GetStageModeContext(env, contextObj); + auto context = GetStageModeContext(env, contextObj, callback, emptyObject); if (context == nullptr) { - TAG_LOGE(AAFwkTag::APPKIT, "null context"); - ThrowStsInvalidParamError(env, "Parse param context failed, must not be nullptr."); return; } auto inputContextPtr = Context::ConvertTo(context); if (inputContextPtr == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "Convert to context failed"); - ThrowStsInvalidParamError(env, "Parse param context failed, must be a context."); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "Parse param context failed, must be a context."), emptyObject); return; } std::shared_ptr> moduleContext = std::make_shared>(); std::shared_ptr contextImpl = std::make_shared(); if (contextImpl == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "null contextImpl"); - ThrowStsInvalidParamError(env, "create context failed."); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "create context failed."), emptyObject); return; } contextImpl->SetProcessName(context->GetProcessName()); if (stdBundleName.empty()) { *moduleContext = contextImpl->CreateModuleContext(stdModuleName, inputContextPtr); } else { + if (!CheckIsSystemAppOrPermisson(env, callback)) { + TAG_LOGE(AAFwkTag::APPKIT, "CheckCaller failed"); + } *moduleContext = contextImpl->CreateModuleContext(stdBundleName, stdModuleName, inputContextPtr); } SetCreateCompleteCallback(env, moduleContext, callback); @@ -168,32 +217,41 @@ static void CreateBundleContext([[maybe_unused]] ani_env *env, TAG_LOGE(AAFwkTag::APPKIT, "null env"); return; } + ani_object emptyObject = CreateEmptyObject(env); + if (!CheckIsSystemAppOrPermisson(env, callback)) { + TAG_LOGE(AAFwkTag::APPKIT, "CheckCaller failed"); + return; + } std::string stdBundleName = ""; AppExecFwk::GetStdString(env, bundleName, stdBundleName); ani_boolean stageMode = false; ani_status status = OHOS::AbilityRuntime::IsStageContext(env, contextObj, stageMode); if (status != ANI_OK || !stageMode) { TAG_LOGE(AAFwkTag::APPKIT, "not stageMode"); - ThrowStsInvalidParamError(env, "Parse param context failed, must be a context of stageMode."); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "Parse param context failed, must be a context of stageMode."), emptyObject); return; } auto context = OHOS::AbilityRuntime::GetStageModeContext(env, contextObj); if (context == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "null context"); - ThrowStsInvalidParamError(env, "Parse param context failed, must not be nullptr."); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "Parse param context failed, must not be nullptr."), emptyObject); return; } auto inputContextPtr = Context::ConvertTo(context); if (inputContextPtr == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "Convert to context failed"); - ThrowStsInvalidParamError(env, "Parse param context failed, must be a context."); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "Parse param context failed, must be a context."), emptyObject); return; } auto bundleContext = std::make_shared>(); std::shared_ptr contextImpl = std::make_shared(); if (contextImpl == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "null contextImpl"); - ThrowStsInvalidParamError(env, "create context failed."); + AppExecFwk::AsyncCallback(env, callback, CreateStsInvalidParamError(env, + "create context failed."), emptyObject); return; } contextImpl->SetProcessName(context->GetProcessName()); diff --git a/frameworks/ets/ets/application/Context.ets b/frameworks/ets/ets/application/Context.ets index 29dd7bdd7a5..18b7cce694d 100644 --- a/frameworks/ets/ets/application/Context.ets +++ b/frameworks/ets/ets/application/Context.ets @@ -27,7 +27,6 @@ export class Context extends BaseContext { static { loadLibrary("context_ani"); } - area: contextConstant.AreaMode = contextConstant.AreaMode.EL1; filesDir: string = ""; tempDir: string = ""; preferencesDir: string = ""; @@ -47,6 +46,8 @@ export class Context extends BaseContext { public native getApplicationContextSync(): ApplicationContext; public native createModuleResourceManagerSync(bundleName: string, moduleName: string): resmgr.ResourceManager; public native nativeGetGroupDir(dataGroupID: string, callback: AsyncCallbackWrapper): void; + private native switchArea(mode: contextConstant.AreaMode): void; + private native getArea(): contextConstant.AreaMode; getApplicationContext(): ApplicationContext { return this.getApplicationContextSync(); @@ -77,4 +78,12 @@ export class Context extends BaseContext { }); }); } + + set area(mode: contextConstant.AreaMode) { + this.switchArea(mode); + } + + get area(): contextConstant.AreaMode { + return this.getArea(); + } } \ No newline at end of file diff --git a/frameworks/native/appkit/ability_runtime/app/sts_ability_stage.cpp b/frameworks/native/appkit/ability_runtime/app/sts_ability_stage.cpp index f7d1553fe21..135ee833997 100644 --- a/frameworks/native/appkit/ability_runtime/app/sts_ability_stage.cpp +++ b/frameworks/native/appkit/ability_runtime/app/sts_ability_stage.cpp @@ -165,17 +165,19 @@ std::string STSAbilityStage::OnNewProcessRequest(const AAFwk::Want &want) void STSAbilityStage::OnConfigurationUpdated(const AppExecFwk::Configuration& configuration) { + TAG_LOGD(AAFwkTag::APPKIT, "OnConfigurationUpdated called"); AbilityStage::OnConfigurationUpdated(configuration); auto env = stsRuntime_.GetAniEnv(); if (env == nullptr) { TAG_LOGE(AAFwkTag::ABILITY, "env nullptr"); return; } - ani_object configObj = OHOS::AppExecFwk::WrapConfiguration(env, configuration); - - CallObjectMethod(false, "onConfigurationUpdate", "L@ohos/app/ability/Configuration/Configuration;:V", - &configuration); + if (configObj == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null configObj"); + return; + } + CallObjectMethod(false, "onConfigurationUpdate", "L@ohos/app/ability/Configuration/Configuration;:V", configObj); } void STSAbilityStage::OnMemoryLevel(int32_t level) diff --git a/frameworks/native/appkit/ability_runtime/context/sts_context_utils.cpp b/frameworks/native/appkit/ability_runtime/context/sts_context_utils.cpp index 211769500dc..2e8b659e5c9 100644 --- a/frameworks/native/appkit/ability_runtime/context/sts_context_utils.cpp +++ b/frameworks/native/appkit/ability_runtime/context/sts_context_utils.cpp @@ -33,7 +33,56 @@ namespace AbilityRuntime { namespace ContextUtil { namespace { constexpr const char* AREA_MODE_ENUM_NAME = "L@ohos/app/ability/contextConstant/contextConstant/AreaMode;"; + +void BindContextDir(ani_env *aniEnv, ani_object contextObj, std::shared_ptr context) +{ + if (aniEnv == nullptr || context == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "aniEnv or context is nullptr"); + return; + } + ani_status status = ANI_ERROR; + auto preferencesDir = context->GetPreferencesDir(); + ani_string preferencesDirString = nullptr; + aniEnv->String_NewUTF8(preferencesDir.c_str(), preferencesDir.size(), &preferencesDirString); + if ((status = aniEnv->Object_SetFieldByName_Ref(contextObj, "preferencesDir", preferencesDirString)) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "preferencesDir SetField status: %{public}d", status); + return; + } + + auto databaseDir = context->GetDatabaseDir(); + ani_string databaseDirString = nullptr; + aniEnv->String_NewUTF8(databaseDir.c_str(), databaseDir.size(), &databaseDirString); + if ((status = aniEnv->Object_SetFieldByName_Ref(contextObj, "databaseDir", databaseDirString)) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "databaseDir SetField status: %{public}d", status); + return; + } + + auto cacheDir = context->GetCacheDir(); + ani_string cacheDirString = nullptr; + aniEnv->String_NewUTF8(cacheDir.c_str(), cacheDir.size(), &cacheDirString); + if ((status = aniEnv->Object_SetFieldByName_Ref(contextObj, "cacheDir", cacheDirString)) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "cacheDir SetField status: %{public}d", status); + return; + } + + auto filesDir = context->GetFilesDir(); + ani_string filesDirString = nullptr; + aniEnv->String_NewUTF8(filesDir.c_str(), filesDir.size(), &filesDirString); + if ((status = aniEnv->Object_SetFieldByName_Ref(contextObj, "filesDir", filesDirString)) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "filesDir SetField status: %{public}d", status); + return; + } + + auto tempDir = context->GetTempDir(); + ani_string tempDirString = nullptr; + aniEnv->String_NewUTF8(tempDir.c_str(), tempDir.size(), &tempDirString); + if ((status = aniEnv->Object_SetFieldByName_Ref(contextObj, "tempDir", tempDirString)) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "tempDir SetField status: %{public}d", status); + return; + } } +} // namespace + static std::weak_ptr context_; void BindApplicationCtx(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, void* applicationCtxRef) @@ -90,6 +139,7 @@ void BindParentProperty(ani_env* aniEnv, ani_class contextClass, ani_object cont { BindApplicationInfo(aniEnv, contextClass, contextObj, context); BindResourceManager(aniEnv, contextClass, contextObj, context); + BindContextDir(aniEnv, contextObj, context); // bind parent context property ani_field areaField; @@ -99,41 +149,13 @@ void BindParentProperty(ani_env* aniEnv, ani_class contextClass, ani_object cont return; } auto area = context->GetArea(); - ani_enum_item areaModeItem {}; + ani_enum_item areaModeItem = nullptr; OHOS::AAFwk::AniEnumConvertUtil::EnumConvertNativeToSts(aniEnv, AREA_MODE_ENUM_NAME, area, areaModeItem); if ((status = aniEnv->Object_SetField_Ref(contextObj, areaField, (ani_ref)areaModeItem)) != ANI_OK) { TAG_LOGE(AAFwkTag::APPKIT, "Object_SetField_Int failed, status: %{public}d", status); return; } - - ani_field filesDirField; - if ((status = aniEnv->Class_FindField(contextClass, "filesDir", &filesDirField)) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "find filesDir failed, status: %{public}d", status); - return; - } - auto filesDir = context->GetFilesDir(); - ani_string filesDir_string{}; - aniEnv->String_NewUTF8(filesDir.c_str(), filesDir.size(), &filesDir_string); - if ((status = aniEnv->Object_SetField_Ref(contextObj, filesDirField, - reinterpret_cast(filesDir_string))) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Object_SetField_Ref failed, status: %{public}d", status); - return; - } - - ani_field tempDirField; - if ((status = aniEnv->Class_FindField(contextClass, "tempDir", &tempDirField)) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "find find tempDir failed, status: %{public}d", status); - return; - } - auto tempDir = context->GetTempDir(); - ani_string tempDir_string{}; - aniEnv->String_NewUTF8(tempDir.c_str(), tempDir.size(), &tempDir_string); - if ((status = aniEnv->Object_SetField_Ref(contextObj, tempDirField, - reinterpret_cast(tempDir_string))) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Object_SetField_Ref failed, status: %{public}d", status); - return; - } } void BindParentPropertyInner(ani_env *aniEnv, ani_class contextClass, ani_object contextObj, @@ -146,7 +168,7 @@ void BindParentPropertyInner(ani_env *aniEnv, ani_class contextClass, ani_object return; } auto processName = context->GetProcessName(); - ani_string processNameString{}; + ani_string processNameString = nullptr; aniEnv->String_NewUTF8(processName.c_str(), processName.size(), &processNameString); if ((status = aniEnv->Object_SetField_Ref(contextObj, processNameField, reinterpret_cast(processNameString))) != ANI_OK) { @@ -155,57 +177,6 @@ void BindParentPropertyInner(ani_env *aniEnv, ani_class contextClass, ani_object } } -void BindContextDir(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, - std::shared_ptr context) -{ - if (aniEnv == nullptr || context == nullptr) { - TAG_LOGE(AAFwkTag::APPKIT, "aniEnv or context is nullptr"); - return; - } - ani_status status = ANI_ERROR; - ani_field preferencesDirField; - if ((status = aniEnv->Class_FindField(contextClass, "preferencesDir", &preferencesDirField)) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "find preferencesDir failed, status: %{public}d", status); - return; - } - auto preferencesDir = context->GetPreferencesDir(); - ani_string preferencesDirString{}; - aniEnv->String_NewUTF8(preferencesDir.c_str(), preferencesDir.size(), &preferencesDirString); - if ((status = aniEnv->Object_SetField_Ref(contextObj, preferencesDirField, - reinterpret_cast(preferencesDirString))) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Object_SetField_Ref failed status: %{public}d", status); - return; - } - - ani_field databaseDirField; - if ((status = aniEnv->Class_FindField(contextClass, "databaseDir", &databaseDirField)) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "find databaseDir failed status: %{public}d", status); - return; - } - auto databaseDir = context->GetDatabaseDir(); - ani_string databaseDirString{}; - aniEnv->String_NewUTF8(databaseDir.c_str(), databaseDir.size(), &databaseDirString); - if ((status = aniEnv->Object_SetField_Ref(contextObj, databaseDirField, - reinterpret_cast(databaseDirString))) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Object_SetField_Ref failed status: %{public}d", status); - return; - } - - ani_field cacheDirField; - if ((status = aniEnv->Class_FindField(contextClass, "cacheDir", &cacheDirField)) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "find cacheDir failed status: %{public}d", status); - return; - } - auto cacheDir = context->GetCacheDir(); - ani_string cacheDirString{}; - aniEnv->String_NewUTF8(cacheDir.c_str(), cacheDir.size(), &cacheDirString); - if ((status = aniEnv->Object_SetField_Ref(contextObj, cacheDirField, - reinterpret_cast(cacheDirString))) != ANI_OK) { - TAG_LOGE(AAFwkTag::APPKIT, "Object_SetField_Ref failed, status: %{public}d", status); - return; - } -} - bool SetHapModuleInfo( ani_env *env, ani_class cls, ani_object contextObj, const std::shared_ptr &context) { @@ -250,7 +221,6 @@ void StsCreatContext(ani_env* aniEnv, ani_class contextClass, ani_object context } context_ = context; BindParentProperty(aniEnv, contextClass, contextObj, context); - BindContextDir(aniEnv, contextClass, contextObj, context); } bool CheckCallerIsSystemApp() @@ -334,6 +304,38 @@ void NativeGetGroupDir([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object ani_string aniPath = AppExecFwk::GetAniString(env, path); AppExecFwk::AsyncCallback(env, callBackObj, errorObject, aniPath); } + +void SwitchArea(ani_env *env, ani_object obj, ani_enum_item areaModeItem) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null env"); + } + int32_t areaMode = 0; + if (!AAFwk::AniEnumConvertUtil::EnumConvertStsToNative(env, areaModeItem, areaMode)) { + TAG_LOGE(AAFwkTag::APPKIT, "Parse area failed"); + return; + } + auto context = context_.lock(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null context"); + return; + } + context->SwitchArea(areaMode); + BindContextDir(env, obj, context); +} + +ani_enum_item GetArea(ani_env *env) +{ + ani_enum_item areaModeItem = nullptr; + auto context = context_.lock(); + if (env == nullptr || context == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "env or context is null"); + return areaModeItem; + } + int32_t areaMode = static_cast(context->GetArea()); + OHOS::AAFwk::AniEnumConvertUtil::EnumConvertNativeToSts(env, AREA_MODE_ENUM_NAME, areaMode, areaModeItem); + return areaModeItem; +} } } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/native/appkit/app/ohos_application.cpp b/frameworks/native/appkit/app/ohos_application.cpp index 8067bd0d912..9045796d801 100644 --- a/frameworks/native/appkit/app/ohos_application.cpp +++ b/frameworks/native/appkit/app/ohos_application.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -246,6 +246,10 @@ void OHOSApplication::InitAniContext() reinterpret_cast(AbilityRuntime::ContextUtil::CreateModuleResourceManagerSync)}, ani_native_function {"nativeGetGroupDir", nullptr, reinterpret_cast(AbilityRuntime::ContextUtil::NativeGetGroupDir)}, + ani_native_function {"switchArea", nullptr, + reinterpret_cast(AbilityRuntime::ContextUtil::SwitchArea)}, + ani_native_function {"getArea", nullptr, + reinterpret_cast(AbilityRuntime::ContextUtil::GetArea)}, }; aniEnv->Class_BindNativeMethods(contextCls, contextFunctions.data(), contextFunctions.size()); diff --git a/interfaces/kits/native/appkit/ability_runtime/context/sts_context_utils.h b/interfaces/kits/native/appkit/ability_runtime/context/sts_context_utils.h index 188d5d3f83a..d62573ec06e 100644 --- a/interfaces/kits/native/appkit/ability_runtime/context/sts_context_utils.h +++ b/interfaces/kits/native/appkit/ability_runtime/context/sts_context_utils.h @@ -26,10 +26,6 @@ namespace ContextUtil { void BindApplicationCtx(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, void* applicationCtxRef); -void SetArea([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, ani_int value); - -void BindMethods(ani_env* aniEnv, ani_class contextClass); - void BindApplicationInfo(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, std::shared_ptr context); @@ -42,9 +38,6 @@ void BindParentProperty(ani_env* aniEnv, ani_class contextClass, ani_object cont void BindParentPropertyInner(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, std::shared_ptr context); -void BindContextDir(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, - std::shared_ptr context); - void StsCreatContext(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, void* applicationCtxRef, std::shared_ptr context); @@ -55,6 +48,10 @@ ani_object GetApplicationContextSync([[maybe_unused]]ani_env *env, [[maybe_unuse void NativeGetGroupDir([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, ani_string dataGroupIdObj, ani_object callBackObj); + +void SwitchArea(ani_env *env, ani_object obj, ani_enum_item areaModeItem); + +ani_enum_item GetArea(ani_env *env); } } // namespace AbilityRuntime } // namespace OHOS diff --git a/sts_environment/test/unittest/sts_environment_test/sts_environment_test.cpp b/sts_environment/test/unittest/sts_environment_test/sts_environment_test.cpp index c2828f4ba11..49a1bff22de 100644 --- a/sts_environment/test/unittest/sts_environment_test/sts_environment_test.cpp +++ b/sts_environment/test/unittest/sts_environment_test/sts_environment_test.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ #include +#include #include #include #include @@ -23,6 +24,7 @@ #include "sts_environment.h" #undef private #include "sts_environment_impl.h" +#include "sts_invoker.h" using namespace testing; using namespace testing::ext; @@ -206,5 +208,26 @@ HWTEST_F(StsEnvironmentTest, GetAniEnv_0100, TestSize.Level0) stsEnv->vmEntry_ = vMEntryOld; } + +/** + * @tc.name: LoadSymbolANIGetCreatedVMs_0100 + * @tc.desc: Test LoadSymbolANIGetCreatedVMs when symbol is not found. + * @tc.type: FUNC + */ +HWTEST_F(StsEnvironmentTest, LoadSymbolANIGetCreatedVMs_0100, TestSize.Level0) +{ + std::shared_ptr eventRunner = AppExecFwk::EventRunner::Create(TEST_ABILITY_NAME); + auto stsEnv = + std::make_shared(std::make_unique(eventRunner)); + ASSERT_NE(stsEnv, nullptr); + void* handle = dlopen(nullptr, RTLD_LAZY); + ASSERT_NE(handle, nullptr); + STSRuntimeAPI apis; + bool result = stsEnv->LoadSymbolANIGetCreatedVMs(handle, apis); + dlclose(handle); + EXPECT_TRUE(result); + EXPECT_NE(apis.ANI_GetCreatedVMs, nullptr); +} + } // namespace StsEnv } // namespace OHOS \ No newline at end of file -- Gitee