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> &params,
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