• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "app_running_manager.h"
17 
18 #include "iremote_object.h"
19 #include "datetime_ex.h"
20 
21 #include "app_log_wrapper.h"
22 #include "perf_profile.h"
23 #include "appexecfwk_errors.h"
24 
25 namespace OHOS {
26 namespace AppExecFwk {
27 namespace {
CheckUid(const int32_t uid)28 bool CheckUid(const int32_t uid)
29 {
30     return uid >= 0 && uid < std::numeric_limits<int32_t>::max();
31 }
32 }  // namespace
33 
AppRunningManager()34 AppRunningManager::AppRunningManager()
35 {}
~AppRunningManager()36 AppRunningManager::~AppRunningManager()
37 {}
38 
GetOrCreateAppRunningRecord(const sptr<IRemoteObject> & token,const std::shared_ptr<ApplicationInfo> & appInfo,const std::shared_ptr<AbilityInfo> & abilityInfo,const std::string & processName,const int32_t uid,RecordQueryResult & result)39 std::shared_ptr<AppRunningRecord> AppRunningManager::GetOrCreateAppRunningRecord(const sptr<IRemoteObject> &token,
40     const std::shared_ptr<ApplicationInfo> &appInfo, const std::shared_ptr<AbilityInfo> &abilityInfo,
41     const std::string &processName, const int32_t uid, RecordQueryResult &result)
42 {
43     std::lock_guard<std::recursive_mutex> guard(lock_);
44     result.Reset();
45     if (!token || !appInfo || !abilityInfo) {
46         APP_LOGE("param error");
47         result.error = ERR_INVALID_VALUE;
48         return nullptr;
49     }
50     if (!CheckUid(uid)) {
51         APP_LOGE("uid invalid");
52         result.error = ERR_APPEXECFWK_INVALID_UID;
53         return nullptr;
54     }
55     if (processName.empty()) {
56         APP_LOGE("processName error");
57         result.error = ERR_INVALID_VALUE;
58         return nullptr;
59     }
60 
61     auto record = GetAppRunningRecordByProcessName(appInfo->name, processName);
62     if (!record) {
63         APP_LOGI("no app record, create");
64         auto recordId = AppRecordId::Create();
65         record = std::make_shared<AppRunningRecord>(appInfo, recordId, processName);
66         appRunningRecordMap_.emplace(recordId, record);
67     } else {
68         result.appExists = true;
69     }
70 
71     result.appRecordId = record->GetRecordId();
72     auto abilityRecord = record->GetAbilityRunningRecordByToken(token);
73     result.abilityExists = !!abilityRecord;
74     if (!abilityRecord) {
75         APP_LOGI("no ability record, create");
76         abilityRecord = record->AddAbility(token, abilityInfo);
77     }
78     return record;
79 }
80 
GetAppRunningRecordByAppName(const std::string & appName)81 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByAppName(const std::string &appName)
82 {
83     std::lock_guard<std::recursive_mutex> guard(lock_);
84     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&appName](const auto &pair) {
85         return pair.second->GetName() == appName;
86     });
87     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
88 }
89 
GetAppRunningRecordByProcessName(const std::string & appName,const std::string & processName)90 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByProcessName(
91     const std::string &appName, const std::string &processName)
92 {
93     std::lock_guard<std::recursive_mutex> guard(lock_);
94     auto iter = std::find_if(
95         appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&appName, &processName](const auto &pair) {
96             return ((pair.second->GetName() == appName) && (pair.second->GetProcessName() == processName) &&
97                     !(pair.second->IsTerminating()));
98         });
99     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
100 }
101 
GetAppRunningRecordByPid(const pid_t pid)102 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByPid(const pid_t pid)
103 {
104     std::lock_guard<std::recursive_mutex> guard(lock_);
105     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) {
106         return pair.second->GetPriorityObject()->GetPid() == pid;
107     });
108     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
109 }
110 
GetAppRunningRecordByAbilityToken(const sptr<IRemoteObject> & abilityToken)111 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecordByAbilityToken(
112     const sptr<IRemoteObject> &abilityToken)
113 {
114     std::lock_guard<std::recursive_mutex> guard(lock_);
115     for (const auto &item : appRunningRecordMap_) {
116         const auto &appRecord = item.second;
117         if (appRecord && appRecord->GetAbilityRunningRecordByToken(abilityToken)) {
118             return appRecord;
119         }
120     }
121     return nullptr;
122 }
123 
GetPidsByBundleName(const std::string & bundleName,std::list<pid_t> & pids)124 bool AppRunningManager::GetPidsByBundleName(const std::string &bundleName, std::list<pid_t> &pids)
125 {
126     std::lock_guard<std::recursive_mutex> guard(lock_);
127     for (const auto &item : appRunningRecordMap_) {
128         const auto &appRecord = item.second;
129         if (appRecord && appRecord->GetBundleName() == bundleName) {
130             pid_t pid = appRecord->GetPriorityObject()->GetPid();
131             if (pid > 0) {
132                 pids.push_back(pid);
133                 appRecord->ScheduleProcessSecurityExit();
134             }
135         }
136     }
137 
138     return (pids.empty() ? false : true);
139 }
140 
OnRemoteDied(const wptr<IRemoteObject> & remote)141 std::shared_ptr<AppRunningRecord> AppRunningManager::OnRemoteDied(const wptr<IRemoteObject> &remote)
142 {
143     std::lock_guard<std::recursive_mutex> guard(lock_);
144     if (remote == nullptr) {
145         APP_LOGE("remote is null");
146         return nullptr;
147     }
148     sptr<IRemoteObject> object = remote.promote();
149     if (!object) {
150         APP_LOGE("object is null");
151         return nullptr;
152     }
153     const auto &iter =
154         std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&object](const auto &pair) {
155             if (pair.second && pair.second->GetApplicationClient() != nullptr) {
156                 return pair.second->GetApplicationClient()->AsObject() == object;
157             }
158             return false;
159         });
160     if (iter != appRunningRecordMap_.end()) {
161         auto appRecord = iter->second;
162         appRunningRecordMap_.erase(iter);
163         if (appRecord) {
164             return appRecord;
165         }
166     }
167     return nullptr;
168 }
169 
GetAppRunningRecordMap()170 const std::map<const int32_t, const std::shared_ptr<AppRunningRecord>> &AppRunningManager::GetAppRunningRecordMap()
171 {
172     std::lock_guard<std::recursive_mutex> guard(lock_);
173     return appRunningRecordMap_;
174 }
175 
RemoveAppRunningRecordById(const int32_t recordId)176 void AppRunningManager::RemoveAppRunningRecordById(const int32_t recordId)
177 {
178     std::lock_guard<std::recursive_mutex> guard(lock_);
179     appRunningRecordMap_.erase(recordId);
180 }
181 
ClearAppRunningRecordMap()182 void AppRunningManager::ClearAppRunningRecordMap()
183 {
184     std::lock_guard<std::recursive_mutex> guard(lock_);
185     appRunningRecordMap_.clear();
186 }
187 
HandleTerminateTimeOut(int64_t eventId)188 void AppRunningManager::HandleTerminateTimeOut(int64_t eventId)
189 {
190     APP_LOGI("%{public}s, called", __func__);
191     auto abilityRecord = GetAbilityRunningRecord(eventId);
192     if (!abilityRecord) {
193         APP_LOGE("%{public}s, abilityRecord is nullptr", __func__);
194         return;
195     }
196     auto abilityToken = abilityRecord->GetToken();
197     auto appRecord = GetTerminatingAppRunningRecord(abilityToken);
198     if (!appRecord) {
199         APP_LOGE("%{public}s, appRecord is nullptr", __func__);
200         return;
201     }
202     appRecord->AbilityTerminated(abilityToken);
203     APP_LOGI("%{public}s, end", __func__);
204 }
205 
GetTerminatingAppRunningRecord(const sptr<IRemoteObject> & abilityToken)206 std::shared_ptr<AppRunningRecord> AppRunningManager::GetTerminatingAppRunningRecord(
207     const sptr<IRemoteObject> &abilityToken)
208 {
209     std::lock_guard<std::recursive_mutex> guard(lock_);
210     for (const auto &item : appRunningRecordMap_) {
211         const auto &appRecord = item.second;
212         if (appRecord && appRecord->GetAbilityByTerminateLists(abilityToken)) {
213             return appRecord;
214         }
215     }
216     return nullptr;
217 }
218 
GetAbilityRunningRecord(const int64_t eventId)219 std::shared_ptr<AbilityRunningRecord> AppRunningManager::GetAbilityRunningRecord(const int64_t eventId)
220 {
221     APP_LOGI("%{public}s, called", __func__);
222     std::lock_guard<std::recursive_mutex> guard(lock_);
223     for (auto &item : appRunningRecordMap_) {
224         if (item.second) {
225             auto abilityRecord = item.second->GetAbilityRunningRecord(eventId);
226             if (abilityRecord) {
227                 return abilityRecord;
228             }
229         }
230     }
231     return nullptr;
232 }
233 
GetAppRunningRecord(const int64_t eventId)234 std::shared_ptr<AppRunningRecord> AppRunningManager::GetAppRunningRecord(const int64_t eventId)
235 {
236     APP_LOGI("%{public}s, called", __func__);
237     std::lock_guard<std::recursive_mutex> guard(lock_);
238     auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&eventId](const auto &pair) {
239         return pair.second->GetEventId() == eventId;
240     });
241     return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second);
242 }
243 
HandleAbilityAttachTimeOut(const sptr<IRemoteObject> & token)244 void AppRunningManager::HandleAbilityAttachTimeOut(const sptr<IRemoteObject> &token)
245 {
246     APP_LOGI("%{public}s, called", __func__);
247     if (token == nullptr) {
248         APP_LOGE("%{public}s, token is nullptr", __func__);
249         return;
250     }
251 
252     auto appRecord = GetAppRunningRecordByAbilityToken(token);
253     if (!appRecord) {
254         APP_LOGE("%{public}s, appRecord is nullptr", __func__);
255         return;
256     }
257 
258     if (appRecord->IsLastAbilityRecord(token)) {
259         appRecord->SetTerminating();
260     }
261 
262     appRecord->TerminateAbility(token, true);
263 }
TerminateAbility(const sptr<IRemoteObject> & token)264 void AppRunningManager::TerminateAbility(const sptr<IRemoteObject> &token)
265 {
266     APP_LOGI("%{public}s, called", __func__);
267     if (!token) {
268         APP_LOGE("%{public}s, token is nullptr", __func__);
269         return;
270     }
271 
272     auto appRecord = GetAppRunningRecordByAbilityToken(token);
273     if (!appRecord) {
274         APP_LOGE("%{public}s, appRecord is nullptr", __func__);
275         return;
276     }
277 
278     if (appRecord->IsLastAbilityRecord(token)) {
279         appRecord->SetTerminating();
280     }
281 
282     appRecord->TerminateAbility(token, false);
283 }
284 }  // namespace AppExecFwk
285 }  // namespace OHOS