From 004ea80819959059b6f07c6f7999a2160e0a921b Mon Sep 17 00:00:00 2001 From: zhouyan Date: Wed, 30 Apr 2025 19:16:18 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=90=E7=A7=81=E6=9C=8D=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E7=9B=B8=E6=9C=BA=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyan Change-Id: I8750aeb9d482d40d7e2e7308161c6e1b9cc98515 --- access_token.gni | 8 +++ bundle.json | 1 + .../main/cpp/include/dfx/hisysevent_adapter.h | 2 +- services/privacymanager/BUILD.gn | 8 +++ .../record/permission_record_manager.h | 4 ++ .../src/record/permission_record_manager.cpp | 51 ++++++++++++++++++- .../privacymanager/test/coverage/BUILD.gn | 8 +++ .../privacymanager/test/unittest/BUILD.gn | 8 +++ .../services/privacy/privacy_service_fuzz.gni | 8 +++ 9 files changed, 95 insertions(+), 3 deletions(-) diff --git a/access_token.gni b/access_token.gni index d62e2c4a4..71a6aa0fc 100644 --- a/access_token.gni +++ b/access_token.gni @@ -164,3 +164,11 @@ if (!defined(global_parts_info) || } else { power_manager_enable = false } + +if (!defined(global_parts_info) || + defined(global_parts_info.resourceschedule_qos_manager)) { + qos_manager_enable = true +} else { + qos_manager_enable = false +} + diff --git a/bundle.json b/bundle.json index 9a569db58..77cca8b53 100644 --- a/bundle.json +++ b/bundle.json @@ -52,6 +52,7 @@ "napi", "openssl", "power_manager", + "qos_manager", "relational_store", "safwk", "samgr", diff --git a/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h b/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h index 953fff70a..4e58271b2 100644 --- a/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h +++ b/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h @@ -60,7 +60,7 @@ struct AccessTokenDfxInfo { std::string aclInfo; std::string preauthInfo; std::string extendInfo; - uint64_t duration; + int64_t duration; int32_t errorCode; int32_t pid; uint32_t hapSize; diff --git a/services/privacymanager/BUILD.gn b/services/privacymanager/BUILD.gn index f77373b51..431cafefb 100644 --- a/services/privacymanager/BUILD.gn +++ b/services/privacymanager/BUILD.gn @@ -274,5 +274,13 @@ if (is_standard_system && ability_base_enable == true) { include_dirs += [ "${access_token_path}/services/common/ability_manager/include" ] } + + if (qos_manager_enable) { + cflags_cc += [ "-DQOS_MANAGER_ENABLE" ] + external_deps += [ + "qos_manager:concurrent_task_client", + "qos_manager:qos", + ] + } } } diff --git a/services/privacymanager/include/record/permission_record_manager.h b/services/privacymanager/include/record/permission_record_manager.h index 17f738733..0ebc8dd5f 100644 --- a/services/privacymanager/include/record/permission_record_manager.h +++ b/services/privacymanager/include/record/permission_record_manager.h @@ -201,6 +201,10 @@ private: bool ToRemoveRecord(const ContinusPermissionRecord& targetRecord, const IsEqualFunc& isEqualFunc, bool needClearCamera = true); + void ProcRequestAuth(); + void SetCameraThreadQos(const std::string& permissionName); + void ResetCameraThreadQos(const std::string& permissionName); + private: bool hasInited_ = false; OHOS::Utils::RWLock rwLock_; diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index 9dfd852a0..db191cf16 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -52,6 +52,10 @@ #include "privacy_window_manager_client.h" #include "scene_board_judgement.h" #endif +#ifdef QOS_MANAGER_ENABLE +#include "concurrent_task_client.h" +#include "qos.h" +#endif namespace OHOS { namespace Security { @@ -144,6 +148,31 @@ void PrivacyAppManagerDeathCallback::NotifyAppManagerDeath() PermissionRecordManager::GetInstance().OnAppMgrRemoteDiedHandle(); } +void PermissionRecordManager::SetCameraThreadQos(const std::string& permissionName) +{ + if (permissionName != CAMERA_PERMISSION_NAME) { + return; + } + +#ifdef QOS_MANAGER_ENABLE + int32_t res = QOS::SetThreadQos(QOS::QosLevel::QOS_USER_INTERACTIVE); + if (res != 0) { + LOGE(PRI_DOMAIN, PRI_TAG, "Set thread qos failed, res is %{public}d.", res); + } +#endif +} + +void PermissionRecordManager::ResetCameraThreadQos(const std::string& permissionName) +{ + if (permissionName != CAMERA_PERMISSION_NAME) { + return; + } + +#ifdef QOS_MANAGER_ENABLE + QOS::ResetThreadQos(); +#endif +} + void PermissionRecordManager::AddRecToCacheAndValueVec(const PermissionRecord& record, std::vector& values) { @@ -417,6 +446,7 @@ bool PermissionRecordManager::CheckPermissionUsedRecordToggleStatus(int32_t user int32_t PermissionRecordManager::AddPermissionUsedRecord(const AddPermParamInfo& info) { + SetCameraThreadQos(info.permissionName); HapTokenInfo tokenInfo; if (AccessTokenKit::GetHapTokenInfo(info.tokenId, tokenInfo) != Constant::SUCCESS) { LOGE(PRI_DOMAIN, PRI_TAG, "Invalid tokenId(%{public}d).", info.tokenId); @@ -443,8 +473,11 @@ int32_t PermissionRecordManager::AddPermissionUsedRecord(const AddPermParamInfo& return result; } - return AddOrUpdateUsedTypeIfNeeded( + int32_t res = AddOrUpdateUsedTypeIfNeeded( info.tokenId, record.opCode, info.type) ? Constant::SUCCESS : Constant::FAILURE; + + ResetCameraThreadQos(info.permissionName); + return res; } int32_t PermissionRecordManager::SetPermissionUsedRecordToggleStatus(int32_t userID, bool status) @@ -1331,6 +1364,7 @@ int32_t PermissionRecordManager::StartUsingPermission(const PermissionUsedTypeIn int32_t PermissionRecordManager::StartUsingPermission(const PermissionUsedTypeInfo &info, const sptr& callback, int32_t callerPid) { + SetCameraThreadQos(info.permissionName); AccessTokenID tokenId = info.tokenId; const std::string &permissionName = info.permissionName; LOGI(PRI_DOMAIN, PRI_TAG, @@ -1369,6 +1403,7 @@ int32_t PermissionRecordManager::StartUsingPermission(const PermissionUsedTypeIn if (ret != RET_SUCCESS) { cameraCallbackMap_.Erase(id); } + ResetCameraThreadQos(info.permissionName); return ret; } @@ -1458,6 +1493,7 @@ bool PermissionRecordManager::IsAllowedUsingMicrophone(AccessTokenID tokenId, in bool PermissionRecordManager::IsAllowedUsingPermission(AccessTokenID tokenId, const std::string& permissionName, int32_t pid) { + SetCameraThreadQos(permissionName); if (AccessTokenKit::GetTokenTypeFlag(tokenId) != TOKEN_HAP) { LOGD(PRI_DOMAIN, PRI_TAG, "Id(%{public}d) is not hap.", tokenId); return false; @@ -1469,6 +1505,7 @@ bool PermissionRecordManager::IsAllowedUsingPermission(AccessTokenID tokenId, co return IsAllowedUsingMicrophone(tokenId, pid); } LOGE(PRI_DOMAIN, PRI_TAG, "Invalid permission(%{public}s).", permissionName.c_str()); + ResetCameraThreadQos(permissionName); return false; } @@ -2016,6 +2053,16 @@ bool PermissionRecordManager::IsUserIdValid(int32_t userID) const return userID >= 0 && userID <= MAX_USER_ID; } +void PermissionRecordManager::ProcRequestAuth() +{ +#ifdef QOS_MANAGER_ENABLE + std::unordered_map payload; + payload["pid"] = std::to_string(getpid()); + ConcurrentTask::ConcurrentTaskClient::GetInstance().RequestAuth(payload); +#endif + return; +} + void PermissionRecordManager::Init() { if (hasInited_) { @@ -2024,8 +2071,8 @@ void PermissionRecordManager::Init() LOGI(PRI_DOMAIN, PRI_TAG, "Init"); hasInited_ = true; + ProcRequestAuth(); UpdatePermUsedRecToggleStatusMapFromDb(); - GetConfigValue(); } } // namespace AccessToken diff --git a/services/privacymanager/test/coverage/BUILD.gn b/services/privacymanager/test/coverage/BUILD.gn index bebe39ff1..a145048e7 100644 --- a/services/privacymanager/test/coverage/BUILD.gn +++ b/services/privacymanager/test/coverage/BUILD.gn @@ -155,5 +155,13 @@ if (is_standard_system && ability_base_enable == true) { include_dirs += [ "${access_token_path}/services/common/ability_manager/include" ] } + + if (qos_manager_enable) { + cflags_cc += [ "-DQOS_MANAGER_ENABLE" ] + external_deps += [ + "qos_manager:concurrent_task_client", + "qos_manager:qos", + ] + } } } diff --git a/services/privacymanager/test/unittest/BUILD.gn b/services/privacymanager/test/unittest/BUILD.gn index 48ea15a50..5f820519f 100644 --- a/services/privacymanager/test/unittest/BUILD.gn +++ b/services/privacymanager/test/unittest/BUILD.gn @@ -162,5 +162,13 @@ if (is_standard_system && ability_base_enable == true) { include_dirs += [ "${access_token_path}/services/common/ability_manager/include" ] } + + if (qos_manager_enable) { + cflags_cc += [ "-DQOS_MANAGER_ENABLE" ] + external_deps += [ + "qos_manager:concurrent_task_client", + "qos_manager:qos", + ] + } } } diff --git a/test/fuzztest/services/privacy/privacy_service_fuzz.gni b/test/fuzztest/services/privacy/privacy_service_fuzz.gni index 285586d63..689398661 100644 --- a/test/fuzztest/services/privacy/privacy_service_fuzz.gni +++ b/test/fuzztest/services/privacy/privacy_service_fuzz.gni @@ -150,3 +150,11 @@ if (camera_framework_enable) { privacy_cflags_cc += [ "-DCAMERA_FRAMEWORK_ENABLE" ] privacy_external_deps += [ "camera_framework:camera_framework" ] } + +if (qos_manager_enable) { + privacy_cflags_cc += [ "-DQOS_MANAGER_ENABLE" ] + privacy_external_deps += [ + "qos_manager:concurrent_task_client", + "qos_manager:qos", + ] +} -- Gitee