199552fe9Sopenharmony_ci/* 299552fe9Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 399552fe9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 499552fe9Sopenharmony_ci * you may not use this file except in compliance with the License. 599552fe9Sopenharmony_ci * You may obtain a copy of the License at 699552fe9Sopenharmony_ci * 799552fe9Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 899552fe9Sopenharmony_ci * 999552fe9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1099552fe9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1199552fe9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1299552fe9Sopenharmony_ci * See the License for the specific language governing permissions and 1399552fe9Sopenharmony_ci * limitations under the License. 1499552fe9Sopenharmony_ci */ 1599552fe9Sopenharmony_ci 1699552fe9Sopenharmony_ci#include "running_lock_strategy.h" 1799552fe9Sopenharmony_ci#include <algorithm> 1899552fe9Sopenharmony_ci#include "standby_service_log.h" 1999552fe9Sopenharmony_ci#include "system_ability_definition.h" 2099552fe9Sopenharmony_ci 2199552fe9Sopenharmony_ci#include "ability_manager_helper.h" 2299552fe9Sopenharmony_ci#ifdef ENABLE_BACKGROUND_TASK_MGR 2399552fe9Sopenharmony_ci#include "background_task_helper.h" 2499552fe9Sopenharmony_ci#endif 2599552fe9Sopenharmony_ci#include "app_mgr_helper.h" 2699552fe9Sopenharmony_ci#include "standby_service.h" 2799552fe9Sopenharmony_ci#ifdef STANDBY_POWER_MANAGER_ENABLE 2899552fe9Sopenharmony_ci#include "power_mgr_client.h" 2999552fe9Sopenharmony_ci#endif 3099552fe9Sopenharmony_ci#ifdef STANDBY_RSS_WORK_SCHEDULER_ENABLE 3199552fe9Sopenharmony_ci#include "workscheduler_srv_client.h" 3299552fe9Sopenharmony_ci#endif 3399552fe9Sopenharmony_ci#include "allow_type.h" 3499552fe9Sopenharmony_ci#include "standby_state.h" 3599552fe9Sopenharmony_ci#include "bundle_manager_helper.h" 3699552fe9Sopenharmony_ci#include "standby_service_impl.h" 3799552fe9Sopenharmony_ci#include "common_constant.h" 3899552fe9Sopenharmony_ci 3999552fe9Sopenharmony_cinamespace OHOS { 4099552fe9Sopenharmony_cinamespace DevStandbyMgr { 4199552fe9Sopenharmony_cinamespace { 4299552fe9Sopenharmony_ciconst std::map<std::string, uint8_t> BGTASK_EXEMPTION_FLAG_MAP { 4399552fe9Sopenharmony_ci {CONTINUOUS_TASK, ExemptionTypeFlag::CONTINUOUS_TASK}, 4499552fe9Sopenharmony_ci {TRANSIENT_TASK, ExemptionTypeFlag::TRANSIENT_TASK}, 4599552fe9Sopenharmony_ci {WORK_SCHEDULER, ExemptionTypeFlag::WORK_SCHEDULER}, 4699552fe9Sopenharmony_ci}; 4799552fe9Sopenharmony_ci} 4899552fe9Sopenharmony_ci 4999552fe9Sopenharmony_civoid RunningLockStrategy::HandleEvent(const StandbyMessage& message) 5099552fe9Sopenharmony_ci{ 5199552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("RunningLockStrategy revceived message %{public}u, action: %{public}s", 5299552fe9Sopenharmony_ci message.eventId_, message.action_.c_str()); 5399552fe9Sopenharmony_ci switch (message.eventId_) { 5499552fe9Sopenharmony_ci case StandbyMessageType::ALLOW_LIST_CHANGED: 5599552fe9Sopenharmony_ci UpdateExemptionList(message); 5699552fe9Sopenharmony_ci break; 5799552fe9Sopenharmony_ci case StandbyMessageType::RES_CTRL_CONDITION_CHANGED: 5899552fe9Sopenharmony_ci UpdateResourceConfig(message); 5999552fe9Sopenharmony_ci break; 6099552fe9Sopenharmony_ci case StandbyMessageType::PHASE_TRANSIT: 6199552fe9Sopenharmony_ci StartProxy(message); 6299552fe9Sopenharmony_ci break; 6399552fe9Sopenharmony_ci case StandbyMessageType::STATE_TRANSIT: 6499552fe9Sopenharmony_ci StopProxy(message); 6599552fe9Sopenharmony_ci break; 6699552fe9Sopenharmony_ci case StandbyMessageType::BG_TASK_STATUS_CHANGE: 6799552fe9Sopenharmony_ci UpdateBgTaskAppStatus(message); 6899552fe9Sopenharmony_ci break; 6999552fe9Sopenharmony_ci case StandbyMessageType::PROCESS_STATE_CHANGED: 7099552fe9Sopenharmony_ci HandleProcessStatusChanged(message); 7199552fe9Sopenharmony_ci break; 7299552fe9Sopenharmony_ci case StandbyMessageType::SYS_ABILITY_STATUS_CHANGED: 7399552fe9Sopenharmony_ci ResetProxyStatus(message); 7499552fe9Sopenharmony_ci break; 7599552fe9Sopenharmony_ci default: 7699552fe9Sopenharmony_ci break; 7799552fe9Sopenharmony_ci } 7899552fe9Sopenharmony_ci} 7999552fe9Sopenharmony_ci 8099552fe9Sopenharmony_ciErrCode RunningLockStrategy::OnCreated() 8199552fe9Sopenharmony_ci{ 8299552fe9Sopenharmony_ci #ifdef STANDBY_POWER_MANAGER_ENABLE 8399552fe9Sopenharmony_ci PowerMgr::PowerMgrClient::GetInstance().ResetRunningLocks(); 8499552fe9Sopenharmony_ci #endif 8599552fe9Sopenharmony_ci return ERR_OK; 8699552fe9Sopenharmony_ci} 8799552fe9Sopenharmony_ci 8899552fe9Sopenharmony_ciErrCode RunningLockStrategy::OnDestroy() 8999552fe9Sopenharmony_ci{ 9099552fe9Sopenharmony_ci if (isProxied_ && !isIdleMaintence_) { 9199552fe9Sopenharmony_ci ProxyAppAndProcess(false); 9299552fe9Sopenharmony_ci } 9399552fe9Sopenharmony_ci isProxied_ = false; 9499552fe9Sopenharmony_ci isIdleMaintence_ = false; 9599552fe9Sopenharmony_ci return ERR_OK; 9699552fe9Sopenharmony_ci} 9799552fe9Sopenharmony_ci 9899552fe9Sopenharmony_ciErrCode RunningLockStrategy::UpdateExemptionList(const StandbyMessage& message) 9999552fe9Sopenharmony_ci{ 10099552fe9Sopenharmony_ci uint32_t allowType = static_cast<uint32_t>(message.want_->GetIntParam("allowType", 0)); 10199552fe9Sopenharmony_ci if ((allowType & AllowType::RUNNING_LOCK) == 0) { 10299552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("allowType is not running lock, currentType is %{public}d", allowType); 10399552fe9Sopenharmony_ci return ERR_STANDBY_STRATEGY_NOT_MATCH; 10499552fe9Sopenharmony_ci } 10599552fe9Sopenharmony_ci if (!isProxied_) { 10699552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("current state is not sleep or maintenance, ignore exemption"); 10799552fe9Sopenharmony_ci return ERR_STANDBY_CURRENT_STATE_NOT_MATCH; 10899552fe9Sopenharmony_ci } 10999552fe9Sopenharmony_ci 11099552fe9Sopenharmony_ci // according to message, add flag or remove flag 11199552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("RunningLockStrategy start update allow list"); 11299552fe9Sopenharmony_ci std::string processName = message.want_->GetStringParam("name"); 11399552fe9Sopenharmony_ci bool added = message.want_->GetBoolParam("added", false); 11499552fe9Sopenharmony_ci int32_t uid = message.want_->GetIntParam("uid", -1); 11599552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("%{public}s apply allow, added is %{public}d", processName.c_str(), added); 11699552fe9Sopenharmony_ci if (added) { 11799552fe9Sopenharmony_ci AddExemptionFlag(uid, processName, ExemptionTypeFlag::EXEMPTION); 11899552fe9Sopenharmony_ci } else { 11999552fe9Sopenharmony_ci RemoveExemptionFlag(uid, processName, ExemptionTypeFlag::EXEMPTION); 12099552fe9Sopenharmony_ci } 12199552fe9Sopenharmony_ci return ERR_OK; 12299552fe9Sopenharmony_ci} 12399552fe9Sopenharmony_ci 12499552fe9Sopenharmony_ciErrCode RunningLockStrategy::UpdateResourceConfig(const StandbyMessage& message) 12599552fe9Sopenharmony_ci{ 12699552fe9Sopenharmony_ci StopProxyInner(); 12799552fe9Sopenharmony_ci StartProxyInner(); 12899552fe9Sopenharmony_ci return ERR_OK; 12999552fe9Sopenharmony_ci} 13099552fe9Sopenharmony_ci 13199552fe9Sopenharmony_ciErrCode RunningLockStrategy::StartProxy(const StandbyMessage& message) 13299552fe9Sopenharmony_ci{ 13399552fe9Sopenharmony_ci if (isProxied_) { 13499552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("now is proxied, do not need StartProxy, repeat process"); 13599552fe9Sopenharmony_ci return ERR_STANDBY_STRATEGY_STATE_REPEAT; 13699552fe9Sopenharmony_ci } 13799552fe9Sopenharmony_ci uint32_t curPhase = static_cast<uint32_t>(message.want_->GetIntParam(CURRENT_PHASE, 0)); 13899552fe9Sopenharmony_ci uint32_t curState = static_cast<uint32_t>(message.want_->GetIntParam(CURRENT_STATE, 0)); 13999552fe9Sopenharmony_ci if ((curState != StandbyState::SLEEP) || (curPhase != SleepStatePhase::APP_RES_DEEP)) { 14099552fe9Sopenharmony_ci return ERR_STANDBY_CURRENT_STATE_NOT_MATCH; 14199552fe9Sopenharmony_ci } 14299552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("start proxy running lock, current state is %{public}d, current phase is %{public}d", 14399552fe9Sopenharmony_ci curPhase, curPhase); 14499552fe9Sopenharmony_ci // if enter sleep state and app_res_deep phase, start proxy running lock of applications. 14599552fe9Sopenharmony_ci if (auto ret = StartProxyInner(); ret != ERR_OK) { 14699552fe9Sopenharmony_ci return ret; 14799552fe9Sopenharmony_ci } 14899552fe9Sopenharmony_ci isProxied_ = true; 14999552fe9Sopenharmony_ci isIdleMaintence_ = false; 15099552fe9Sopenharmony_ci return ERR_OK; 15199552fe9Sopenharmony_ci} 15299552fe9Sopenharmony_ci 15399552fe9Sopenharmony_ciErrCode RunningLockStrategy::StartProxyInner() 15499552fe9Sopenharmony_ci{ 15599552fe9Sopenharmony_ci ClearProxyRecord(); 15699552fe9Sopenharmony_ci if (InitProxiedAppInfo() != ERR_OK || InitNativeProcInfo() != ERR_OK) { 15799552fe9Sopenharmony_ci STANDBYSERVICE_LOGW("calculate proxied app or native process failed"); 15899552fe9Sopenharmony_ci ClearProxyRecord(); 15999552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 16099552fe9Sopenharmony_ci } 16199552fe9Sopenharmony_ci ProxyAppAndProcess(true); 16299552fe9Sopenharmony_ci return ERR_OK; 16399552fe9Sopenharmony_ci} 16499552fe9Sopenharmony_ci 16599552fe9Sopenharmony_ciErrCode RunningLockStrategy::InitProxiedAppInfo() 16699552fe9Sopenharmony_ci{ 16799552fe9Sopenharmony_ci if (GetAllAppInfos() != ERR_OK || GetAllRunningAppInfo() != ERR_OK) { 16899552fe9Sopenharmony_ci STANDBYSERVICE_LOGW("failed to get all app info"); 16999552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 17099552fe9Sopenharmony_ci } 17199552fe9Sopenharmony_ci if (GetForegroundApplications() !=ERR_OK || GetBackgroundTaskApp() != ERR_OK || 17299552fe9Sopenharmony_ci GetWorkSchedulerTask() != ERR_OK || GetExemptionConfig() != ERR_OK) { 17399552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 17499552fe9Sopenharmony_ci } 17599552fe9Sopenharmony_ci uidBundleNmeMap_.clear(); 17699552fe9Sopenharmony_ci return ERR_OK; 17799552fe9Sopenharmony_ci} 17899552fe9Sopenharmony_ci 17999552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetAllAppInfos() 18099552fe9Sopenharmony_ci{ 18199552fe9Sopenharmony_ci // get all app and set UNRESTRICTED flag to system app. 18299552fe9Sopenharmony_ci std::vector<AppExecFwk::ApplicationInfo> applicationInfos {}; 18399552fe9Sopenharmony_ci if (!BundleManagerHelper::GetInstance()->GetApplicationInfos( 18499552fe9Sopenharmony_ci AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, 18599552fe9Sopenharmony_ci AppExecFwk::Constants::ALL_USERID, applicationInfos)) { 18699552fe9Sopenharmony_ci STANDBYSERVICE_LOGW("failed to get all applicationInfos"); 18799552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 18899552fe9Sopenharmony_ci } 18999552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("succeed GetApplicationInfos, size is %{public}d", 19099552fe9Sopenharmony_ci static_cast<int32_t>(applicationInfos.size())); 19199552fe9Sopenharmony_ci for (const auto& info : applicationInfos) { 19299552fe9Sopenharmony_ci uidBundleNmeMap_.emplace(info.uid, info.name); 19399552fe9Sopenharmony_ci std::string key = std::to_string(info.uid) + "_" + info.name; 19499552fe9Sopenharmony_ci proxiedAppInfo_.emplace(key, ProxiedProcInfo {info.name, info.uid}); 19599552fe9Sopenharmony_ci // system app have exemption 19699552fe9Sopenharmony_ci if (info.isSystemApp) { 19799552fe9Sopenharmony_ci proxiedAppInfo_[key].appExemptionFlag_ |= ExemptionTypeFlag::UNRESTRICTED; 19899552fe9Sopenharmony_ci } 19999552fe9Sopenharmony_ci } 20099552fe9Sopenharmony_ci return ERR_OK; 20199552fe9Sopenharmony_ci} 20299552fe9Sopenharmony_ci 20399552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetAllRunningAppInfo() 20499552fe9Sopenharmony_ci{ 20599552fe9Sopenharmony_ci std::vector<AppExecFwk::RunningProcessInfo> allAppProcessInfos {}; 20699552fe9Sopenharmony_ci if (!AppMgrHelper::GetInstance()->GetAllRunningProcesses(allAppProcessInfos)) { 20799552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("connect to app manager service failed"); 20899552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 20999552fe9Sopenharmony_ci } 21099552fe9Sopenharmony_ci // get all running proc of app, add them to proxiedAppInfo_. 21199552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("current running processes size %{public}d", static_cast<int32_t>(allAppProcessInfos.size())); 21299552fe9Sopenharmony_ci std::set<int> runningUids {}; 21399552fe9Sopenharmony_ci for (const auto& info : allAppProcessInfos) { 21499552fe9Sopenharmony_ci if (uidBundleNmeMap_.find(info.uid_) == uidBundleNmeMap_.end()) { 21599552fe9Sopenharmony_ci continue; 21699552fe9Sopenharmony_ci } 21799552fe9Sopenharmony_ci runningUids.emplace(info.uid_); 21899552fe9Sopenharmony_ci std::string key = std::to_string(info.uid_) + "_" + uidBundleNmeMap_[info.uid_]; 21999552fe9Sopenharmony_ci auto iter = proxiedAppInfo_.find(key); 22099552fe9Sopenharmony_ci if (iter == proxiedAppInfo_.end()) { 22199552fe9Sopenharmony_ci std::tie(iter, std::ignore) = proxiedAppInfo_.emplace(key, 22299552fe9Sopenharmony_ci ProxiedProcInfo {info.processName_, info.uid_}); 22399552fe9Sopenharmony_ci } 22499552fe9Sopenharmony_ci iter->second.pids_.emplace(info.pid_); 22599552fe9Sopenharmony_ci } 22699552fe9Sopenharmony_ci // if app is not running, delete its info from proxiedAppInfo_. 22799552fe9Sopenharmony_ci for (auto appInfoIter = proxiedAppInfo_.begin(); appInfoIter != proxiedAppInfo_.end();) { 22899552fe9Sopenharmony_ci if (runningUids.find(appInfoIter->second.uid_) == runningUids.end()) { 22999552fe9Sopenharmony_ci appInfoIter = proxiedAppInfo_.erase(appInfoIter); 23099552fe9Sopenharmony_ci } else { 23199552fe9Sopenharmony_ci ++appInfoIter; 23299552fe9Sopenharmony_ci } 23399552fe9Sopenharmony_ci } 23499552fe9Sopenharmony_ci return ERR_OK; 23599552fe9Sopenharmony_ci} 23699552fe9Sopenharmony_ci 23799552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetWorkSchedulerTask() 23899552fe9Sopenharmony_ci{ 23999552fe9Sopenharmony_ci #ifdef STANDBY_RSS_WORK_SCHEDULER_ENABLE 24099552fe9Sopenharmony_ci std::list<std::shared_ptr<WorkScheduler::WorkInfo>> workInfos; 24199552fe9Sopenharmony_ci if (WorkScheduler::WorkSchedulerSrvClient::GetInstance().GetAllRunningWorks(workInfos) != ERR_OK) { 24299552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 24399552fe9Sopenharmony_ci } 24499552fe9Sopenharmony_ci 24599552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("GetWorkSchedulerTask succeed, size is %{public}d", static_cast<int32_t>(workInfos.size())); 24699552fe9Sopenharmony_ci for (const auto& task : workInfos) { 24799552fe9Sopenharmony_ci std::string key = std::to_string(task->GetUid()) + "_" + task->GetBundleName(); 24899552fe9Sopenharmony_ci if (auto iter = proxiedAppInfo_.find(key); iter != proxiedAppInfo_.end()) { 24999552fe9Sopenharmony_ci iter->second.appExemptionFlag_ |= ExemptionTypeFlag::WORK_SCHEDULER; 25099552fe9Sopenharmony_ci } 25199552fe9Sopenharmony_ci } 25299552fe9Sopenharmony_ci #endif 25399552fe9Sopenharmony_ci return ERR_OK; 25499552fe9Sopenharmony_ci} 25599552fe9Sopenharmony_ci 25699552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetForegroundApplications() 25799552fe9Sopenharmony_ci{ 25899552fe9Sopenharmony_ci std::vector<AppExecFwk::AppStateData> fgApps {}; 25999552fe9Sopenharmony_ci if (!AppMgrHelper::GetInstance()->GetForegroundApplications(fgApps)) { 26099552fe9Sopenharmony_ci STANDBYSERVICE_LOGW("get foreground app failed"); 26199552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 26299552fe9Sopenharmony_ci } 26399552fe9Sopenharmony_ci // add foreground flag to app 26499552fe9Sopenharmony_ci for (const auto& appInfo : fgApps) { 26599552fe9Sopenharmony_ci std::string key = std::to_string(appInfo.uid) + "_" + appInfo.bundleName; 26699552fe9Sopenharmony_ci if (auto iter = proxiedAppInfo_.find(key); iter != proxiedAppInfo_.end()) { 26799552fe9Sopenharmony_ci iter->second.appExemptionFlag_ |= ExemptionTypeFlag::FOREGROUND_APP; 26899552fe9Sopenharmony_ci } 26999552fe9Sopenharmony_ci } 27099552fe9Sopenharmony_ci return ERR_OK; 27199552fe9Sopenharmony_ci} 27299552fe9Sopenharmony_ci 27399552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetBackgroundTaskApp() 27499552fe9Sopenharmony_ci{ 27599552fe9Sopenharmony_ci #ifdef ENABLE_BACKGROUND_TASK_MGR 27699552fe9Sopenharmony_ci std::vector<std::shared_ptr<ContinuousTaskCallbackInfo>> continuousTaskList; 27799552fe9Sopenharmony_ci if (!BackgroundTaskHelper::GetInstance()->GetContinuousTaskApps(continuousTaskList)) { 27899552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("get continuous task app failed"); 27999552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 28099552fe9Sopenharmony_ci } 28199552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("succeed GetContinuousTaskApps, size is %{public}d", 28299552fe9Sopenharmony_ci static_cast<int32_t>(continuousTaskList.size())); 28399552fe9Sopenharmony_ci std::vector<std::shared_ptr<TransientTaskAppInfo>> transientTaskList; 28499552fe9Sopenharmony_ci if (!BackgroundTaskHelper::GetInstance()->GetTransientTaskApps(transientTaskList)) { 28599552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("get transient task app failed"); 28699552fe9Sopenharmony_ci return ERR_STRATEGY_DEPENDS_SA_NOT_AVAILABLE; 28799552fe9Sopenharmony_ci } 28899552fe9Sopenharmony_ci // add continuous exemption flag for app with continuous task 28999552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("succeed GetTransientTaskApps, size is %{public}d", 29099552fe9Sopenharmony_ci static_cast<int32_t>(transientTaskList.size())); 29199552fe9Sopenharmony_ci for (const auto& task : continuousTaskList) { 29299552fe9Sopenharmony_ci auto iter = uidBundleNmeMap_.find(task->GetCreatorUid()); 29399552fe9Sopenharmony_ci if (iter == uidBundleNmeMap_.end()) { 29499552fe9Sopenharmony_ci continue; 29599552fe9Sopenharmony_ci } 29699552fe9Sopenharmony_ci std::string key = std::to_string(task->GetCreatorUid()) + "_" + iter->second; 29799552fe9Sopenharmony_ci if (auto infoIter = proxiedAppInfo_.find(key); infoIter == proxiedAppInfo_.end()) { 29899552fe9Sopenharmony_ci continue; 29999552fe9Sopenharmony_ci } else { 30099552fe9Sopenharmony_ci infoIter->second.appExemptionFlag_ |= ExemptionTypeFlag::CONTINUOUS_TASK; 30199552fe9Sopenharmony_ci } 30299552fe9Sopenharmony_ci } 30399552fe9Sopenharmony_ci // add transient exemption flag for app with transient task 30499552fe9Sopenharmony_ci for (const auto& task : transientTaskList) { 30599552fe9Sopenharmony_ci std::string key = std::to_string(task->GetUid()) + "_" + task->GetPackageName(); 30699552fe9Sopenharmony_ci if (auto iter = proxiedAppInfo_.find(key); iter == proxiedAppInfo_.end()) { 30799552fe9Sopenharmony_ci continue; 30899552fe9Sopenharmony_ci } else { 30999552fe9Sopenharmony_ci iter->second.appExemptionFlag_ |= ExemptionTypeFlag::TRANSIENT_TASK; 31099552fe9Sopenharmony_ci } 31199552fe9Sopenharmony_ci } 31299552fe9Sopenharmony_ci #endif 31399552fe9Sopenharmony_ci return ERR_OK; 31499552fe9Sopenharmony_ci} 31599552fe9Sopenharmony_ci 31699552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetExemptionConfig() 31799552fe9Sopenharmony_ci{ 31899552fe9Sopenharmony_ci // if app in exemption list, add its exemption flag 31999552fe9Sopenharmony_ci std::vector<AllowInfo> allowInfoList {}; 32099552fe9Sopenharmony_ci StandbyServiceImpl::GetInstance()->GetAllowListInner(AllowType::RUNNING_LOCK, allowInfoList, 32199552fe9Sopenharmony_ci ReasonCodeEnum::REASON_APP_API); 32299552fe9Sopenharmony_ci std::set<std::string> allowNameList {}; 32399552fe9Sopenharmony_ci for (const auto& info : allowInfoList) { 32499552fe9Sopenharmony_ci allowNameList.emplace(info.GetName()); 32599552fe9Sopenharmony_ci } 32699552fe9Sopenharmony_ci for (auto& [key, value] : proxiedAppInfo_) { 32799552fe9Sopenharmony_ci if (allowNameList.find(value.name_) == allowNameList.end()) { 32899552fe9Sopenharmony_ci continue; 32999552fe9Sopenharmony_ci } 33099552fe9Sopenharmony_ci value.appExemptionFlag_ |= ExemptionTypeFlag::EXEMPTION; 33199552fe9Sopenharmony_ci } 33299552fe9Sopenharmony_ci 33399552fe9Sopenharmony_ci // if app in restrict list, add retricted flag 33499552fe9Sopenharmony_ci std::set<std::string> restrictBundleName {}; 33599552fe9Sopenharmony_ci StandbyServiceImpl::GetInstance()->GetEligiableRestrictSet(AllowType::RUNNING_LOCK, "RUNNING_LOCK", 33699552fe9Sopenharmony_ci ReasonCodeEnum::REASON_APP_API, restrictBundleName); 33799552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("running lock restrict app list, size is %{public}d", 33899552fe9Sopenharmony_ci static_cast<int32_t>(restrictBundleName.size())); 33999552fe9Sopenharmony_ci for (auto& [key, value] : proxiedAppInfo_) { 34099552fe9Sopenharmony_ci if (restrictBundleName.find(value.name_) == restrictBundleName.end()) { 34199552fe9Sopenharmony_ci continue; 34299552fe9Sopenharmony_ci } 34399552fe9Sopenharmony_ci value.appExemptionFlag_ |= ExemptionTypeFlag::RESTRICTED; 34499552fe9Sopenharmony_ci } 34599552fe9Sopenharmony_ci return ERR_OK; 34699552fe9Sopenharmony_ci} 34799552fe9Sopenharmony_ci 34899552fe9Sopenharmony_ciErrCode RunningLockStrategy::InitNativeProcInfo() 34999552fe9Sopenharmony_ci{ 35099552fe9Sopenharmony_ci return ERR_OK; 35199552fe9Sopenharmony_ci} 35299552fe9Sopenharmony_ci 35399552fe9Sopenharmony_ciErrCode RunningLockStrategy::ProxyAppAndProcess(bool isProxied) 35499552fe9Sopenharmony_ci{ 35599552fe9Sopenharmony_ci std::vector<std::pair<int32_t, int32_t>> proxiedAppList; 35699552fe9Sopenharmony_ci for (const auto& [key, value] : proxiedAppInfo_) { 35799552fe9Sopenharmony_ci if (ExemptionTypeFlag::IsExempted(value.appExemptionFlag_)) { 35899552fe9Sopenharmony_ci continue; 35999552fe9Sopenharmony_ci } 36099552fe9Sopenharmony_ci SetProxiedAppList(proxiedAppList, value); 36199552fe9Sopenharmony_ci } 36299552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("proxied app size: %{public}d", static_cast<int32_t>(proxiedAppList.size())); 36399552fe9Sopenharmony_ci ProxyRunningLockList(isProxied, proxiedAppList); 36499552fe9Sopenharmony_ci return ERR_OK; 36599552fe9Sopenharmony_ci} 36699552fe9Sopenharmony_ci 36799552fe9Sopenharmony_ciErrCode RunningLockStrategy::StopProxy(const StandbyMessage& message) 36899552fe9Sopenharmony_ci{ 36999552fe9Sopenharmony_ci if (!isProxied_) { 37099552fe9Sopenharmony_ci return ERR_STANDBY_CURRENT_STATE_NOT_MATCH; 37199552fe9Sopenharmony_ci } 37299552fe9Sopenharmony_ci uint32_t preState = static_cast<uint32_t>(message.want_->GetIntParam(PREVIOUS_STATE, 0)); 37399552fe9Sopenharmony_ci uint32_t curState = static_cast<uint32_t>(message.want_->GetIntParam(CURRENT_STATE, 0)); 37499552fe9Sopenharmony_ci if ((curState == StandbyState::MAINTENANCE) && (preState == StandbyState::SLEEP)) { 37599552fe9Sopenharmony_ci // enter maintenance, stop proxy 37699552fe9Sopenharmony_ci ProxyAppAndProcess(false); 37799552fe9Sopenharmony_ci isIdleMaintence_ = true; 37899552fe9Sopenharmony_ci } else if ((curState == StandbyState::SLEEP) && (preState == StandbyState::MAINTENANCE)) { 37999552fe9Sopenharmony_ci isIdleMaintence_ = false; 38099552fe9Sopenharmony_ci // exit maintenance, enter sleep, start proxy 38199552fe9Sopenharmony_ci ProxyAppAndProcess(true); 38299552fe9Sopenharmony_ci } else if (preState == StandbyState::SLEEP || preState == StandbyState::MAINTENANCE) { 38399552fe9Sopenharmony_ci StopProxyInner(); 38499552fe9Sopenharmony_ci isProxied_ = false; 38599552fe9Sopenharmony_ci isIdleMaintence_ = false; 38699552fe9Sopenharmony_ci } 38799552fe9Sopenharmony_ci return ERR_OK; 38899552fe9Sopenharmony_ci} 38999552fe9Sopenharmony_ci 39099552fe9Sopenharmony_ciErrCode RunningLockStrategy::StopProxyInner() 39199552fe9Sopenharmony_ci{ 39299552fe9Sopenharmony_ci ProxyAppAndProcess(false); 39399552fe9Sopenharmony_ci ClearProxyRecord(); 39499552fe9Sopenharmony_ci return ERR_OK; 39599552fe9Sopenharmony_ci} 39699552fe9Sopenharmony_ci 39799552fe9Sopenharmony_ciErrCode RunningLockStrategy::UpdateBgTaskAppStatus(const StandbyMessage& message) 39899552fe9Sopenharmony_ci{ 39999552fe9Sopenharmony_ci std::string type = message.want_->GetStringParam(BG_TASK_TYPE); 40099552fe9Sopenharmony_ci bool started = message.want_->GetBoolParam(BG_TASK_STATUS, false); 40199552fe9Sopenharmony_ci int32_t uid = message.want_->GetIntParam(BG_TASK_UID, 0); 40299552fe9Sopenharmony_ci std::string bundleName = message.want_->GetStringParam(BG_TASK_BUNDLE_NAME); 40399552fe9Sopenharmony_ci 40499552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("received bgtask status changed, type: %{public}s, isstarted: %{public}d, uid: %{public}d", 40599552fe9Sopenharmony_ci type.c_str(), started, uid); 40699552fe9Sopenharmony_ci if (BGTASK_EXEMPTION_FLAG_MAP.find(type) == BGTASK_EXEMPTION_FLAG_MAP.end()) { 40799552fe9Sopenharmony_ci return ERR_STANDBY_KEY_INFO_NOT_MATCH; 40899552fe9Sopenharmony_ci } 40999552fe9Sopenharmony_ci 41099552fe9Sopenharmony_ci if (bundleName.empty()) { 41199552fe9Sopenharmony_ci bundleName = BundleManagerHelper::GetInstance()->GetClientBundleName(uid); 41299552fe9Sopenharmony_ci } 41399552fe9Sopenharmony_ci if (started) { 41499552fe9Sopenharmony_ci AddExemptionFlag(uid, bundleName, BGTASK_EXEMPTION_FLAG_MAP.at(type)); 41599552fe9Sopenharmony_ci } else { 41699552fe9Sopenharmony_ci RemoveExemptionFlag(uid, bundleName, BGTASK_EXEMPTION_FLAG_MAP.at(type)); 41799552fe9Sopenharmony_ci } 41899552fe9Sopenharmony_ci return ERR_OK; 41999552fe9Sopenharmony_ci} 42099552fe9Sopenharmony_ci 42199552fe9Sopenharmony_ci// when bgtask or work_scheduler service crash, reset proxy status 42299552fe9Sopenharmony_civoid RunningLockStrategy::ResetProxyStatus(const StandbyMessage& message) 42399552fe9Sopenharmony_ci{ 42499552fe9Sopenharmony_ci if (!isProxied_ || isIdleMaintence_) { 42599552fe9Sopenharmony_ci return; 42699552fe9Sopenharmony_ci } 42799552fe9Sopenharmony_ci bool isAdded = message.want_->GetBoolParam(SA_STATUS, false); 42899552fe9Sopenharmony_ci if (isAdded) { 42999552fe9Sopenharmony_ci return; 43099552fe9Sopenharmony_ci } 43199552fe9Sopenharmony_ci int32_t saId = message.want_->GetIntParam(SA_ID, 0); 43299552fe9Sopenharmony_ci if (saId != WORK_SCHEDULE_SERVICE_ID && saId != BACKGROUND_TASK_MANAGER_SERVICE_ID) { 43399552fe9Sopenharmony_ci return; 43499552fe9Sopenharmony_ci } 43599552fe9Sopenharmony_ci const uint8_t bgTaskFlag = (ExemptionTypeFlag::TRANSIENT_TASK | ExemptionTypeFlag::WORK_SCHEDULER); 43699552fe9Sopenharmony_ci for (const auto& [key, value] : proxiedAppInfo_) { 43799552fe9Sopenharmony_ci if ((value.appExemptionFlag_ & bgTaskFlag) == 0) { 43899552fe9Sopenharmony_ci continue; 43999552fe9Sopenharmony_ci } 44099552fe9Sopenharmony_ci RemoveExemptionFlag(value.uid_, value.name_, (value.appExemptionFlag_ & bgTaskFlag)); 44199552fe9Sopenharmony_ci } 44299552fe9Sopenharmony_ci return; 44399552fe9Sopenharmony_ci} 44499552fe9Sopenharmony_ci 44599552fe9Sopenharmony_civoid RunningLockStrategy::AddExemptionFlag(int32_t uid, const std::string& name, uint8_t flag) 44699552fe9Sopenharmony_ci{ 44799552fe9Sopenharmony_ci if (!isProxied_) { 44899552fe9Sopenharmony_ci return; 44999552fe9Sopenharmony_ci } 45099552fe9Sopenharmony_ci std::string mapKey = std::to_string(uid) + "_" + name; 45199552fe9Sopenharmony_ci // if last appExemptionFlag is not exempted, current appExemptionFlag is exempted, unproxy running lock 45299552fe9Sopenharmony_ci if (auto iter = proxiedAppInfo_.find(mapKey); iter != proxiedAppInfo_.end()) { 45399552fe9Sopenharmony_ci auto lastAppExemptionFlag = iter->second.appExemptionFlag_; 45499552fe9Sopenharmony_ci iter->second.appExemptionFlag_ |= flag; 45599552fe9Sopenharmony_ci if (!ExemptionTypeFlag::IsExempted(lastAppExemptionFlag) && 45699552fe9Sopenharmony_ci ExemptionTypeFlag::IsExempted(iter->second.appExemptionFlag_)) { 45799552fe9Sopenharmony_ci std::vector<std::pair<int32_t, int32_t>> proxiedAppList; 45899552fe9Sopenharmony_ci SetProxiedAppList(proxiedAppList, iter->second); 45999552fe9Sopenharmony_ci ProxyRunningLockList(false, proxiedAppList); 46099552fe9Sopenharmony_ci } 46199552fe9Sopenharmony_ci } 46299552fe9Sopenharmony_ci} 46399552fe9Sopenharmony_ci 46499552fe9Sopenharmony_civoid RunningLockStrategy::RemoveExemptionFlag(int32_t uid, const std::string& name, uint8_t flag) 46599552fe9Sopenharmony_ci{ 46699552fe9Sopenharmony_ci std::string mapKey = std::to_string(uid) + "_" + name; 46799552fe9Sopenharmony_ci auto iter = proxiedAppInfo_.find(mapKey); 46899552fe9Sopenharmony_ci if (iter == proxiedAppInfo_.end()) { 46999552fe9Sopenharmony_ci return; 47099552fe9Sopenharmony_ci } 47199552fe9Sopenharmony_ci 47299552fe9Sopenharmony_ci // if last appExemptionFlag is exempted, current appExemptionFlag is unexempted, proxy running lock 47399552fe9Sopenharmony_ci auto lastAppExemptionFlag = iter->second.appExemptionFlag_; 47499552fe9Sopenharmony_ci iter->second.appExemptionFlag_ &= (~flag); 47599552fe9Sopenharmony_ci if (ExemptionTypeFlag::IsExempted(iter->second.appExemptionFlag_) || 47699552fe9Sopenharmony_ci !ExemptionTypeFlag::IsExempted(lastAppExemptionFlag)) { 47799552fe9Sopenharmony_ci return; 47899552fe9Sopenharmony_ci } 47999552fe9Sopenharmony_ci 48099552fe9Sopenharmony_ci std::vector<std::pair<int32_t, int32_t>> proxiedAppList; 48199552fe9Sopenharmony_ci SetProxiedAppList(proxiedAppList, iter->second); 48299552fe9Sopenharmony_ci ProxyRunningLockList(true, proxiedAppList); 48399552fe9Sopenharmony_ci} 48499552fe9Sopenharmony_ci 48599552fe9Sopenharmony_civoid RunningLockStrategy::ClearProxyRecord() 48699552fe9Sopenharmony_ci{ 48799552fe9Sopenharmony_ci proxiedAppInfo_.clear(); 48899552fe9Sopenharmony_ci uidBundleNmeMap_.clear(); 48999552fe9Sopenharmony_ci} 49099552fe9Sopenharmony_ci 49199552fe9Sopenharmony_ci// when app is created, add app info to cache 49299552fe9Sopenharmony_civoid RunningLockStrategy::GetAndCreateAppInfo(uint32_t uid, uint32_t pid, const std::string& bundleName) 49399552fe9Sopenharmony_ci{ 49499552fe9Sopenharmony_ci const std::string mapKey = std::to_string(uid) + "_" + bundleName; 49599552fe9Sopenharmony_ci auto iter = proxiedAppInfo_.find(mapKey); 49699552fe9Sopenharmony_ci if (iter != proxiedAppInfo_.end()) { 49799552fe9Sopenharmony_ci iter->second.pids_.emplace(pid); 49899552fe9Sopenharmony_ci return; 49999552fe9Sopenharmony_ci } 50099552fe9Sopenharmony_ci 50199552fe9Sopenharmony_ci std::tie(iter, std::ignore) = proxiedAppInfo_.emplace(mapKey, ProxiedProcInfo {bundleName, uid}); 50299552fe9Sopenharmony_ci iter->second.pids_.emplace(pid); 50399552fe9Sopenharmony_ci 50499552fe9Sopenharmony_ci bool isSystemApp {false}; 50599552fe9Sopenharmony_ci if (BundleManagerHelper::GetInstance()->CheckIsSystemAppByUid(uid, isSystemApp) && isSystemApp) { 50699552fe9Sopenharmony_ci iter->second.appExemptionFlag_ |= ExemptionTypeFlag::UNRESTRICTED; 50799552fe9Sopenharmony_ci } 50899552fe9Sopenharmony_ci GetExemptionConfigForApp(iter->second, bundleName); 50999552fe9Sopenharmony_ci} 51099552fe9Sopenharmony_ci 51199552fe9Sopenharmony_ciErrCode RunningLockStrategy::GetExemptionConfigForApp(ProxiedProcInfo& appInfo, const std::string& bundleName) 51299552fe9Sopenharmony_ci{ 51399552fe9Sopenharmony_ci // if app in exemption list, add exemption flag 51499552fe9Sopenharmony_ci std::vector<AllowInfo> allowInfoList {}; 51599552fe9Sopenharmony_ci StandbyServiceImpl::GetInstance()->GetAllowListInner(AllowType::NETWORK, allowInfoList, 51699552fe9Sopenharmony_ci ReasonCodeEnum::REASON_APP_API); 51799552fe9Sopenharmony_ci std::set<std::string> allowNameList {}; 51899552fe9Sopenharmony_ci for (const auto& info : allowInfoList) { 51999552fe9Sopenharmony_ci if (info.GetName() != bundleName) { 52099552fe9Sopenharmony_ci continue; 52199552fe9Sopenharmony_ci } 52299552fe9Sopenharmony_ci appInfo.appExemptionFlag_ |= ExemptionTypeFlag::EXEMPTION; 52399552fe9Sopenharmony_ci } 52499552fe9Sopenharmony_ci 52599552fe9Sopenharmony_ci // if app in restricted list, add retricted flag 52699552fe9Sopenharmony_ci std::set<std::string> restrictNameList {}; 52799552fe9Sopenharmony_ci StandbyServiceImpl::GetInstance()->GetEligiableRestrictSet(AllowType::NETWORK, "NETWORK", 52899552fe9Sopenharmony_ci ReasonCodeEnum::REASON_APP_API, restrictNameList); 52999552fe9Sopenharmony_ci if (restrictNameList.find(bundleName) != restrictNameList.end()) { 53099552fe9Sopenharmony_ci appInfo.appExemptionFlag_ |= ExemptionTypeFlag::RESTRICTED; 53199552fe9Sopenharmony_ci } 53299552fe9Sopenharmony_ci return ERR_OK; 53399552fe9Sopenharmony_ci} 53499552fe9Sopenharmony_ci 53599552fe9Sopenharmony_civoid RunningLockStrategy::SetProxiedAppList(std::vector<std::pair<int32_t, int32_t>>& proxiedAppList, 53699552fe9Sopenharmony_ci const ProxiedProcInfo& info) 53799552fe9Sopenharmony_ci{ 53899552fe9Sopenharmony_ci for (auto& pid : info.pids_) { 53999552fe9Sopenharmony_ci proxiedAppList.emplace_back(std::make_pair(pid, info.uid_)); 54099552fe9Sopenharmony_ci } 54199552fe9Sopenharmony_ci} 54299552fe9Sopenharmony_ci 54399552fe9Sopenharmony_civoid RunningLockStrategy::ProxyRunningLockList(bool isProxied, 54499552fe9Sopenharmony_ci const std::vector<std::pair<int32_t, int32_t>>& proxiedAppList) 54599552fe9Sopenharmony_ci{ 54699552fe9Sopenharmony_ci if (proxiedAppList.empty()) { 54799552fe9Sopenharmony_ci return; 54899552fe9Sopenharmony_ci } 54999552fe9Sopenharmony_ci // in maintenance state, disallow proxy running lock 55099552fe9Sopenharmony_ci if (isIdleMaintence_) { 55199552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("current is idle maintenance, can not proxy running lock"); 55299552fe9Sopenharmony_ci return; 55399552fe9Sopenharmony_ci } 55499552fe9Sopenharmony_ci #ifdef STANDBY_POWER_MANAGER_ENABLE 55599552fe9Sopenharmony_ci if (!PowerMgr::PowerMgrClient::GetInstance().ProxyRunningLocks(isProxied, proxiedAppList)) { 55699552fe9Sopenharmony_ci STANDBYSERVICE_LOGW("failed to ProxyRunningLockList"); 55799552fe9Sopenharmony_ci } 55899552fe9Sopenharmony_ci #endif 55999552fe9Sopenharmony_ci} 56099552fe9Sopenharmony_ci 56199552fe9Sopenharmony_civoid RunningLockStrategy::HandleProcessStatusChanged(const StandbyMessage& message) 56299552fe9Sopenharmony_ci{ 56399552fe9Sopenharmony_ci if (!isProxied_) { 56499552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("RunningLockStrategy is not in proxy, do not need process"); 56599552fe9Sopenharmony_ci return; 56699552fe9Sopenharmony_ci } 56799552fe9Sopenharmony_ci int32_t uid = message.want_->GetIntParam("uid", -1); 56899552fe9Sopenharmony_ci int32_t pid = message.want_->GetIntParam("pid", -1); 56999552fe9Sopenharmony_ci std::string bundleName = message.want_->GetStringParam("name"); 57099552fe9Sopenharmony_ci bool isCreated = message.want_->GetBoolParam("isCreated", false); 57199552fe9Sopenharmony_ci 57299552fe9Sopenharmony_ci auto key = std::to_string(uid) + "_" + bundleName; 57399552fe9Sopenharmony_ci if (isCreated) { 57499552fe9Sopenharmony_ci // if process is created 57599552fe9Sopenharmony_ci GetAndCreateAppInfo(uid, pid, bundleName); 57699552fe9Sopenharmony_ci if (!ExemptionTypeFlag::IsExempted(proxiedAppInfo_[key].appExemptionFlag_)) { 57799552fe9Sopenharmony_ci ProxyRunningLockList(true, {std::make_pair(pid, uid)}); 57899552fe9Sopenharmony_ci } 57999552fe9Sopenharmony_ci } else { 58099552fe9Sopenharmony_ci auto iter = proxiedAppInfo_.find(key); 58199552fe9Sopenharmony_ci if (iter == proxiedAppInfo_.end()) { 58299552fe9Sopenharmony_ci return; 58399552fe9Sopenharmony_ci } 58499552fe9Sopenharmony_ci if (!ExemptionTypeFlag::IsExempted(proxiedAppInfo_[key].appExemptionFlag_)) { 58599552fe9Sopenharmony_ci ProxyRunningLockList(false, {std::make_pair(pid, uid)}); 58699552fe9Sopenharmony_ci } 58799552fe9Sopenharmony_ci iter->second.pids_.erase(pid); 58899552fe9Sopenharmony_ci if (iter->second.pids_.empty()) { 58999552fe9Sopenharmony_ci proxiedAppInfo_.erase(iter); 59099552fe9Sopenharmony_ci } 59199552fe9Sopenharmony_ci } 59299552fe9Sopenharmony_ci} 59399552fe9Sopenharmony_ci 59499552fe9Sopenharmony_civoid RunningLockStrategy::ShellDump(const std::vector<std::string>& argsInStr, std::string& result) 59599552fe9Sopenharmony_ci{ 59699552fe9Sopenharmony_ci if (argsInStr[DUMP_FIRST_PARAM] == DUMP_DETAIL_INFO && 59799552fe9Sopenharmony_ci argsInStr[DUMP_SECOND_PARAM] == DUMP_STRATGY_DETAIL) { 59899552fe9Sopenharmony_ci DumpShowDetailInfo(argsInStr, result); 59999552fe9Sopenharmony_ci } 60099552fe9Sopenharmony_ci} 60199552fe9Sopenharmony_ci 60299552fe9Sopenharmony_ci// dump detail info of running lock strategy 60399552fe9Sopenharmony_civoid RunningLockStrategy::DumpShowDetailInfo(const std::vector<std::string>& argsInStr, std::string& result) 60499552fe9Sopenharmony_ci{ 60599552fe9Sopenharmony_ci result.append("=================RunningLock======================\n"); 60699552fe9Sopenharmony_ci result.append("Running Lock Strategy:\n").append("isProxied: " + std::to_string(isProxied_)) 60799552fe9Sopenharmony_ci .append(" isIdleMaintence: " + std::to_string(isIdleMaintence_)).append("\n"); 60899552fe9Sopenharmony_ci result.append("proxied app info: \n"); 60999552fe9Sopenharmony_ci for (const auto& [key, value] : proxiedAppInfo_) { 61099552fe9Sopenharmony_ci result.append("key: ").append(key).append(" name: ").append(value.name_).append(" uid: ") 61199552fe9Sopenharmony_ci .append(std::to_string(value.uid_)).append(" pid_size: ") 61299552fe9Sopenharmony_ci .append(std::to_string(value.pids_.size())).append(" exemption flag: ") 61399552fe9Sopenharmony_ci .append(std::to_string(value.appExemptionFlag_)).append("\n"); 61499552fe9Sopenharmony_ci if (value.pids_.empty()) { 61599552fe9Sopenharmony_ci continue; 61699552fe9Sopenharmony_ci } 61799552fe9Sopenharmony_ci result.append("pids list: "); 61899552fe9Sopenharmony_ci for (const auto pid : value.pids_) { 61999552fe9Sopenharmony_ci result.append(" ").append(std::to_string(pid)); 62099552fe9Sopenharmony_ci } 62199552fe9Sopenharmony_ci result.append("\n"); 62299552fe9Sopenharmony_ci } 62399552fe9Sopenharmony_ci} 62499552fe9Sopenharmony_ci} // namespace DevStandbyMgr 62599552fe9Sopenharmony_ci} // namespace OHOS