1ba5c3796Sopenharmony_ci/* 2ba5c3796Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3ba5c3796Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ba5c3796Sopenharmony_ci * you may not use this file except in compliance with the License. 5ba5c3796Sopenharmony_ci * You may obtain a copy of the License at 6ba5c3796Sopenharmony_ci * 7ba5c3796Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ba5c3796Sopenharmony_ci * 9ba5c3796Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ba5c3796Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ba5c3796Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ba5c3796Sopenharmony_ci * See the License for the specific language governing permissions and 13ba5c3796Sopenharmony_ci * limitations under the License. 14ba5c3796Sopenharmony_ci */ 15ba5c3796Sopenharmony_ci 16ba5c3796Sopenharmony_ci#include "mem_mgr_service.h" 17ba5c3796Sopenharmony_ci 18ba5c3796Sopenharmony_ci#include <parameters.h> 19ba5c3796Sopenharmony_ci#include <unistd.h> 20ba5c3796Sopenharmony_ci 21ba5c3796Sopenharmony_ci#include "accesstoken_kit.h" 22ba5c3796Sopenharmony_ci#include "ipc_skeleton.h" 23ba5c3796Sopenharmony_ci#include "low_memory_killer.h" 24ba5c3796Sopenharmony_ci#include "mem_mgr_event_center.h" 25ba5c3796Sopenharmony_ci#include "memmgr_config_manager.h" 26ba5c3796Sopenharmony_ci#include "memmgr_log.h" 27ba5c3796Sopenharmony_ci#include "multi_account_manager.h" 28ba5c3796Sopenharmony_ci#include "nandlife_controller.h" 29ba5c3796Sopenharmony_ci#include "reclaim_priority_manager.h" 30ba5c3796Sopenharmony_ci#include "reclaim_strategy_manager.h" 31ba5c3796Sopenharmony_ci#include "system_ability_definition.h" 32ba5c3796Sopenharmony_ci#include "window_visibility_observer.h" 33ba5c3796Sopenharmony_ci#ifdef USE_PURGEABLE_MEMORY 34ba5c3796Sopenharmony_ci#include "kernel_interface.h" 35ba5c3796Sopenharmony_ci#include "purgeable_mem_manager.h" 36ba5c3796Sopenharmony_ci#endif 37ba5c3796Sopenharmony_ci#include "dump_command_dispatcher.h" 38ba5c3796Sopenharmony_ci 39ba5c3796Sopenharmony_cinamespace OHOS { 40ba5c3796Sopenharmony_cinamespace Memory { 41ba5c3796Sopenharmony_cinamespace { 42ba5c3796Sopenharmony_ciconst std::string TAG = "MemMgrService"; 43ba5c3796Sopenharmony_ciconst int32_t ENG_MODE = OHOS::system::GetIntParameter("const.debuggable", 0); 44ba5c3796Sopenharmony_ciconst int32_t ERR_MEMMGR_PERMISSION_DENIED = -1; 45ba5c3796Sopenharmony_ci} 46ba5c3796Sopenharmony_ci 47ba5c3796Sopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(MemMgrService); 48ba5c3796Sopenharmony_ciconst bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(&MemMgrService::GetInstance()); 49ba5c3796Sopenharmony_ci 50ba5c3796Sopenharmony_ciMemMgrService::MemMgrService() : SystemAbility(MEMORY_MANAGER_SA_ID, true) 51ba5c3796Sopenharmony_ci{ 52ba5c3796Sopenharmony_ci} 53ba5c3796Sopenharmony_ci 54ba5c3796Sopenharmony_cibool MemMgrService::Init() 55ba5c3796Sopenharmony_ci{ 56ba5c3796Sopenharmony_ci MemmgrConfigManager::GetInstance().Init(); 57ba5c3796Sopenharmony_ci 58ba5c3796Sopenharmony_ci // init reclaim priority manager 59ba5c3796Sopenharmony_ci if (!ReclaimPriorityManager::GetInstance().Init()) { 60ba5c3796Sopenharmony_ci HILOGE("ReclaimPriorityManager init failed"); 61ba5c3796Sopenharmony_ci return false; 62ba5c3796Sopenharmony_ci } 63ba5c3796Sopenharmony_ci 64ba5c3796Sopenharmony_ci // init multiple account manager 65ba5c3796Sopenharmony_ci MultiAccountManager::GetInstance().Init(); 66ba5c3796Sopenharmony_ci 67ba5c3796Sopenharmony_ci#ifdef USE_HYPERHOLD_MEMORY 68ba5c3796Sopenharmony_ci // init reclaim strategy manager 69ba5c3796Sopenharmony_ci if (!ReclaimStrategyManager::GetInstance().Init()) { 70ba5c3796Sopenharmony_ci HILOGE("ReclaimStrategyManager init failed"); 71ba5c3796Sopenharmony_ci return false; 72ba5c3796Sopenharmony_ci } 73ba5c3796Sopenharmony_ci#endif 74ba5c3796Sopenharmony_ci 75ba5c3796Sopenharmony_ci // init event center, then managers above can work by event trigger 76ba5c3796Sopenharmony_ci if (!MemMgrEventCenter::GetInstance().Init()) { 77ba5c3796Sopenharmony_ci HILOGE("MemMgrEventCenter init failed"); 78ba5c3796Sopenharmony_ci return false; 79ba5c3796Sopenharmony_ci } 80ba5c3796Sopenharmony_ci 81ba5c3796Sopenharmony_ci#ifdef USE_HYPERHOLD_MEMORY 82ba5c3796Sopenharmony_ci // init nandlife controller 83ba5c3796Sopenharmony_ci NandLifeController::GetInstance().Init(); 84ba5c3796Sopenharmony_ci#endif 85ba5c3796Sopenharmony_ci 86ba5c3796Sopenharmony_ci HILOGI("init successed"); 87ba5c3796Sopenharmony_ci return true; 88ba5c3796Sopenharmony_ci} 89ba5c3796Sopenharmony_ci 90ba5c3796Sopenharmony_civoid MemMgrService::OnStart() 91ba5c3796Sopenharmony_ci{ 92ba5c3796Sopenharmony_ci HILOGI("called"); 93ba5c3796Sopenharmony_ci if (!Init()) { 94ba5c3796Sopenharmony_ci HILOGE("init failed"); 95ba5c3796Sopenharmony_ci return; 96ba5c3796Sopenharmony_ci } 97ba5c3796Sopenharmony_ci if (!Publish(this)) { 98ba5c3796Sopenharmony_ci HILOGE("publish SA failed"); 99ba5c3796Sopenharmony_ci return; 100ba5c3796Sopenharmony_ci } 101ba5c3796Sopenharmony_ci HILOGI("publish SA successed"); 102ba5c3796Sopenharmony_ci 103ba5c3796Sopenharmony_ci AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID); 104ba5c3796Sopenharmony_ci AddSystemAbilityListener(COMMON_EVENT_SERVICE_ABILITY_ID); 105ba5c3796Sopenharmony_ci AddSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID); 106ba5c3796Sopenharmony_ci AddSystemAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN); 107ba5c3796Sopenharmony_ci AddSystemAbilityListener(SUBSYS_APPLICATIONS_SYS_ABILITY_ID_BEGIN); 108ba5c3796Sopenharmony_ci AddSystemAbilityListener(APP_MGR_SERVICE_ID); 109ba5c3796Sopenharmony_ci AddSystemAbilityListener(ABILITY_MGR_SERVICE_ID); 110ba5c3796Sopenharmony_ci} 111ba5c3796Sopenharmony_ci 112ba5c3796Sopenharmony_civoid MemMgrService::OnStop() 113ba5c3796Sopenharmony_ci{ 114ba5c3796Sopenharmony_ci HILOGI("called"); 115ba5c3796Sopenharmony_ci} 116ba5c3796Sopenharmony_ci 117ba5c3796Sopenharmony_ci// implements of innerkits list below 118ba5c3796Sopenharmony_ci 119ba5c3796Sopenharmony_ciint32_t MemMgrService::GetBundlePriorityList(BundlePriorityList &bundlePrioList) 120ba5c3796Sopenharmony_ci{ 121ba5c3796Sopenharmony_ci HILOGI("called"); 122ba5c3796Sopenharmony_ci ReclaimPriorityManager::BunldeCopySet bundleSet; 123ba5c3796Sopenharmony_ci ReclaimPriorityManager::GetInstance().GetBundlePrioSet(bundleSet); 124ba5c3796Sopenharmony_ci for (auto bundlePriorityInfo : bundleSet) { 125ba5c3796Sopenharmony_ci Memory::BundlePriority bi = Memory::BundlePriority(bundlePriorityInfo.uid_, 126ba5c3796Sopenharmony_ci bundlePriorityInfo.name_, bundlePriorityInfo.priority_, bundlePriorityInfo.accountId_); 127ba5c3796Sopenharmony_ci bundlePrioList.AddBundleInfo(bi); 128ba5c3796Sopenharmony_ci } 129ba5c3796Sopenharmony_ci bundlePrioList.SetCount(bundlePrioList.Size()); 130ba5c3796Sopenharmony_ci return 0; 131ba5c3796Sopenharmony_ci} 132ba5c3796Sopenharmony_ci 133ba5c3796Sopenharmony_ciint32_t MemMgrService::NotifyDistDevStatus(int32_t pid, int32_t uid, const std::string &name, bool connected) 134ba5c3796Sopenharmony_ci{ 135ba5c3796Sopenharmony_ci HILOGI("called, pid=%{public}d, uid=%{public}d, name=%{public}s, connected=%{public}d", pid, uid, name.c_str(), 136ba5c3796Sopenharmony_ci connected); 137ba5c3796Sopenharmony_ci ReclaimHandleRequest request; 138ba5c3796Sopenharmony_ci request.pid = pid; 139ba5c3796Sopenharmony_ci request.uid = uid; 140ba5c3796Sopenharmony_ci request.bundleName = name; 141ba5c3796Sopenharmony_ci request.reason = 142ba5c3796Sopenharmony_ci connected ? AppStateUpdateReason::DIST_DEVICE_CONNECTED : AppStateUpdateReason::DIST_DEVICE_DISCONNECTED; 143ba5c3796Sopenharmony_ci ReclaimPriorityManager::GetInstance().UpdateReclaimPriority( 144ba5c3796Sopenharmony_ci SingleRequest({pid, uid, "", name}, 145ba5c3796Sopenharmony_ci connected ? AppStateUpdateReason::DIST_DEVICE_CONNECTED : AppStateUpdateReason::DIST_DEVICE_DISCONNECTED)); 146ba5c3796Sopenharmony_ci return 0; 147ba5c3796Sopenharmony_ci} 148ba5c3796Sopenharmony_ci 149ba5c3796Sopenharmony_ciint32_t MemMgrService::GetKillLevelOfLmkd(int32_t &killLevel) 150ba5c3796Sopenharmony_ci{ 151ba5c3796Sopenharmony_ci HILOGI("called"); 152ba5c3796Sopenharmony_ci killLevel = LowMemoryKiller::GetInstance().GetKillLevel(); 153ba5c3796Sopenharmony_ci return 0; 154ba5c3796Sopenharmony_ci} 155ba5c3796Sopenharmony_ci 156ba5c3796Sopenharmony_ci#ifdef USE_PURGEABLE_MEMORY 157ba5c3796Sopenharmony_ciint32_t MemMgrService::RegisterActiveApps(int32_t pid, int32_t uid) 158ba5c3796Sopenharmony_ci{ 159ba5c3796Sopenharmony_ci HILOGI("called, pid=%{public}d, uid=%{public}d", pid, uid); 160ba5c3796Sopenharmony_ci PurgeableMemManager::GetInstance().RegisterActiveApps(pid, uid); 161ba5c3796Sopenharmony_ci return 0; 162ba5c3796Sopenharmony_ci} 163ba5c3796Sopenharmony_ci 164ba5c3796Sopenharmony_ciint32_t MemMgrService::DeregisterActiveApps(int32_t pid, int32_t uid) 165ba5c3796Sopenharmony_ci{ 166ba5c3796Sopenharmony_ci HILOGI("called, pid=%{public}d, uid=%{public}d", pid, uid); 167ba5c3796Sopenharmony_ci PurgeableMemManager::GetInstance().DeregisterActiveApps(pid, uid); 168ba5c3796Sopenharmony_ci return 0; 169ba5c3796Sopenharmony_ci} 170ba5c3796Sopenharmony_ci 171ba5c3796Sopenharmony_ciint32_t MemMgrService::SubscribeAppState(const sptr<IAppStateSubscriber> &subscriber) 172ba5c3796Sopenharmony_ci{ 173ba5c3796Sopenharmony_ci HILOGI("called"); 174ba5c3796Sopenharmony_ci PurgeableMemManager::GetInstance().AddSubscriber(subscriber); 175ba5c3796Sopenharmony_ci return 0; 176ba5c3796Sopenharmony_ci} 177ba5c3796Sopenharmony_ci 178ba5c3796Sopenharmony_ciint32_t MemMgrService::UnsubscribeAppState(const sptr<IAppStateSubscriber> &subscriber) 179ba5c3796Sopenharmony_ci{ 180ba5c3796Sopenharmony_ci HILOGI("called"); 181ba5c3796Sopenharmony_ci PurgeableMemManager::GetInstance().RemoveSubscriber(subscriber); 182ba5c3796Sopenharmony_ci return 0; 183ba5c3796Sopenharmony_ci} 184ba5c3796Sopenharmony_ci 185ba5c3796Sopenharmony_ciint32_t MemMgrService::GetAvailableMemory(int32_t &memSize) 186ba5c3796Sopenharmony_ci{ 187ba5c3796Sopenharmony_ci HILOGI("called"); 188ba5c3796Sopenharmony_ci memSize = KernelInterface::GetInstance().GetCurrentBuffer(); 189ba5c3796Sopenharmony_ci if (memSize < 0 || memSize >= MAX_BUFFER_KB) { 190ba5c3796Sopenharmony_ci return -1; 191ba5c3796Sopenharmony_ci } 192ba5c3796Sopenharmony_ci return 0; 193ba5c3796Sopenharmony_ci} 194ba5c3796Sopenharmony_ci 195ba5c3796Sopenharmony_ciint32_t MemMgrService::GetTotalMemory(int32_t &memSize) 196ba5c3796Sopenharmony_ci{ 197ba5c3796Sopenharmony_ci HILOGI("called"); 198ba5c3796Sopenharmony_ci memSize = KernelInterface::GetInstance().GetTotalBuffer(); 199ba5c3796Sopenharmony_ci if (memSize < 0 || memSize >= MAX_BUFFER_KB) { 200ba5c3796Sopenharmony_ci return -1; 201ba5c3796Sopenharmony_ci } 202ba5c3796Sopenharmony_ci return 0; 203ba5c3796Sopenharmony_ci} 204ba5c3796Sopenharmony_ci#endif // USE_PURGEABLE_MEMORY 205ba5c3796Sopenharmony_ci 206ba5c3796Sopenharmony_civoid MemMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) 207ba5c3796Sopenharmony_ci{ 208ba5c3796Sopenharmony_ci HILOGI("systemAbilityId: %{public}d add", systemAbilityId); 209ba5c3796Sopenharmony_ci MemMgrEventCenter::GetInstance().RetryRegisterEventObserver(systemAbilityId); 210ba5c3796Sopenharmony_ci} 211ba5c3796Sopenharmony_ci 212ba5c3796Sopenharmony_ciint32_t MemMgrService::OnWindowVisibilityChanged(const std::vector<sptr<MemMgrWindowInfo>> &MemMgrWindowInfo) 213ba5c3796Sopenharmony_ci{ 214ba5c3796Sopenharmony_ci HILOGI("called"); 215ba5c3796Sopenharmony_ci int32_t callingUid = IPCSkeleton::GetCallingUid(); 216ba5c3796Sopenharmony_ci if (callingUid != windowManagerUid_) { 217ba5c3796Sopenharmony_ci HILOGE("OnWindowVisibilityChanged refused for%{public}d", callingUid); 218ba5c3796Sopenharmony_ci return -1; 219ba5c3796Sopenharmony_ci } 220ba5c3796Sopenharmony_ci HILOGI("OnWindowVisibilityChanged called %{public}d", callingUid); 221ba5c3796Sopenharmony_ci WindowVisibilityObserver::GetInstance().UpdateWindowVisibilityPriority(MemMgrWindowInfo); 222ba5c3796Sopenharmony_ci return 0; 223ba5c3796Sopenharmony_ci} 224ba5c3796Sopenharmony_ci 225ba5c3796Sopenharmony_ciint32_t MemMgrService::GetReclaimPriorityByPid(int32_t pid, int32_t &priority) 226ba5c3796Sopenharmony_ci{ 227ba5c3796Sopenharmony_ci HILOGI("called"); 228ba5c3796Sopenharmony_ci std::string path = KernelInterface::GetInstance().JoinPath("/proc/", std::to_string(pid), "/oom_score_adj"); 229ba5c3796Sopenharmony_ci std::string contentStr; 230ba5c3796Sopenharmony_ci if (KernelInterface::GetInstance().ReadFromFile(path, contentStr) || contentStr.size() == 0) { 231ba5c3796Sopenharmony_ci HILOGE("read %{public}s failed, content=[%{public}s]", path.c_str(), contentStr.c_str()); 232ba5c3796Sopenharmony_ci return -1; 233ba5c3796Sopenharmony_ci } 234ba5c3796Sopenharmony_ci HILOGD("read %{public}s succ, content=[%{public}s]", path.c_str(), contentStr.c_str()); 235ba5c3796Sopenharmony_ci 236ba5c3796Sopenharmony_ci try { 237ba5c3796Sopenharmony_ci priority = std::stoi(contentStr); 238ba5c3796Sopenharmony_ci } catch (std::out_of_range&) { 239ba5c3796Sopenharmony_ci HILOGW("stoi() failed: out_of_range"); 240ba5c3796Sopenharmony_ci return -1; 241ba5c3796Sopenharmony_ci } catch (std::invalid_argument&) { 242ba5c3796Sopenharmony_ci HILOGW("stoi() failed: invalid_argument"); 243ba5c3796Sopenharmony_ci return -1; 244ba5c3796Sopenharmony_ci } 245ba5c3796Sopenharmony_ci return 0; 246ba5c3796Sopenharmony_ci} 247ba5c3796Sopenharmony_ci 248ba5c3796Sopenharmony_ci 249ba5c3796Sopenharmony_ciint32_t MemMgrService::NotifyProcessStateChangedSync(const MemMgrProcessStateInfo &processStateInfo) 250ba5c3796Sopenharmony_ci{ 251ba5c3796Sopenharmony_ci HILOGD("called"); 252ba5c3796Sopenharmony_ci if (processStateInfo.reason_ == ProcPriorityUpdateReason::START_ABILITY) { 253ba5c3796Sopenharmony_ci HILOGD("callerpid=%{public}d,calleruid=%{public}d,pid=%{public}d,uid=%{public}d,reason=%{public}u", 254ba5c3796Sopenharmony_ci processStateInfo.callerPid_, processStateInfo.callerUid_, processStateInfo.pid_, processStateInfo.uid_, 255ba5c3796Sopenharmony_ci static_cast<uint32_t>(processStateInfo.reason_)); 256ba5c3796Sopenharmony_ci UpdateRequest request = CallerRequest({processStateInfo.callerPid_, processStateInfo.callerUid_, "", ""}, 257ba5c3796Sopenharmony_ci {processStateInfo.pid_, processStateInfo.uid_, "", ""}, AppStateUpdateReason::ABILITY_START); 258ba5c3796Sopenharmony_ci if (!ReclaimPriorityManager::GetInstance().UpdateRecalimPrioritySyncWithLock(request)) { 259ba5c3796Sopenharmony_ci HILOGE("NotifyProcessStateChangedSync <pid=%{public}d,uid=%{public}d,reason=%{public}u> failed", 260ba5c3796Sopenharmony_ci processStateInfo.pid_, processStateInfo.uid_, static_cast<uint32_t>(processStateInfo.reason_)); 261ba5c3796Sopenharmony_ci return static_cast<int32_t>(MemMgrErrorCode::MEMMGR_SERVICE_ERR); 262ba5c3796Sopenharmony_ci } 263ba5c3796Sopenharmony_ci } 264ba5c3796Sopenharmony_ci return 0; 265ba5c3796Sopenharmony_ci} 266ba5c3796Sopenharmony_ci 267ba5c3796Sopenharmony_ciint32_t MemMgrService::NotifyProcessStateChangedAsync(const MemMgrProcessStateInfo &processStateInfo) 268ba5c3796Sopenharmony_ci{ 269ba5c3796Sopenharmony_ci HILOGD("called"); 270ba5c3796Sopenharmony_ci if (processStateInfo.reason_ == ProcPriorityUpdateReason::START_ABILITY) { 271ba5c3796Sopenharmony_ci HILOGD("callerpid=%{public}d,calleruid=%{public}d,pid=%{public}d,uid=%{public}d,reason=%{public}u", 272ba5c3796Sopenharmony_ci processStateInfo.callerPid_, processStateInfo.callerUid_, processStateInfo.pid_, processStateInfo.uid_, 273ba5c3796Sopenharmony_ci static_cast<uint32_t>(processStateInfo.reason_)); 274ba5c3796Sopenharmony_ci UpdateRequest request = CallerRequest({processStateInfo.callerPid_, processStateInfo.callerUid_, "", ""}, 275ba5c3796Sopenharmony_ci {processStateInfo.pid_, processStateInfo.uid_, "", ""}, AppStateUpdateReason::ABILITY_START); 276ba5c3796Sopenharmony_ci if (!ReclaimPriorityManager::GetInstance().UpdateReclaimPriority(request)) { 277ba5c3796Sopenharmony_ci HILOGE("NotifyProcessStateChangedAsync <pid=%{public}d,uid=%{public}d,reason=%{public}u> failed", 278ba5c3796Sopenharmony_ci processStateInfo.pid_, processStateInfo.uid_, static_cast<uint32_t>(processStateInfo.reason_)); 279ba5c3796Sopenharmony_ci return static_cast<int32_t>(MemMgrErrorCode::MEMMGR_SERVICE_ERR); 280ba5c3796Sopenharmony_ci } 281ba5c3796Sopenharmony_ci } 282ba5c3796Sopenharmony_ci return 0; 283ba5c3796Sopenharmony_ci} 284ba5c3796Sopenharmony_ci 285ba5c3796Sopenharmony_ciint32_t MemMgrService::NotifyProcessStatus(int32_t pid, int32_t type, int32_t status, int32_t saId) 286ba5c3796Sopenharmony_ci{ 287ba5c3796Sopenharmony_ci HILOGI("pid=%{public}d,type=%{public}d,status=%{public}d,saId=%{public}d", 288ba5c3796Sopenharmony_ci pid, type, status, saId); 289ba5c3796Sopenharmony_ci return 0; 290ba5c3796Sopenharmony_ci} 291ba5c3796Sopenharmony_ci 292ba5c3796Sopenharmony_ciint32_t MemMgrService::SetCritical(int32_t pid, bool critical, int32_t saId) 293ba5c3796Sopenharmony_ci{ 294ba5c3796Sopenharmony_ci HILOGI("pid=%{public}d,critical=%{public}d,saId=%{public}d", pid, critical, saId); 295ba5c3796Sopenharmony_ci return 0; 296ba5c3796Sopenharmony_ci} 297ba5c3796Sopenharmony_ci 298ba5c3796Sopenharmony_civoid MemMgrService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) 299ba5c3796Sopenharmony_ci{ 300ba5c3796Sopenharmony_ci HILOGI("systemAbilityId: %{public}d add", systemAbilityId); 301ba5c3796Sopenharmony_ci MemMgrEventCenter::GetInstance().RemoveEventObserver(systemAbilityId); 302ba5c3796Sopenharmony_ci} 303ba5c3796Sopenharmony_ci 304ba5c3796Sopenharmony_civoid ParseParams(const std::vector<std::string> ¶ms, 305ba5c3796Sopenharmony_ci std::map<std::string, std::vector<std::string>> &keyValuesMapping) 306ba5c3796Sopenharmony_ci{ 307ba5c3796Sopenharmony_ci std::string tmpKey; 308ba5c3796Sopenharmony_ci std::vector<std::string> tmpValue; 309ba5c3796Sopenharmony_ci for (auto i = 0; i < params.size(); i++) { 310ba5c3796Sopenharmony_ci if (params[i].empty()) 311ba5c3796Sopenharmony_ci continue; 312ba5c3796Sopenharmony_ci if (params[i][0] == '-') { 313ba5c3796Sopenharmony_ci if (!tmpKey.empty()) { 314ba5c3796Sopenharmony_ci keyValuesMapping[tmpKey] = tmpValue; 315ba5c3796Sopenharmony_ci tmpValue.clear(); 316ba5c3796Sopenharmony_ci } 317ba5c3796Sopenharmony_ci tmpKey = params[i]; 318ba5c3796Sopenharmony_ci } else { 319ba5c3796Sopenharmony_ci tmpValue.emplace_back(params[i]); 320ba5c3796Sopenharmony_ci } 321ba5c3796Sopenharmony_ci } 322ba5c3796Sopenharmony_ci if (!tmpKey.empty()) { 323ba5c3796Sopenharmony_ci keyValuesMapping[tmpKey] = tmpValue; 324ba5c3796Sopenharmony_ci } 325ba5c3796Sopenharmony_ci 326ba5c3796Sopenharmony_ci HILOGD("keyValuesMapping.size()=%{public}zu\n", keyValuesMapping.size()); 327ba5c3796Sopenharmony_ci for (auto &it : keyValuesMapping) { 328ba5c3796Sopenharmony_ci HILOGD("key=%{public}s", it.first.c_str()); 329ba5c3796Sopenharmony_ci for (auto i = 0; i < it.second.size(); i++) { 330ba5c3796Sopenharmony_ci HILOGD("value[%{public}d]=%{public}s", i, it.second[i].c_str()); 331ba5c3796Sopenharmony_ci } 332ba5c3796Sopenharmony_ci } 333ba5c3796Sopenharmony_ci} 334ba5c3796Sopenharmony_ci 335ba5c3796Sopenharmony_cibool MemMgrService::AllowDump() 336ba5c3796Sopenharmony_ci{ 337ba5c3796Sopenharmony_ci if (ENG_MODE == 0) { 338ba5c3796Sopenharmony_ci HILOGE("Not eng mode"); 339ba5c3796Sopenharmony_ci return false; 340ba5c3796Sopenharmony_ci } 341ba5c3796Sopenharmony_ci Security::AccessToken::AccessTokenID tokenId = IPCSkeleton::GetFirstTokenID(); 342ba5c3796Sopenharmony_ci int32_t ret = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, "ohos.permission.DUMP"); 343ba5c3796Sopenharmony_ci if (ret != Security::AccessToken::PermissionState::PERMISSION_GRANTED) { 344ba5c3796Sopenharmony_ci HILOGE("CheckPermission failed"); 345ba5c3796Sopenharmony_ci return false; 346ba5c3796Sopenharmony_ci } 347ba5c3796Sopenharmony_ci return true; 348ba5c3796Sopenharmony_ci} 349ba5c3796Sopenharmony_ci 350ba5c3796Sopenharmony_ciint MemMgrService::Dump(int fd, const std::vector<std::u16string> &args) 351ba5c3796Sopenharmony_ci{ 352ba5c3796Sopenharmony_ci if (!AllowDump()) { 353ba5c3796Sopenharmony_ci return ERR_MEMMGR_PERMISSION_DENIED; 354ba5c3796Sopenharmony_ci } 355ba5c3796Sopenharmony_ci HILOGI("called"); 356ba5c3796Sopenharmony_ci std::vector<std::string> params; 357ba5c3796Sopenharmony_ci for (auto &arg : args) { 358ba5c3796Sopenharmony_ci params.emplace_back(Str16ToStr8(arg)); 359ba5c3796Sopenharmony_ci } 360ba5c3796Sopenharmony_ci std::map<std::string, std::vector<std::string>> keyValuesMapping; 361ba5c3796Sopenharmony_ci ParseParams(params, keyValuesMapping); 362ba5c3796Sopenharmony_ci DispatchDumpCommand(fd, keyValuesMapping); 363ba5c3796Sopenharmony_ci return 0; 364ba5c3796Sopenharmony_ci} 365ba5c3796Sopenharmony_ci} // namespace Memory 366ba5c3796Sopenharmony_ci} // namespace OHOS 367