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