1eace7efcSopenharmony_ci/* 2eace7efcSopenharmony_ci * Copyright (c) 2023 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 16eace7efcSopenharmony_ci#ifndef OHOS_ABILITY_RUNTIME_APPFREEZE_MAMAGER_H 17eace7efcSopenharmony_ci#define OHOS_ABILITY_RUNTIME_APPFREEZE_MAMAGER_H 18eace7efcSopenharmony_ci 19eace7efcSopenharmony_ci#include <sys/types.h> 20eace7efcSopenharmony_ci 21eace7efcSopenharmony_ci#include <fstream> 22eace7efcSopenharmony_ci#include <map> 23eace7efcSopenharmony_ci#include <memory> 24eace7efcSopenharmony_ci#include <set> 25eace7efcSopenharmony_ci#include <string> 26eace7efcSopenharmony_ci#include <vector> 27eace7efcSopenharmony_ci 28eace7efcSopenharmony_ci#include "cpp/mutex.h" 29eace7efcSopenharmony_ci#include "cpp/condition_variable.h" 30eace7efcSopenharmony_ci#include "fault_data.h" 31eace7efcSopenharmony_ci#include "freeze_util.h" 32eace7efcSopenharmony_ci 33eace7efcSopenharmony_cinamespace OHOS { 34eace7efcSopenharmony_ciusing AbilityRuntime::FreezeUtil; 35eace7efcSopenharmony_cinamespace AppExecFwk { 36eace7efcSopenharmony_ciclass AppfreezeManager : public std::enable_shared_from_this<AppfreezeManager> { 37eace7efcSopenharmony_cipublic: 38eace7efcSopenharmony_ci struct AppInfo { 39eace7efcSopenharmony_ci int pid; 40eace7efcSopenharmony_ci int uid; 41eace7efcSopenharmony_ci std::string bundleName; 42eace7efcSopenharmony_ci std::string processName; 43eace7efcSopenharmony_ci }; 44eace7efcSopenharmony_ci 45eace7efcSopenharmony_ci enum TypeAttribute { 46eace7efcSopenharmony_ci NORMAL_TIMEOUT = 0, 47eace7efcSopenharmony_ci CRITICAL_TIMEOUT = 1, 48eace7efcSopenharmony_ci }; 49eace7efcSopenharmony_ci 50eace7efcSopenharmony_ci enum AppFreezeState { 51eace7efcSopenharmony_ci APPFREEZE_STATE_IDLE = 0, 52eace7efcSopenharmony_ci APPFREEZE_STATE_FREEZE = 1, 53eace7efcSopenharmony_ci APPFREEZE_STATE_CANCELING = 2, 54eace7efcSopenharmony_ci APPFREEZE_STATE_CANCELED = 3, 55eace7efcSopenharmony_ci }; 56eace7efcSopenharmony_ci 57eace7efcSopenharmony_ci struct AppFreezeInfo { 58eace7efcSopenharmony_ci int32_t pid = 0; 59eace7efcSopenharmony_ci int state = 0; 60eace7efcSopenharmony_ci int64_t occurTime = 0; 61eace7efcSopenharmony_ci }; 62eace7efcSopenharmony_ci 63eace7efcSopenharmony_ci struct ParamInfo { 64eace7efcSopenharmony_ci int typeId = TypeAttribute::NORMAL_TIMEOUT; 65eace7efcSopenharmony_ci int32_t pid = 0; 66eace7efcSopenharmony_ci std::string eventName; 67eace7efcSopenharmony_ci std::string bundleName; 68eace7efcSopenharmony_ci std::string msg; 69eace7efcSopenharmony_ci }; 70eace7efcSopenharmony_ci 71eace7efcSopenharmony_ci AppfreezeManager(); 72eace7efcSopenharmony_ci ~AppfreezeManager(); 73eace7efcSopenharmony_ci 74eace7efcSopenharmony_ci static std::shared_ptr<AppfreezeManager> GetInstance(); 75eace7efcSopenharmony_ci static void DestroyInstance(); 76eace7efcSopenharmony_ci int AppfreezeHandle(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo); 77eace7efcSopenharmony_ci int AppfreezeHandleWithStack(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo); 78eace7efcSopenharmony_ci int LifecycleTimeoutHandle(const ParamInfo& info, FreezeUtil::LifecycleFlow flow = FreezeUtil::LifecycleFlow()); 79eace7efcSopenharmony_ci std::string WriteToFile(const std::string& fileName, std::string& content); 80eace7efcSopenharmony_ci bool IsHandleAppfreeze(const std::string& bundleName); 81eace7efcSopenharmony_ci bool IsProcessDebug(int32_t pid, std::string bundleName); 82eace7efcSopenharmony_ci bool IsNeedIgnoreFreezeEvent(int32_t pid); 83eace7efcSopenharmony_ci void DeleteStack(int pid); 84eace7efcSopenharmony_ci bool CancelAppFreezeDetect(int32_t pid, const std::string& bundleName); 85eace7efcSopenharmony_ci void RemoveDeathProcess(std::string bundleName); 86eace7efcSopenharmony_ci void ResetAppfreezeState(int32_t pid, const std::string& bundleName); 87eace7efcSopenharmony_ci bool IsValidFreezeFilter(int32_t pid, const std::string& bundleName); 88eace7efcSopenharmony_ci 89eace7efcSopenharmony_ciprivate: 90eace7efcSopenharmony_ci AppfreezeManager& operator=(const AppfreezeManager&) = delete; 91eace7efcSopenharmony_ci AppfreezeManager(const AppfreezeManager&) = delete; 92eace7efcSopenharmony_ci uint64_t GetMilliseconds(); 93eace7efcSopenharmony_ci std::map<int, std::set<int>> BinderParser(std::ifstream& fin, std::string& stack) const; 94eace7efcSopenharmony_ci void ParseBinderPids(const std::map<int, std::set<int>>& binderInfo, std::set<int>& pids, int pid, int layer) const; 95eace7efcSopenharmony_ci std::set<int> GetBinderPeerPids(std::string& stack, int pid) const; 96eace7efcSopenharmony_ci void FindStackByPid(std::string& ret, int pid) const; 97eace7efcSopenharmony_ci std::string CatchJsonStacktrace(int pid, const std::string& faultType) const; 98eace7efcSopenharmony_ci std::string CatcherStacktrace(int pid) const; 99eace7efcSopenharmony_ci int AcquireStack(const FaultData& faultData, const AppInfo& appInfo, const std::string& memoryContent); 100eace7efcSopenharmony_ci int NotifyANR(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo, 101eace7efcSopenharmony_ci const std::string& binderInfo, const std::string& memoryContent); 102eace7efcSopenharmony_ci int64_t GetFreezeCurrentTime(); 103eace7efcSopenharmony_ci void SetFreezeState(int32_t pid, int state); 104eace7efcSopenharmony_ci int GetFreezeState(int32_t pid); 105eace7efcSopenharmony_ci int64_t GetFreezeTime(int32_t pid); 106eace7efcSopenharmony_ci void ClearOldInfo(); 107eace7efcSopenharmony_ci void CollectFreezeSysMemory(std::string& memoryContent); 108eace7efcSopenharmony_ci 109eace7efcSopenharmony_ci static const inline std::string LOGGER_DEBUG_PROC_PATH = "/proc/transaction_proc"; 110eace7efcSopenharmony_ci std::string name_; 111eace7efcSopenharmony_ci static ffrt::mutex singletonMutex_; 112eace7efcSopenharmony_ci static std::shared_ptr<AppfreezeManager> instance_; 113eace7efcSopenharmony_ci static ffrt::mutex freezeMutex_; 114eace7efcSopenharmony_ci std::map<int32_t, AppFreezeInfo> appfreezeInfo_; 115eace7efcSopenharmony_ci static ffrt::mutex catchStackMutex_; 116eace7efcSopenharmony_ci static std::map<int, std::string> catchStackMap_; 117eace7efcSopenharmony_ci static ffrt::mutex freezeFilterMutex_; 118eace7efcSopenharmony_ci std::map<std::string, AppFreezeInfo> appfreezeFilterMap_; 119eace7efcSopenharmony_ci}; 120eace7efcSopenharmony_ci} // namespace AppExecFwk 121eace7efcSopenharmony_ci} // namespace OHOS 122eace7efcSopenharmony_ci#endif // OHOS_ABILITY_RUNTIME_APPFREEZE_MAMAGER_H