1eace7efcSopenharmony_ci/*
2eace7efcSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3eace7efcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4eace7efcSopenharmony_ci * you may not use this file except in compliance with the License.
5eace7efcSopenharmony_ci * You may obtain a copy of the License at
6eace7efcSopenharmony_ci *
7eace7efcSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8eace7efcSopenharmony_ci *
9eace7efcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10eace7efcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11eace7efcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12eace7efcSopenharmony_ci * See the License for the specific language governing permissions and
13eace7efcSopenharmony_ci * limitations under the License.
14eace7efcSopenharmony_ci */
15eace7efcSopenharmony_ci#include "appfreeze_manager.h"
16eace7efcSopenharmony_ci
17eace7efcSopenharmony_ci#include <fcntl.h>
18eace7efcSopenharmony_ci#include <sys/time.h>
19eace7efcSopenharmony_ci#include <sys/wait.h>
20eace7efcSopenharmony_ci#include <sys/types.h>
21eace7efcSopenharmony_ci#include <sys/syscall.h>
22eace7efcSopenharmony_ci#include <sys/stat.h>
23eace7efcSopenharmony_ci#include <fstream>
24eace7efcSopenharmony_ci
25eace7efcSopenharmony_ci#include "faultloggerd_client.h"
26eace7efcSopenharmony_ci#include "file_ex.h"
27eace7efcSopenharmony_ci#include "ffrt.h"
28eace7efcSopenharmony_ci#include "dfx_dump_catcher.h"
29eace7efcSopenharmony_ci#include "directory_ex.h"
30eace7efcSopenharmony_ci#include "hisysevent.h"
31eace7efcSopenharmony_ci#include "hitrace_meter.h"
32eace7efcSopenharmony_ci#include "parameter.h"
33eace7efcSopenharmony_ci#include "singleton.h"
34eace7efcSopenharmony_ci
35eace7efcSopenharmony_ci#include "app_mgr_client.h"
36eace7efcSopenharmony_ci#include "hilog_tag_wrapper.h"
37eace7efcSopenharmony_ci#include "time_util.h"
38eace7efcSopenharmony_ci
39eace7efcSopenharmony_cinamespace OHOS {
40eace7efcSopenharmony_cinamespace AppExecFwk {
41eace7efcSopenharmony_cinamespace {
42eace7efcSopenharmony_ciconstexpr char EVENT_UID[] = "UID";
43eace7efcSopenharmony_ciconstexpr char EVENT_PID[] = "PID";
44eace7efcSopenharmony_ciconstexpr char EVENT_INPUT_ID[] = "INPUT_ID";
45eace7efcSopenharmony_ciconstexpr char EVENT_MESSAGE[] = "MSG";
46eace7efcSopenharmony_ciconstexpr char EVENT_PACKAGE_NAME[] = "PACKAGE_NAME";
47eace7efcSopenharmony_ciconstexpr char EVENT_PROCESS_NAME[] = "PROCESS_NAME";
48eace7efcSopenharmony_ciconstexpr char EVENT_STACK[] = "STACK";
49eace7efcSopenharmony_ciconstexpr char BINDER_INFO[] = "BINDER_INFO";
50eace7efcSopenharmony_ciconstexpr char APP_RUNNING_UNIQUE_ID[] = "APP_RUNNING_UNIQUE_ID";
51eace7efcSopenharmony_ciconstexpr char FREEZE_MEMORY[] = "FREEZE_MEMORY";
52eace7efcSopenharmony_ciconstexpr int MAX_LAYER = 8;
53eace7efcSopenharmony_ciconstexpr int FREEZEMAP_SIZE_MAX = 20;
54eace7efcSopenharmony_ciconstexpr int FREEZE_TIME_LIMIT = 60000;
55eace7efcSopenharmony_cistatic constexpr int64_t NANOSECONDS = 1000000000;  // NANOSECONDS mean 10^9 nano second
56eace7efcSopenharmony_cistatic constexpr int64_t MICROSECONDS = 1000000;    // MICROSECONDS mean 10^6 millias second
57eace7efcSopenharmony_ciconstexpr uint64_t SEC_TO_MILLISEC = 1000;
58eace7efcSopenharmony_ciconst std::string LOG_FILE_PATH = "data/log/eventlog";
59eace7efcSopenharmony_ci}
60eace7efcSopenharmony_cistd::shared_ptr<AppfreezeManager> AppfreezeManager::instance_ = nullptr;
61eace7efcSopenharmony_ciffrt::mutex AppfreezeManager::singletonMutex_;
62eace7efcSopenharmony_ciffrt::mutex AppfreezeManager::freezeMutex_;
63eace7efcSopenharmony_ciffrt::mutex AppfreezeManager::catchStackMutex_;
64eace7efcSopenharmony_cistd::map<int, std::string> AppfreezeManager::catchStackMap_;
65eace7efcSopenharmony_ciffrt::mutex AppfreezeManager::freezeFilterMutex_;
66eace7efcSopenharmony_ci
67eace7efcSopenharmony_ciAppfreezeManager::AppfreezeManager()
68eace7efcSopenharmony_ci{
69eace7efcSopenharmony_ci    name_ = "AppfreezeManager" + std::to_string(GetMilliseconds());
70eace7efcSopenharmony_ci}
71eace7efcSopenharmony_ci
72eace7efcSopenharmony_ciAppfreezeManager::~AppfreezeManager()
73eace7efcSopenharmony_ci{
74eace7efcSopenharmony_ci}
75eace7efcSopenharmony_ci
76eace7efcSopenharmony_cistd::shared_ptr<AppfreezeManager> AppfreezeManager::GetInstance()
77eace7efcSopenharmony_ci{
78eace7efcSopenharmony_ci    if (instance_ == nullptr) {
79eace7efcSopenharmony_ci        std::lock_guard<ffrt::mutex> lock(singletonMutex_);
80eace7efcSopenharmony_ci        if (instance_ == nullptr) {
81eace7efcSopenharmony_ci            instance_ = std::make_shared<AppfreezeManager>();
82eace7efcSopenharmony_ci        }
83eace7efcSopenharmony_ci    }
84eace7efcSopenharmony_ci    return instance_;
85eace7efcSopenharmony_ci}
86eace7efcSopenharmony_ci
87eace7efcSopenharmony_civoid AppfreezeManager::DestroyInstance()
88eace7efcSopenharmony_ci{
89eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(singletonMutex_);
90eace7efcSopenharmony_ci    if (instance_ != nullptr) {
91eace7efcSopenharmony_ci        instance_.reset();
92eace7efcSopenharmony_ci        instance_ = nullptr;
93eace7efcSopenharmony_ci    }
94eace7efcSopenharmony_ci}
95eace7efcSopenharmony_ci
96eace7efcSopenharmony_ciuint64_t AppfreezeManager::GetMilliseconds()
97eace7efcSopenharmony_ci{
98eace7efcSopenharmony_ci    auto now = std::chrono::system_clock::now();
99eace7efcSopenharmony_ci    auto millisecs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
100eace7efcSopenharmony_ci    return millisecs.count();
101eace7efcSopenharmony_ci}
102eace7efcSopenharmony_ci
103eace7efcSopenharmony_cibool AppfreezeManager::IsHandleAppfreeze(const std::string& bundleName)
104eace7efcSopenharmony_ci{
105eace7efcSopenharmony_ci    if (bundleName.empty()) {
106eace7efcSopenharmony_ci        return true;
107eace7efcSopenharmony_ci    }
108eace7efcSopenharmony_ci    return !DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->IsAttachDebug(bundleName);
109eace7efcSopenharmony_ci}
110eace7efcSopenharmony_ci
111eace7efcSopenharmony_ciint AppfreezeManager::AppfreezeHandle(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo)
112eace7efcSopenharmony_ci{
113eace7efcSopenharmony_ci    TAG_LOGD(AAFwkTag::APPDFR, "called %{public}s, bundleName %{public}s, name_ %{public}s",
114eace7efcSopenharmony_ci        faultData.errorObject.name.c_str(), appInfo.bundleName.c_str(), name_.c_str());
115eace7efcSopenharmony_ci    if (!IsHandleAppfreeze(appInfo.bundleName)) {
116eace7efcSopenharmony_ci        return -1;
117eace7efcSopenharmony_ci    }
118eace7efcSopenharmony_ci    HITRACE_METER_FMT(HITRACE_TAG_APP, "AppfreezeHandler:%{public}s bundleName:%{public}s",
119eace7efcSopenharmony_ci        faultData.errorObject.name.c_str(), appInfo.bundleName.c_str());
120eace7efcSopenharmony_ci    std::string memoryContent = "";
121eace7efcSopenharmony_ci    CollectFreezeSysMemory(memoryContent);
122eace7efcSopenharmony_ci    if (faultData.errorObject.name == AppFreezeType::APP_INPUT_BLOCK) {
123eace7efcSopenharmony_ci        AcquireStack(faultData, appInfo, memoryContent);
124eace7efcSopenharmony_ci    } else {
125eace7efcSopenharmony_ci        NotifyANR(faultData, appInfo, "", memoryContent);
126eace7efcSopenharmony_ci    }
127eace7efcSopenharmony_ci    return 0;
128eace7efcSopenharmony_ci}
129eace7efcSopenharmony_ci
130eace7efcSopenharmony_civoid AppfreezeManager::CollectFreezeSysMemory(std::string& memoryContent)
131eace7efcSopenharmony_ci{
132eace7efcSopenharmony_ci    std::string tmp = "";
133eace7efcSopenharmony_ci    std::string pressMemInfo = "/proc/pressure/memory";
134eace7efcSopenharmony_ci    OHOS::LoadStringFromFile(pressMemInfo, tmp);
135eace7efcSopenharmony_ci    memoryContent = tmp + "\n";
136eace7efcSopenharmony_ci    std::string memInfoPath = "/proc/memview";
137eace7efcSopenharmony_ci    if (!OHOS::FileExists(memInfoPath)) {
138eace7efcSopenharmony_ci        memInfoPath = "/proc/meminfo";
139eace7efcSopenharmony_ci    }
140eace7efcSopenharmony_ci    OHOS::LoadStringFromFile(memInfoPath, tmp);
141eace7efcSopenharmony_ci    memoryContent += tmp;
142eace7efcSopenharmony_ci}
143eace7efcSopenharmony_ci
144eace7efcSopenharmony_ciint AppfreezeManager::AppfreezeHandleWithStack(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo)
145eace7efcSopenharmony_ci{
146eace7efcSopenharmony_ci    TAG_LOGD(AAFwkTag::APPDFR, "called %{public}s, bundleName %{public}s, name_ %{public}s",
147eace7efcSopenharmony_ci        faultData.errorObject.name.c_str(), appInfo.bundleName.c_str(), name_.c_str());
148eace7efcSopenharmony_ci    if (!IsHandleAppfreeze(appInfo.bundleName)) {
149eace7efcSopenharmony_ci        return -1;
150eace7efcSopenharmony_ci    }
151eace7efcSopenharmony_ci    FaultData faultNotifyData;
152eace7efcSopenharmony_ci    faultNotifyData.errorObject.name = faultData.errorObject.name;
153eace7efcSopenharmony_ci    faultNotifyData.errorObject.message = faultData.errorObject.message;
154eace7efcSopenharmony_ci    faultNotifyData.errorObject.stack = faultData.errorObject.stack;
155eace7efcSopenharmony_ci    faultNotifyData.faultType = FaultDataType::APP_FREEZE;
156eace7efcSopenharmony_ci    faultNotifyData.eventId = faultData.eventId;
157eace7efcSopenharmony_ci
158eace7efcSopenharmony_ci    HITRACE_METER_FMT(HITRACE_TAG_APP, "AppfreezeHandleWithStack pid:%d-name:%s",
159eace7efcSopenharmony_ci        appInfo.pid, faultData.errorObject.name.c_str());
160eace7efcSopenharmony_ci    if (faultData.errorObject.name == AppFreezeType::LIFECYCLE_TIMEOUT
161eace7efcSopenharmony_ci        || faultData.errorObject.name == AppFreezeType::APP_INPUT_BLOCK
162eace7efcSopenharmony_ci        || faultData.errorObject.name == AppFreezeType::THREAD_BLOCK_6S) {
163eace7efcSopenharmony_ci        if (AppExecFwk::AppfreezeManager::GetInstance()->IsNeedIgnoreFreezeEvent(appInfo.pid)) {
164eace7efcSopenharmony_ci            TAG_LOGE(AAFwkTag::APPDFR, "appFreeze happend");
165eace7efcSopenharmony_ci            return 0;
166eace7efcSopenharmony_ci        }
167eace7efcSopenharmony_ci    }
168eace7efcSopenharmony_ci
169eace7efcSopenharmony_ci    std::string memoryContent = "";
170eace7efcSopenharmony_ci    CollectFreezeSysMemory(memoryContent);
171eace7efcSopenharmony_ci    std::string fileName = faultData.errorObject.name + "_" +
172eace7efcSopenharmony_ci        AbilityRuntime::TimeUtil::FormatTime("%Y%m%d%H%M%S") + "_" + std::to_string(appInfo.pid) + "_stack";
173eace7efcSopenharmony_ci    std::string catcherStack = "";
174eace7efcSopenharmony_ci    std::string catchJsonStack = "";
175eace7efcSopenharmony_ci    std::string fullStackPath = "";
176eace7efcSopenharmony_ci    if (faultData.errorObject.name == AppFreezeType::LIFECYCLE_HALF_TIMEOUT
177eace7efcSopenharmony_ci        || faultData.errorObject.name == AppFreezeType::LIFECYCLE_TIMEOUT) {
178eace7efcSopenharmony_ci        catcherStack += CatcherStacktrace(appInfo.pid);
179eace7efcSopenharmony_ci        fullStackPath = WriteToFile(fileName, catcherStack);
180eace7efcSopenharmony_ci        faultNotifyData.errorObject.stack = fullStackPath;
181eace7efcSopenharmony_ci    } else {
182eace7efcSopenharmony_ci        auto start = GetMilliseconds();
183eace7efcSopenharmony_ci        std::string timeStamp = "\nTimestamp:" + AbilityRuntime::TimeUtil::FormatTime("%Y-%m-%d %H:%M:%S") +
184eace7efcSopenharmony_ci            ":" + std::to_string(start % SEC_TO_MILLISEC);
185eace7efcSopenharmony_ci        faultNotifyData.errorObject.message += timeStamp;
186eace7efcSopenharmony_ci        catchJsonStack += CatchJsonStacktrace(appInfo.pid, faultData.errorObject.name);
187eace7efcSopenharmony_ci        fullStackPath = WriteToFile(fileName, catchJsonStack);
188eace7efcSopenharmony_ci        faultNotifyData.errorObject.stack = fullStackPath;
189eace7efcSopenharmony_ci    }
190eace7efcSopenharmony_ci    if (faultNotifyData.errorObject.name == AppFreezeType::APP_INPUT_BLOCK) {
191eace7efcSopenharmony_ci        AcquireStack(faultNotifyData, appInfo, memoryContent);
192eace7efcSopenharmony_ci    } else {
193eace7efcSopenharmony_ci        NotifyANR(faultNotifyData, appInfo, "", memoryContent);
194eace7efcSopenharmony_ci    }
195eace7efcSopenharmony_ci    return 0;
196eace7efcSopenharmony_ci}
197eace7efcSopenharmony_ci
198eace7efcSopenharmony_cistd::string AppfreezeManager::WriteToFile(const std::string& fileName, std::string& content)
199eace7efcSopenharmony_ci{
200eace7efcSopenharmony_ci    std::string dir_path = LOG_FILE_PATH + "/freeze";
201eace7efcSopenharmony_ci    constexpr mode_t defaultLogDirMode = 0770;
202eace7efcSopenharmony_ci    if (!OHOS::FileExists(dir_path)) {
203eace7efcSopenharmony_ci        OHOS::ForceCreateDirectory(dir_path);
204eace7efcSopenharmony_ci        OHOS::ChangeModeDirectory(dir_path, defaultLogDirMode);
205eace7efcSopenharmony_ci    }
206eace7efcSopenharmony_ci    std::string realPath;
207eace7efcSopenharmony_ci    if (!OHOS::PathToRealPath(dir_path, realPath)) {
208eace7efcSopenharmony_ci        TAG_LOGE(AAFwkTag::APPDFR, "pathToRealPath failed:%{public}s", dir_path.c_str());
209eace7efcSopenharmony_ci        return "";
210eace7efcSopenharmony_ci    }
211eace7efcSopenharmony_ci    std::string stackPath = realPath + "/" + fileName;
212eace7efcSopenharmony_ci    constexpr mode_t defaultLogFileMode = 0644;
213eace7efcSopenharmony_ci    auto fd = open(stackPath.c_str(), O_CREAT | O_WRONLY | O_TRUNC, defaultLogFileMode);
214eace7efcSopenharmony_ci    if (fd < 0) {
215eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "stackPath create failed");
216eace7efcSopenharmony_ci        return "";
217eace7efcSopenharmony_ci    } else {
218eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "stackPath: %{public}s", stackPath.c_str());
219eace7efcSopenharmony_ci    }
220eace7efcSopenharmony_ci    OHOS::SaveStringToFd(fd, content);
221eace7efcSopenharmony_ci    close(fd);
222eace7efcSopenharmony_ci    return stackPath;
223eace7efcSopenharmony_ci}
224eace7efcSopenharmony_ci
225eace7efcSopenharmony_ciint AppfreezeManager::LifecycleTimeoutHandle(const ParamInfo& info, FreezeUtil::LifecycleFlow flow)
226eace7efcSopenharmony_ci{
227eace7efcSopenharmony_ci    if (info.typeId != AppfreezeManager::TypeAttribute::CRITICAL_TIMEOUT) {
228eace7efcSopenharmony_ci        return -1;
229eace7efcSopenharmony_ci    }
230eace7efcSopenharmony_ci    if (!IsHandleAppfreeze(info.bundleName)) {
231eace7efcSopenharmony_ci        return -1;
232eace7efcSopenharmony_ci    }
233eace7efcSopenharmony_ci    if (info.eventName != AppFreezeType::LIFECYCLE_TIMEOUT &&
234eace7efcSopenharmony_ci        info.eventName != AppFreezeType::LIFECYCLE_HALF_TIMEOUT) {
235eace7efcSopenharmony_ci        return -1;
236eace7efcSopenharmony_ci    }
237eace7efcSopenharmony_ci    TAG_LOGD(AAFwkTag::APPDFR, "called %{public}s, name_ %{public}s", info.bundleName.c_str(),
238eace7efcSopenharmony_ci        name_.c_str());
239eace7efcSopenharmony_ci    HITRACE_METER_FMT(HITRACE_TAG_APP, "LifecycleTimeoutHandle:%{public}s bundleName:%{public}s",
240eace7efcSopenharmony_ci        info.eventName.c_str(), info.bundleName.c_str());
241eace7efcSopenharmony_ci    AppFaultDataBySA faultDataSA;
242eace7efcSopenharmony_ci    faultDataSA.errorObject.name = info.eventName;
243eace7efcSopenharmony_ci    faultDataSA.errorObject.message = info.msg;
244eace7efcSopenharmony_ci    faultDataSA.faultType = FaultDataType::APP_FREEZE;
245eace7efcSopenharmony_ci    faultDataSA.timeoutMarkers = "notifyFault" +
246eace7efcSopenharmony_ci                                 std::to_string(info.pid) +
247eace7efcSopenharmony_ci                                 "-" + std::to_string(GetMilliseconds());
248eace7efcSopenharmony_ci    faultDataSA.pid = info.pid;
249eace7efcSopenharmony_ci    if (flow.state != AbilityRuntime::FreezeUtil::TimeoutState::UNKNOWN) {
250eace7efcSopenharmony_ci        faultDataSA.token = flow.token;
251eace7efcSopenharmony_ci        faultDataSA.state = static_cast<uint32_t>(flow.state);
252eace7efcSopenharmony_ci    }
253eace7efcSopenharmony_ci    DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->NotifyAppFaultBySA(faultDataSA);
254eace7efcSopenharmony_ci    return 0;
255eace7efcSopenharmony_ci}
256eace7efcSopenharmony_ci
257eace7efcSopenharmony_ciint AppfreezeManager::AcquireStack(const FaultData& faultData,
258eace7efcSopenharmony_ci    const AppfreezeManager::AppInfo& appInfo, const std::string& memoryContent)
259eace7efcSopenharmony_ci{
260eace7efcSopenharmony_ci    int ret = 0;
261eace7efcSopenharmony_ci    int pid = appInfo.pid;
262eace7efcSopenharmony_ci    FaultData faultNotifyData;
263eace7efcSopenharmony_ci    faultNotifyData.errorObject.name = faultData.errorObject.name;
264eace7efcSopenharmony_ci    faultNotifyData.errorObject.message = faultData.errorObject.message;
265eace7efcSopenharmony_ci    faultNotifyData.errorObject.stack = faultData.errorObject.stack;
266eace7efcSopenharmony_ci    faultNotifyData.faultType = FaultDataType::APP_FREEZE;
267eace7efcSopenharmony_ci    faultNotifyData.eventId = faultData.eventId;
268eace7efcSopenharmony_ci    std::string binderInfo;
269eace7efcSopenharmony_ci    std::string binderPidsStr;
270eace7efcSopenharmony_ci    std::set<int> pids = GetBinderPeerPids(binderInfo, pid);
271eace7efcSopenharmony_ci    for (auto& pidTemp : pids) {
272eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "pidTemp pids:%{public}d", pidTemp);
273eace7efcSopenharmony_ci        if (pidTemp != pid) {
274eace7efcSopenharmony_ci            std::string content = "PeerBinder catcher stacktrace for pid : " + std::to_string(pidTemp) + "\n";
275eace7efcSopenharmony_ci            content += CatcherStacktrace(pidTemp);
276eace7efcSopenharmony_ci            binderInfo += content;
277eace7efcSopenharmony_ci            binderPidsStr += " " + std::to_string(pidTemp);
278eace7efcSopenharmony_ci        }
279eace7efcSopenharmony_ci    }
280eace7efcSopenharmony_ci
281eace7efcSopenharmony_ci    if (pids.empty()) {
282eace7efcSopenharmony_ci        binderInfo +="PeerBinder pids is empty\n";
283eace7efcSopenharmony_ci    }
284eace7efcSopenharmony_ci
285eace7efcSopenharmony_ci    std::string fileName = faultData.errorObject.name + "_" +
286eace7efcSopenharmony_ci        AbilityRuntime::TimeUtil::FormatTime("%Y%m%d%H%M%S") + "_" + std::to_string(appInfo.pid) + "_binder";
287eace7efcSopenharmony_ci    std::string fullStackPath = WriteToFile(fileName, binderInfo);
288eace7efcSopenharmony_ci    binderInfo = fullStackPath + "," + binderPidsStr;
289eace7efcSopenharmony_ci
290eace7efcSopenharmony_ci    ret = NotifyANR(faultNotifyData, appInfo, binderInfo, memoryContent);
291eace7efcSopenharmony_ci    return ret;
292eace7efcSopenharmony_ci}
293eace7efcSopenharmony_ci
294eace7efcSopenharmony_ciint AppfreezeManager::NotifyANR(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo,
295eace7efcSopenharmony_ci    const std::string& binderInfo, const std::string& memoryContent)
296eace7efcSopenharmony_ci{
297eace7efcSopenharmony_ci    std::string appRunningUniqueId = "";
298eace7efcSopenharmony_ci    DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->GetAppRunningUniqueIdByPid(appInfo.pid,
299eace7efcSopenharmony_ci        appRunningUniqueId);
300eace7efcSopenharmony_ci    int ret = 0;
301eace7efcSopenharmony_ci    if (faultData.errorObject.name == AppFreezeType::APP_INPUT_BLOCK) {
302eace7efcSopenharmony_ci        ret = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AAFWK, faultData.errorObject.name,
303eace7efcSopenharmony_ci            OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, EVENT_UID, appInfo.uid, EVENT_PID, appInfo.pid,
304eace7efcSopenharmony_ci            EVENT_PACKAGE_NAME, appInfo.bundleName, EVENT_PROCESS_NAME, appInfo.processName, EVENT_MESSAGE,
305eace7efcSopenharmony_ci            faultData.errorObject.message, EVENT_STACK, faultData.errorObject.stack, BINDER_INFO, binderInfo,
306eace7efcSopenharmony_ci            APP_RUNNING_UNIQUE_ID, appRunningUniqueId, EVENT_INPUT_ID, faultData.eventId,
307eace7efcSopenharmony_ci            FREEZE_MEMORY, memoryContent);
308eace7efcSopenharmony_ci    } else {
309eace7efcSopenharmony_ci        ret = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AAFWK, faultData.errorObject.name,
310eace7efcSopenharmony_ci            OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, EVENT_UID, appInfo.uid, EVENT_PID, appInfo.pid,
311eace7efcSopenharmony_ci            EVENT_PACKAGE_NAME, appInfo.bundleName, EVENT_PROCESS_NAME, appInfo.processName, EVENT_MESSAGE,
312eace7efcSopenharmony_ci            faultData.errorObject.message, EVENT_STACK, faultData.errorObject.stack, BINDER_INFO, binderInfo,
313eace7efcSopenharmony_ci            APP_RUNNING_UNIQUE_ID, appRunningUniqueId, FREEZE_MEMORY, memoryContent);
314eace7efcSopenharmony_ci    }
315eace7efcSopenharmony_ci    TAG_LOGI(AAFwkTag::APPDFR,
316eace7efcSopenharmony_ci        "reportEvent:%{public}s, pid:%{public}d, bundleName:%{public}s, appRunningUniqueId:%{public}s"
317eace7efcSopenharmony_ci        ", eventId:%{public}d hisysevent write ret: %{public}d",
318eace7efcSopenharmony_ci        faultData.errorObject.name.c_str(), appInfo.pid, appInfo.bundleName.c_str(), appRunningUniqueId.c_str(),
319eace7efcSopenharmony_ci        faultData.eventId, ret);
320eace7efcSopenharmony_ci    return 0;
321eace7efcSopenharmony_ci}
322eace7efcSopenharmony_ci
323eace7efcSopenharmony_cistd::map<int, std::set<int>> AppfreezeManager::BinderParser(std::ifstream& fin, std::string& stack) const
324eace7efcSopenharmony_ci{
325eace7efcSopenharmony_ci    std::map<int, std::set<int>> binderInfo;
326eace7efcSopenharmony_ci    const int decimal = 10;
327eace7efcSopenharmony_ci    std::string line;
328eace7efcSopenharmony_ci    bool isBinderMatchup = false;
329eace7efcSopenharmony_ci    TAG_LOGI(AAFwkTag::APPDFR, "start");
330eace7efcSopenharmony_ci    stack += "BinderCatcher --\n\n";
331eace7efcSopenharmony_ci    while (getline(fin, line)) {
332eace7efcSopenharmony_ci        stack += line + "\n";
333eace7efcSopenharmony_ci        if (isBinderMatchup) {
334eace7efcSopenharmony_ci            continue;
335eace7efcSopenharmony_ci        }
336eace7efcSopenharmony_ci
337eace7efcSopenharmony_ci        if (line.find("async\t") != std::string::npos) {
338eace7efcSopenharmony_ci            continue;
339eace7efcSopenharmony_ci        }
340eace7efcSopenharmony_ci
341eace7efcSopenharmony_ci        std::istringstream lineStream(line);
342eace7efcSopenharmony_ci        std::vector<std::string> strList;
343eace7efcSopenharmony_ci        std::string tmpstr;
344eace7efcSopenharmony_ci        while (lineStream >> tmpstr) {
345eace7efcSopenharmony_ci            strList.push_back(tmpstr);
346eace7efcSopenharmony_ci        }
347eace7efcSopenharmony_ci
348eace7efcSopenharmony_ci        auto SplitPhase = [](const std::string& str, uint16_t index) -> std::string {
349eace7efcSopenharmony_ci            std::vector<std::string> strings;
350eace7efcSopenharmony_ci            SplitStr(str, ":", strings);
351eace7efcSopenharmony_ci            if (index < strings.size()) {
352eace7efcSopenharmony_ci                return strings[index];
353eace7efcSopenharmony_ci            }
354eace7efcSopenharmony_ci            return "";
355eace7efcSopenharmony_ci        };
356eace7efcSopenharmony_ci
357eace7efcSopenharmony_ci        if (strList.size() >= 7) { // 7: valid array size
358eace7efcSopenharmony_ci            // 2: peer id,
359eace7efcSopenharmony_ci            std::string server = SplitPhase(strList[2], 0);
360eace7efcSopenharmony_ci            // 0: local id,
361eace7efcSopenharmony_ci            std::string client = SplitPhase(strList[0], 0);
362eace7efcSopenharmony_ci            // 5: wait time, s
363eace7efcSopenharmony_ci            std::string wait = SplitPhase(strList[5], 1);
364eace7efcSopenharmony_ci            if (server == "" || client == "" || wait == "") {
365eace7efcSopenharmony_ci                continue;
366eace7efcSopenharmony_ci            }
367eace7efcSopenharmony_ci            int serverNum = std::strtol(server.c_str(), nullptr, decimal);
368eace7efcSopenharmony_ci            int clientNum = std::strtol(client.c_str(), nullptr, decimal);
369eace7efcSopenharmony_ci            int waitNum = std::strtol(wait.c_str(), nullptr, decimal);
370eace7efcSopenharmony_ci            TAG_LOGI(AAFwkTag::APPDFR, "server:%{public}d, client:%{public}d, wait:%{public}d", serverNum, clientNum,
371eace7efcSopenharmony_ci                waitNum);
372eace7efcSopenharmony_ci            binderInfo[clientNum].insert(serverNum);
373eace7efcSopenharmony_ci        }
374eace7efcSopenharmony_ci        if (line.find("context") != line.npos) {
375eace7efcSopenharmony_ci            isBinderMatchup = true;
376eace7efcSopenharmony_ci        }
377eace7efcSopenharmony_ci    }
378eace7efcSopenharmony_ci    TAG_LOGI(AAFwkTag::APPDFR, "binderInfo size: %{public}zu", binderInfo.size());
379eace7efcSopenharmony_ci    return binderInfo;
380eace7efcSopenharmony_ci}
381eace7efcSopenharmony_ci
382eace7efcSopenharmony_cistd::set<int> AppfreezeManager::GetBinderPeerPids(std::string& stack, int pid) const
383eace7efcSopenharmony_ci{
384eace7efcSopenharmony_ci    std::set<int> pids;
385eace7efcSopenharmony_ci    std::ifstream fin;
386eace7efcSopenharmony_ci    std::string path = LOGGER_DEBUG_PROC_PATH;
387eace7efcSopenharmony_ci    char resolvePath[PATH_MAX] = {0};
388eace7efcSopenharmony_ci    if (realpath(path.c_str(), resolvePath) == nullptr) {
389eace7efcSopenharmony_ci        TAG_LOGE(AAFwkTag::APPDFR, "invalid realpath");
390eace7efcSopenharmony_ci        return pids;
391eace7efcSopenharmony_ci    }
392eace7efcSopenharmony_ci    fin.open(resolvePath);
393eace7efcSopenharmony_ci    if (!fin.is_open()) {
394eace7efcSopenharmony_ci        TAG_LOGE(AAFwkTag::APPDFR, "open failed, %{public}s", resolvePath);
395eace7efcSopenharmony_ci        stack += "open file failed :" + path + "\r\n";
396eace7efcSopenharmony_ci        return pids;
397eace7efcSopenharmony_ci    }
398eace7efcSopenharmony_ci
399eace7efcSopenharmony_ci    stack += "\n\nPeerBinderCatcher -- pid==" + std::to_string(pid) + "\n\n";
400eace7efcSopenharmony_ci    std::map<int, std::set<int>> binderInfo = BinderParser(fin, stack);
401eace7efcSopenharmony_ci    fin.close();
402eace7efcSopenharmony_ci
403eace7efcSopenharmony_ci    if (binderInfo.size() == 0 || binderInfo.find(pid) == binderInfo.end()) {
404eace7efcSopenharmony_ci        return pids;
405eace7efcSopenharmony_ci    }
406eace7efcSopenharmony_ci
407eace7efcSopenharmony_ci    ParseBinderPids(binderInfo, pids, pid, 0);
408eace7efcSopenharmony_ci    for (auto& each : pids) {
409eace7efcSopenharmony_ci        TAG_LOGD(AAFwkTag::APPDFR, "each pids:%{public}d", each);
410eace7efcSopenharmony_ci    }
411eace7efcSopenharmony_ci    return pids;
412eace7efcSopenharmony_ci}
413eace7efcSopenharmony_ci
414eace7efcSopenharmony_civoid AppfreezeManager::ParseBinderPids(const std::map<int, std::set<int>>& binderInfo,
415eace7efcSopenharmony_ci    std::set<int>& pids, int pid, int layer) const
416eace7efcSopenharmony_ci{
417eace7efcSopenharmony_ci    auto it = binderInfo.find(pid);
418eace7efcSopenharmony_ci    layer++;
419eace7efcSopenharmony_ci    if (layer >= MAX_LAYER) {
420eace7efcSopenharmony_ci        return;
421eace7efcSopenharmony_ci    }
422eace7efcSopenharmony_ci    if (it != binderInfo.end()) {
423eace7efcSopenharmony_ci        for (auto& each : it->second) {
424eace7efcSopenharmony_ci            pids.insert(each);
425eace7efcSopenharmony_ci            ParseBinderPids(binderInfo, pids, each, layer);
426eace7efcSopenharmony_ci        }
427eace7efcSopenharmony_ci    }
428eace7efcSopenharmony_ci}
429eace7efcSopenharmony_ci
430eace7efcSopenharmony_civoid AppfreezeManager::DeleteStack(int pid)
431eace7efcSopenharmony_ci{
432eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(catchStackMutex_);
433eace7efcSopenharmony_ci    auto it = catchStackMap_.find(pid);
434eace7efcSopenharmony_ci    if (it != catchStackMap_.end()) {
435eace7efcSopenharmony_ci        catchStackMap_.erase(it);
436eace7efcSopenharmony_ci    }
437eace7efcSopenharmony_ci}
438eace7efcSopenharmony_ci
439eace7efcSopenharmony_civoid AppfreezeManager::FindStackByPid(std::string& ret, int pid) const
440eace7efcSopenharmony_ci{
441eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(catchStackMutex_);
442eace7efcSopenharmony_ci    auto it = catchStackMap_.find(pid);
443eace7efcSopenharmony_ci    if (it != catchStackMap_.end()) {
444eace7efcSopenharmony_ci        ret = it->second;
445eace7efcSopenharmony_ci    }
446eace7efcSopenharmony_ci}
447eace7efcSopenharmony_ci
448eace7efcSopenharmony_cistd::string AppfreezeManager::CatchJsonStacktrace(int pid, const std::string& faultType) const
449eace7efcSopenharmony_ci{
450eace7efcSopenharmony_ci    HITRACE_METER_FMT(HITRACE_TAG_APP, "CatchJsonStacktrace pid:%d", pid);
451eace7efcSopenharmony_ci    HiviewDFX::DfxDumpCatcher dumplog;
452eace7efcSopenharmony_ci    std::string ret;
453eace7efcSopenharmony_ci    std::string msg;
454eace7efcSopenharmony_ci    size_t defaultMaxFaultNum = 256;
455eace7efcSopenharmony_ci    if (dumplog.DumpCatchProcess(pid, msg, defaultMaxFaultNum, true) == -1) {
456eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "appfreeze catch stack failed");
457eace7efcSopenharmony_ci        ret = "Failed to dump stacktrace for " + std::to_string(pid) + "\n" + msg;
458eace7efcSopenharmony_ci        if (faultType == AppFreezeType::APP_INPUT_BLOCK) {
459eace7efcSopenharmony_ci            FindStackByPid(ret, pid);
460eace7efcSopenharmony_ci        }
461eace7efcSopenharmony_ci    } else {
462eace7efcSopenharmony_ci        ret = msg;
463eace7efcSopenharmony_ci        if (faultType == AppFreezeType::THREAD_BLOCK_3S) {
464eace7efcSopenharmony_ci            std::lock_guard<ffrt::mutex> lock(catchStackMutex_);
465eace7efcSopenharmony_ci            catchStackMap_[pid] = msg;
466eace7efcSopenharmony_ci        }
467eace7efcSopenharmony_ci    }
468eace7efcSopenharmony_ci    return ret;
469eace7efcSopenharmony_ci}
470eace7efcSopenharmony_ci
471eace7efcSopenharmony_cistd::string AppfreezeManager::CatcherStacktrace(int pid) const
472eace7efcSopenharmony_ci{
473eace7efcSopenharmony_ci    HITRACE_METER_FMT(HITRACE_TAG_APP, "CatcherStacktrace pid:%d", pid);
474eace7efcSopenharmony_ci    HiviewDFX::DfxDumpCatcher dumplog;
475eace7efcSopenharmony_ci    std::string ret;
476eace7efcSopenharmony_ci    std::string msg;
477eace7efcSopenharmony_ci    if (dumplog.DumpCatchProcess(pid, msg) == -1) {
478eace7efcSopenharmony_ci        ret = "Failed to dump stacktrace for " + std::to_string(pid) + "\n" + msg;
479eace7efcSopenharmony_ci    } else {
480eace7efcSopenharmony_ci        ret = msg;
481eace7efcSopenharmony_ci    }
482eace7efcSopenharmony_ci    return ret;
483eace7efcSopenharmony_ci}
484eace7efcSopenharmony_ci
485eace7efcSopenharmony_cibool AppfreezeManager::IsProcessDebug(int32_t pid, std::string bundleName)
486eace7efcSopenharmony_ci{
487eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeFilterMutex_);
488eace7efcSopenharmony_ci    auto it = appfreezeFilterMap_.find(bundleName);
489eace7efcSopenharmony_ci    if (it != appfreezeFilterMap_.end() && it->second.pid == pid) {
490eace7efcSopenharmony_ci        if (it->second.state == AppFreezeState::APPFREEZE_STATE_CANCELED) {
491eace7efcSopenharmony_ci            TAG_LOGI(AAFwkTag::APPDFR, "filtration only once");
492eace7efcSopenharmony_ci            return false;
493eace7efcSopenharmony_ci        } else {
494eace7efcSopenharmony_ci            TAG_LOGI(AAFwkTag::APPDFR, "filtration %{public}s", bundleName.c_str());
495eace7efcSopenharmony_ci            return true;
496eace7efcSopenharmony_ci        }
497eace7efcSopenharmony_ci    }
498eace7efcSopenharmony_ci
499eace7efcSopenharmony_ci    const int buffSize = 128;
500eace7efcSopenharmony_ci    char paramBundle[buffSize] = {0};
501eace7efcSopenharmony_ci    GetParameter("hiviewdfx.appfreeze.filter_bundle_name", "", paramBundle, buffSize - 1);
502eace7efcSopenharmony_ci    std::string debugBundle(paramBundle);
503eace7efcSopenharmony_ci
504eace7efcSopenharmony_ci    if (bundleName.compare(debugBundle) == 0) {
505eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "filtration %{public}s_%{public}s not exit",
506eace7efcSopenharmony_ci            debugBundle.c_str(), bundleName.c_str());
507eace7efcSopenharmony_ci        return true;
508eace7efcSopenharmony_ci    }
509eace7efcSopenharmony_ci    return false;
510eace7efcSopenharmony_ci}
511eace7efcSopenharmony_ci
512eace7efcSopenharmony_ciint64_t AppfreezeManager::GetFreezeCurrentTime()
513eace7efcSopenharmony_ci{
514eace7efcSopenharmony_ci    struct timespec t;
515eace7efcSopenharmony_ci    t.tv_sec = 0;
516eace7efcSopenharmony_ci    t.tv_nsec = 0;
517eace7efcSopenharmony_ci    clock_gettime(CLOCK_MONOTONIC, &t);
518eace7efcSopenharmony_ci    return static_cast<int64_t>(((t.tv_sec) * NANOSECONDS + t.tv_nsec) / MICROSECONDS);
519eace7efcSopenharmony_ci}
520eace7efcSopenharmony_ci
521eace7efcSopenharmony_civoid AppfreezeManager::SetFreezeState(int32_t pid, int state)
522eace7efcSopenharmony_ci{
523eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeMutex_);
524eace7efcSopenharmony_ci    if (appfreezeInfo_.find(pid) != appfreezeInfo_.end()) {
525eace7efcSopenharmony_ci        appfreezeInfo_[pid].state = state;
526eace7efcSopenharmony_ci        appfreezeInfo_[pid].occurTime = GetFreezeCurrentTime();
527eace7efcSopenharmony_ci    } else {
528eace7efcSopenharmony_ci        AppFreezeInfo info;
529eace7efcSopenharmony_ci        info.pid = pid;
530eace7efcSopenharmony_ci        info.state = state;
531eace7efcSopenharmony_ci        info.occurTime = GetFreezeCurrentTime();
532eace7efcSopenharmony_ci        appfreezeInfo_.emplace(pid, info);
533eace7efcSopenharmony_ci    }
534eace7efcSopenharmony_ci}
535eace7efcSopenharmony_ci
536eace7efcSopenharmony_ciint AppfreezeManager::GetFreezeState(int32_t pid)
537eace7efcSopenharmony_ci{
538eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeMutex_);
539eace7efcSopenharmony_ci    auto it = appfreezeInfo_.find(pid);
540eace7efcSopenharmony_ci    if (it != appfreezeInfo_.end()) {
541eace7efcSopenharmony_ci        return it->second.state;
542eace7efcSopenharmony_ci    }
543eace7efcSopenharmony_ci    return AppFreezeState::APPFREEZE_STATE_IDLE;
544eace7efcSopenharmony_ci}
545eace7efcSopenharmony_ci
546eace7efcSopenharmony_ciint64_t AppfreezeManager::GetFreezeTime(int32_t pid)
547eace7efcSopenharmony_ci{
548eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeMutex_);
549eace7efcSopenharmony_ci    auto it = appfreezeInfo_.find(pid);
550eace7efcSopenharmony_ci    if (it != appfreezeInfo_.end()) {
551eace7efcSopenharmony_ci        return it->second.occurTime;
552eace7efcSopenharmony_ci    }
553eace7efcSopenharmony_ci    return 0;
554eace7efcSopenharmony_ci}
555eace7efcSopenharmony_ci
556eace7efcSopenharmony_civoid AppfreezeManager::ClearOldInfo()
557eace7efcSopenharmony_ci{
558eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeMutex_);
559eace7efcSopenharmony_ci    int64_t currentTime = GetFreezeCurrentTime();
560eace7efcSopenharmony_ci    for (auto it = appfreezeInfo_.begin(); it != appfreezeInfo_.end();) {
561eace7efcSopenharmony_ci        auto diff = currentTime - it->second.occurTime;
562eace7efcSopenharmony_ci        if (diff > FREEZE_TIME_LIMIT) {
563eace7efcSopenharmony_ci            it = appfreezeInfo_.erase(it);
564eace7efcSopenharmony_ci        } else {
565eace7efcSopenharmony_ci            ++it;
566eace7efcSopenharmony_ci        }
567eace7efcSopenharmony_ci    }
568eace7efcSopenharmony_ci}
569eace7efcSopenharmony_ci
570eace7efcSopenharmony_cibool AppfreezeManager::IsNeedIgnoreFreezeEvent(int32_t pid)
571eace7efcSopenharmony_ci{
572eace7efcSopenharmony_ci    if (appfreezeInfo_.size() >= FREEZEMAP_SIZE_MAX) {
573eace7efcSopenharmony_ci        ClearOldInfo();
574eace7efcSopenharmony_ci    }
575eace7efcSopenharmony_ci    int state = GetFreezeState(pid);
576eace7efcSopenharmony_ci    int64_t currentTime = GetFreezeCurrentTime();
577eace7efcSopenharmony_ci    int64_t lastTime = GetFreezeTime(pid);
578eace7efcSopenharmony_ci    auto diff = currentTime - lastTime;
579eace7efcSopenharmony_ci    if (state == AppFreezeState::APPFREEZE_STATE_FREEZE) {
580eace7efcSopenharmony_ci        if (diff >= FREEZE_TIME_LIMIT) {
581eace7efcSopenharmony_ci            TAG_LOGI(AAFwkTag::APPDFR, "durationTime: "
582eace7efcSopenharmony_ci                "%{public}" PRId64 "state: %{public}d", diff, state);
583eace7efcSopenharmony_ci            return false;
584eace7efcSopenharmony_ci        }
585eace7efcSopenharmony_ci        return true;
586eace7efcSopenharmony_ci    } else {
587eace7efcSopenharmony_ci        if (currentTime > FREEZE_TIME_LIMIT && diff < FREEZE_TIME_LIMIT) {
588eace7efcSopenharmony_ci            return true;
589eace7efcSopenharmony_ci        }
590eace7efcSopenharmony_ci        SetFreezeState(pid, AppFreezeState::APPFREEZE_STATE_FREEZE);
591eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "durationTime: "
592eace7efcSopenharmony_ci            "%{public}" PRId64 " SetFreezeState: %{public}d", diff, state);
593eace7efcSopenharmony_ci        return false;
594eace7efcSopenharmony_ci    }
595eace7efcSopenharmony_ci}
596eace7efcSopenharmony_ci
597eace7efcSopenharmony_cibool AppfreezeManager::CancelAppFreezeDetect(int32_t pid, const std::string& bundleName)
598eace7efcSopenharmony_ci{
599eace7efcSopenharmony_ci    if (bundleName.empty()) {
600eace7efcSopenharmony_ci        TAG_LOGE(AAFwkTag::APPDFR, "SetAppFreezeFilter bundleName is empty.");
601eace7efcSopenharmony_ci        return false;
602eace7efcSopenharmony_ci    }
603eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeFilterMutex_);
604eace7efcSopenharmony_ci    AppFreezeInfo info;
605eace7efcSopenharmony_ci    info.pid = pid;
606eace7efcSopenharmony_ci    info.state = AppFreezeState::APPFREEZE_STATE_CANCELING;
607eace7efcSopenharmony_ci    appfreezeFilterMap_.emplace(bundleName, info);
608eace7efcSopenharmony_ci    return true;
609eace7efcSopenharmony_ci}
610eace7efcSopenharmony_ci
611eace7efcSopenharmony_civoid AppfreezeManager::RemoveDeathProcess(std::string bundleName)
612eace7efcSopenharmony_ci{
613eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeFilterMutex_);
614eace7efcSopenharmony_ci    auto it = appfreezeFilterMap_.find(bundleName);
615eace7efcSopenharmony_ci    if (it != appfreezeFilterMap_.end()) {
616eace7efcSopenharmony_ci        TAG_LOGI(AAFwkTag::APPDFR, "Remove bundleName: %{public}s", bundleName.c_str());
617eace7efcSopenharmony_ci        appfreezeFilterMap_.erase(it);
618eace7efcSopenharmony_ci    }
619eace7efcSopenharmony_ci}
620eace7efcSopenharmony_ci
621eace7efcSopenharmony_civoid AppfreezeManager::ResetAppfreezeState(int32_t pid, const std::string& bundleName)
622eace7efcSopenharmony_ci{
623eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeFilterMutex_);
624eace7efcSopenharmony_ci    if (appfreezeFilterMap_.find(bundleName) != appfreezeFilterMap_.end()) {
625eace7efcSopenharmony_ci        TAG_LOGD(AAFwkTag::APPDFR, "bundleName: %{public}s",
626eace7efcSopenharmony_ci            bundleName.c_str());
627eace7efcSopenharmony_ci        appfreezeFilterMap_[bundleName].state = AppFreezeState::APPFREEZE_STATE_CANCELED;
628eace7efcSopenharmony_ci    }
629eace7efcSopenharmony_ci}
630eace7efcSopenharmony_ci
631eace7efcSopenharmony_cibool AppfreezeManager::IsValidFreezeFilter(int32_t pid, const std::string& bundleName)
632eace7efcSopenharmony_ci{
633eace7efcSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(freezeFilterMutex_);
634eace7efcSopenharmony_ci    if (appfreezeFilterMap_.find(bundleName) != appfreezeFilterMap_.end()) {
635eace7efcSopenharmony_ci        return false;
636eace7efcSopenharmony_ci    }
637eace7efcSopenharmony_ci    return true;
638eace7efcSopenharmony_ci}
639eace7efcSopenharmony_ci}  // namespace AAFwk
640eace7efcSopenharmony_ci}  // namespace OHOS