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