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