1 /*
2 * Copyright (c) 2023 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_exit_reason_data_manager.h"
17
18 #include <algorithm>
19 #include <chrono>
20 #include <unistd.h>
21
22 #include "errors.h"
23 #include "hilog_wrapper.h"
24 #include "nlohmann/json.hpp"
25
26 namespace OHOS {
27 namespace AbilityRuntime {
28 namespace {
29 constexpr int32_t CHECK_INTERVAL = 100000; // 100ms
30 constexpr int32_t MAX_TIMES = 5; // 5 * 100ms = 500ms
31 constexpr const char *APP_EXIT_REASON_STORAGE_DIR = "/data/service/el1/public/database/app_exit_reason";
32 const std::string JSON_KEY_REASON = "reason";
33 const std::string JSON_KEY_TIME_STAMP = "time_stamp";
34 const std::string JSON_KEY_ABILITY_LIST = "ability_list";
35 const std::string KEY_RECOVER_INFO_PREFIX = "recover_info";
36 const std::string JSON_KEY_RECOVER_INFO_LIST = "recover_info_list";
37 const std::string JSON_KEY_SESSION_ID_LIST = "session_id_list";
38 } // namespace
AppExitReasonDataManager()39 AppExitReasonDataManager::AppExitReasonDataManager() {}
40
~AppExitReasonDataManager()41 AppExitReasonDataManager::~AppExitReasonDataManager()
42 {
43 if (kvStorePtr_ != nullptr) {
44 dataManager_.CloseKvStore(appId_, kvStorePtr_);
45 }
46 }
47
GetKvStore()48 DistributedKv::Status AppExitReasonDataManager::GetKvStore()
49 {
50 DistributedKv::Options options = { .createIfMissing = true,
51 .encrypt = false,
52 .autoSync = true,
53 .syncable = false,
54 .area = DistributedKv::EL1,
55 .kvStoreType = DistributedKv::KvStoreType::SINGLE_VERSION,
56 .baseDir = APP_EXIT_REASON_STORAGE_DIR };
57
58 DistributedKv::Status status = dataManager_.GetSingleKvStore(options, appId_, storeId_, kvStorePtr_);
59 if (status != DistributedKv::Status::SUCCESS) {
60 HILOG_ERROR("return error: %{public}d", status);
61 } else {
62 HILOG_INFO("get kvStore success");
63 }
64 return status;
65 }
66
CheckKvStore()67 bool AppExitReasonDataManager::CheckKvStore()
68 {
69 if (kvStorePtr_ != nullptr) {
70 return true;
71 }
72 int32_t tryTimes = MAX_TIMES;
73 while (tryTimes > 0) {
74 DistributedKv::Status status = GetKvStore();
75 if (status == DistributedKv::Status::SUCCESS && kvStorePtr_ != nullptr) {
76 return true;
77 }
78 HILOG_DEBUG("try times: %{public}d", tryTimes);
79 usleep(CHECK_INTERVAL);
80 tryTimes--;
81 }
82 return kvStorePtr_ != nullptr;
83 }
84
SetAppExitReason(const std::string & bundleName,const std::vector<std::string> & abilityList,const AAFwk::Reason & reason)85 int32_t AppExitReasonDataManager::SetAppExitReason(
86 const std::string &bundleName, const std::vector<std::string> &abilityList, const AAFwk::Reason &reason)
87 {
88 if (bundleName.empty()) {
89 HILOG_WARN("invalid value!");
90 return ERR_INVALID_VALUE;
91 }
92
93 HILOG_DEBUG("bundleName: %{public}s", bundleName.c_str());
94 {
95 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
96 if (!CheckKvStore()) {
97 HILOG_ERROR("kvStore is nullptr");
98 return ERR_NO_INIT;
99 }
100 }
101
102 DistributedKv::Key key(bundleName);
103 DistributedKv::Value value = ConvertAppExitReasonInfoToValue(abilityList, reason);
104 DistributedKv::Status status;
105 {
106 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
107 status = kvStorePtr_->Put(key, value);
108 }
109
110 if (status != DistributedKv::Status::SUCCESS) {
111 HILOG_ERROR("insert data to kvStore error: %{public}d", status);
112 return ERR_INVALID_OPERATION;
113 }
114 return ERR_OK;
115 }
116
DeleteAppExitReason(const std::string & bundleName)117 int32_t AppExitReasonDataManager::DeleteAppExitReason(const std::string &bundleName)
118 {
119 if (bundleName.empty()) {
120 HILOG_WARN("invalid value!");
121 return ERR_INVALID_VALUE;
122 }
123
124 HILOG_DEBUG("bundleName: %{public}s", bundleName.c_str());
125 {
126 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
127 if (!CheckKvStore()) {
128 HILOG_ERROR("kvStore is nullptr");
129 return ERR_NO_INIT;
130 }
131 }
132
133 DistributedKv::Key key(bundleName);
134 DistributedKv::Status status;
135 {
136 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
137 status = kvStorePtr_->Delete(key);
138 }
139
140 if (status != DistributedKv::Status::SUCCESS) {
141 HILOG_ERROR("delete data from kvStore error: %{public}d", status);
142 return ERR_INVALID_OPERATION;
143 }
144 return ERR_OK;
145 }
146
GetAppExitReason(const std::string & bundleName,const std::string & abilityName,bool & isSetReason,AAFwk::Reason & reason)147 int32_t AppExitReasonDataManager::GetAppExitReason(
148 const std::string &bundleName, const std::string &abilityName, bool &isSetReason, AAFwk::Reason &reason)
149 {
150 if (bundleName.empty()) {
151 HILOG_WARN("invalid value!");
152 return ERR_INVALID_VALUE;
153 }
154
155 HILOG_DEBUG("bundleName: %{public}s", bundleName.c_str());
156 {
157 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
158 if (!CheckKvStore()) {
159 HILOG_ERROR("kvStore is nullptr");
160 return ERR_NO_INIT;
161 }
162 }
163
164 std::vector<DistributedKv::Entry> allEntries;
165 DistributedKv::Status status = kvStorePtr_->GetEntries(nullptr, allEntries);
166 if (status != DistributedKv::Status::SUCCESS) {
167 HILOG_ERROR("get entries error: %{public}d", status);
168 return ERR_INVALID_VALUE;
169 }
170
171 std::vector<std::string> abilityList;
172 int64_t time_stamp;
173 isSetReason = false;
174 for (const auto &item : allEntries) {
175 if (item.key.ToString() == bundleName) {
176 ConvertAppExitReasonInfoFromValue(item.value, reason, time_stamp, abilityList);
177 auto pos = std::find(abilityList.begin(), abilityList.end(), abilityName);
178 if (pos != abilityList.end()) {
179 isSetReason = true;
180 abilityList.erase(std::remove(abilityList.begin(), abilityList.end(), abilityName), abilityList.end());
181 UpdateAppExitReason(bundleName, abilityList, reason);
182 }
183 HILOG_INFO(
184 "current bundle name: %{public}s reason: %{public}d abilityName:%{public}s isSetReason:%{public}d",
185 item.key.ToString().c_str(), reason, abilityName.c_str(), isSetReason);
186 if (abilityList.empty()) {
187 InnerDeleteAppExitReason(bundleName);
188 }
189 break;
190 }
191 }
192
193 return ERR_OK;
194 }
195
UpdateAppExitReason(const std::string & bundleName,const std::vector<std::string> & abilityList,const AAFwk::Reason & reason)196 void AppExitReasonDataManager::UpdateAppExitReason(
197 const std::string &bundleName, const std::vector<std::string> &abilityList, const AAFwk::Reason &reason)
198 {
199 if (kvStorePtr_ == nullptr) {
200 HILOG_ERROR("kvStore is nullptr");
201 return;
202 }
203
204 DistributedKv::Key key(bundleName);
205 DistributedKv::Status status;
206 {
207 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
208 status = kvStorePtr_->Delete(key);
209 }
210 if (status != DistributedKv::Status::SUCCESS) {
211 HILOG_ERROR("delete data from kvStore error: %{public}d", status);
212 return;
213 }
214
215 DistributedKv::Value value = ConvertAppExitReasonInfoToValue(abilityList, reason);
216 {
217 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
218 status = kvStorePtr_->Put(key, value);
219 }
220 if (status != DistributedKv::Status::SUCCESS) {
221 HILOG_ERROR("insert data to kvStore error: %{public}d", status);
222 }
223 }
224
ConvertAppExitReasonInfoToValue(const std::vector<std::string> & abilityList,const AAFwk::Reason & reason)225 DistributedKv::Value AppExitReasonDataManager::ConvertAppExitReasonInfoToValue(
226 const std::vector<std::string> &abilityList, const AAFwk::Reason &reason)
227 {
228 std::chrono::milliseconds nowMs =
229 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
230 nlohmann::json jsonObject = nlohmann::json {
231 { JSON_KEY_REASON, reason },
232 { JSON_KEY_TIME_STAMP, nowMs.count() },
233 { JSON_KEY_ABILITY_LIST, abilityList },
234 };
235 DistributedKv::Value value(jsonObject.dump());
236 HILOG_INFO("value: %{public}s", value.ToString().c_str());
237 return value;
238 }
239
ConvertAppExitReasonInfoFromValue(const DistributedKv::Value & value,AAFwk::Reason & reason,int64_t & time_stamp,std::vector<std::string> & abilityList)240 void AppExitReasonDataManager::ConvertAppExitReasonInfoFromValue(const DistributedKv::Value &value,
241 AAFwk::Reason &reason, int64_t &time_stamp, std::vector<std::string> &abilityList)
242 {
243 nlohmann::json jsonObject = nlohmann::json::parse(value.ToString(), nullptr, false);
244 if (jsonObject.is_discarded()) {
245 HILOG_ERROR("failed to parse json sting.");
246 return;
247 }
248 if (jsonObject.contains(JSON_KEY_REASON) && jsonObject[JSON_KEY_REASON].is_number_integer()) {
249 reason = jsonObject.at(JSON_KEY_REASON).get<AAFwk::Reason>();
250 }
251 if (jsonObject.contains(JSON_KEY_TIME_STAMP) && jsonObject[JSON_KEY_TIME_STAMP].is_number_integer()) {
252 time_stamp = jsonObject.at(JSON_KEY_TIME_STAMP).get<int64_t>();
253 }
254 if (jsonObject.contains(JSON_KEY_ABILITY_LIST) && jsonObject[JSON_KEY_ABILITY_LIST].is_array()) {
255 abilityList.clear();
256 auto size = jsonObject[JSON_KEY_ABILITY_LIST].size();
257 for (size_t i = 0; i < size; i++) {
258 if (jsonObject[JSON_KEY_ABILITY_LIST][i].is_string()) {
259 abilityList.emplace_back(jsonObject[JSON_KEY_ABILITY_LIST][i]);
260 }
261 }
262 }
263 }
264
InnerDeleteAppExitReason(const std::string & bundleName)265 void AppExitReasonDataManager::InnerDeleteAppExitReason(const std::string &bundleName)
266 {
267 if (kvStorePtr_ == nullptr) {
268 HILOG_ERROR("kvStore is nullptr");
269 return;
270 }
271
272 DistributedKv::Key key(bundleName);
273 DistributedKv::Status status;
274 {
275 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
276 status = kvStorePtr_->Delete(key);
277 }
278
279 if (status != DistributedKv::Status::SUCCESS) {
280 HILOG_ERROR("delete data from kvStore error: %{public}d", status);
281 }
282 }
283
AddAbilityRecoverInfo(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,const int & sessionId)284 int32_t AppExitReasonDataManager::AddAbilityRecoverInfo(const std::string &bundleName,
285 const std::string &moduleName, const std::string &abilityName, const int &sessionId)
286 {
287 HILOG_INFO("AddAbilityRecoverInfo bundle %{public}s module %{public}s ability %{public}s id %{public}d ",
288 bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), sessionId);
289 {
290 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
291 if (!CheckKvStore()) {
292 HILOG_ERROR("kvStore is nullptr");
293 return ERR_NO_INIT;
294 }
295 }
296
297 DistributedKv::Key key(KEY_RECOVER_INFO_PREFIX + bundleName);
298 DistributedKv::Value value;
299 DistributedKv::Status status = kvStorePtr_->Get(key, value);
300 if (status != DistributedKv::Status::SUCCESS && status != DistributedKv::Status::KEY_NOT_FOUND) {
301 HILOG_ERROR("AddAbilityRecoverInfo get error: %{public}d", status);
302 return ERR_INVALID_VALUE;
303 }
304
305 std::vector<std::string> recoverInfoList;
306 std::vector<int> sessionIdList;
307 std::string recoverInfo = moduleName + abilityName;
308 if (status == DistributedKv::Status::SUCCESS) {
309 ConvertAbilityRecoverInfoFromValue(value, recoverInfoList, sessionIdList);
310 auto pos = std::find(recoverInfoList.begin(), recoverInfoList.end(), recoverInfo);
311 if (pos != recoverInfoList.end()) {
312 HILOG_WARN("AddAbilityRecoverInfo recoverInfo already record");
313 int index = std::distance(recoverInfoList.begin(), pos);
314 sessionIdList[index] = sessionId;
315 return ERR_OK;
316 }
317 }
318
319 recoverInfoList.emplace_back(recoverInfo);
320 sessionIdList.emplace_back(sessionId);
321 value = ConvertAbilityRecoverInfoToValue(recoverInfoList, sessionIdList);
322 {
323 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
324 status = kvStorePtr_->Put(key, value);
325 }
326
327 if (status != DistributedKv::Status::SUCCESS) {
328 HILOG_ERROR("insert data to kvStore error : %{public}d", status);
329 return ERR_INVALID_OPERATION;
330 }
331
332 HILOG_INFO("AddAbilityRecoverInfo finish");
333 return ERR_OK;
334 }
335
DeleteAbilityRecoverInfo(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName)336 int32_t AppExitReasonDataManager::DeleteAbilityRecoverInfo(
337 const std::string &bundleName, const std::string &moduleName, const std::string &abilityName)
338 {
339 HILOG_INFO("DeleteAbilityRecoverInfo bundle %{public}s module %{public}s ability %{public}s ",
340 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
341 {
342 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
343 if (!CheckKvStore()) {
344 HILOG_ERROR("kvStore is nullptr");
345 return ERR_NO_INIT;
346 }
347 }
348
349 DistributedKv::Key key(KEY_RECOVER_INFO_PREFIX + bundleName);
350 DistributedKv::Value value;
351 DistributedKv::Status status = kvStorePtr_->Get(key, value);
352 if (status != DistributedKv::Status::SUCCESS) {
353 HILOG_ERROR("DeleteAbilityRecoverInfo get error: %{public}d", status);
354 return ERR_INVALID_VALUE;
355 }
356
357 std::vector<std::string> recoverInfoList;
358 std::vector<int> sessionIdList;
359 std::string recoverInfo = moduleName + abilityName;
360 ConvertAbilityRecoverInfoFromValue(value, recoverInfoList, sessionIdList);
361 auto pos = std::find(recoverInfoList.begin(), recoverInfoList.end(), recoverInfo);
362 if (pos != recoverInfoList.end()) {
363 recoverInfoList.erase(std::remove(recoverInfoList.begin(), recoverInfoList.end(), recoverInfo),
364 recoverInfoList.end());
365 int index = std::distance(recoverInfoList.begin(), pos);
366 sessionIdList.erase(std::remove(sessionIdList.begin(), sessionIdList.end(), sessionIdList[index]),
367 sessionIdList.end());
368 UpdateAbilityRecoverInfo(bundleName, recoverInfoList, sessionIdList);
369 HILOG_INFO("DeleteAbilityRecoverInfo remove recoverInfo succeed");
370 }
371 if (recoverInfoList.empty()) {
372 InnerDeleteAbilityRecoverInfo(bundleName);
373 }
374
375 HILOG_INFO("DeleteAbilityRecoverInfo finished");
376 return ERR_OK;
377 }
378
GetAbilityRecoverInfo(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,bool & hasRecoverInfo)379 int32_t AppExitReasonDataManager::GetAbilityRecoverInfo(
380 const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, bool &hasRecoverInfo)
381 {
382 HILOG_INFO("GetAbilityRecoverInfo bundle %{public}s module %{public}s abillity %{public}s ",
383 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
384 hasRecoverInfo = false;
385 {
386 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
387 if (!CheckKvStore()) {
388 HILOG_ERROR("kvStore is nullptr");
389 return ERR_NO_INIT;
390 }
391 }
392
393 DistributedKv::Key key(KEY_RECOVER_INFO_PREFIX + bundleName);
394 DistributedKv::Value value;
395 DistributedKv::Status status = kvStorePtr_->Get(key, value);
396 if (status != DistributedKv::Status::SUCCESS) {
397 if (status == DistributedKv::Status::KEY_NOT_FOUND) {
398 HILOG_WARN("GetAbilityRecoverInfo KEY_NOT_FOUND");
399 } else {
400 HILOG_ERROR("GetAbilityRecoverInfo error: %{public}d", status);
401 }
402 return ERR_INVALID_VALUE;
403 }
404
405 std::vector<std::string> recoverInfoList;
406 std::vector<int> sessionIdList;
407 std::string recoverInfo = moduleName + abilityName;
408 ConvertAbilityRecoverInfoFromValue(value, recoverInfoList, sessionIdList);
409 auto pos = std::find(recoverInfoList.begin(), recoverInfoList.end(), recoverInfo);
410 if (pos != recoverInfoList.end()) {
411 hasRecoverInfo = true;
412 HILOG_INFO("GetAbilityRecoverInfo hasRecoverInfo found info");
413 }
414 return ERR_OK;
415 }
416
GetAbilitySessionId(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,int & sessionId)417 int32_t AppExitReasonDataManager::GetAbilitySessionId(const std::string &bundleName,
418 const std::string &moduleName, const std::string &abilityName, int &sessionId)
419 {
420 HILOG_INFO("GetAbilityRecoverInfo bundle %{public}s bundle %{public}s bundle %{public}s ",
421 bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
422 sessionId = 0;
423 {
424 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
425 if (!CheckKvStore()) {
426 HILOG_ERROR("kvStore is nullptr");
427 return ERR_NO_INIT;
428 }
429 }
430
431 DistributedKv::Key key(KEY_RECOVER_INFO_PREFIX + bundleName);
432 DistributedKv::Value value;
433 DistributedKv::Status status = kvStorePtr_->Get(key, value);
434 if (status != DistributedKv::Status::SUCCESS) {
435 if (status == DistributedKv::Status::KEY_NOT_FOUND) {
436 HILOG_WARN("GetAbilityRecoverInfo KEY_NOT_FOUND");
437 } else {
438 HILOG_ERROR("GetAbilityRecoverInfo error: %{public}d", status);
439 }
440 return ERR_INVALID_VALUE;
441 }
442
443 std::vector<std::string> recoverInfoList;
444 std::vector<int> sessionIdList;
445 std::string recoverInfo = moduleName + abilityName;
446 ConvertAbilityRecoverInfoFromValue(value, recoverInfoList, sessionIdList);
447 auto pos = std::find(recoverInfoList.begin(), recoverInfoList.end(), recoverInfo);
448 if (pos != recoverInfoList.end()) {
449 int index = std::distance(recoverInfoList.begin(), pos);
450 sessionId = sessionIdList[index];
451 HILOG_INFO("GetAbilityRecoverInfo sessionId found info %{public}d ", sessionId);
452 }
453 return ERR_OK;
454 }
455
UpdateAbilityRecoverInfo(const std::string & bundleName,const std::vector<std::string> & recoverInfoList,const std::vector<int> & sessionIdList)456 void AppExitReasonDataManager::UpdateAbilityRecoverInfo(const std::string &bundleName,
457 const std::vector<std::string> &recoverInfoList, const std::vector<int> &sessionIdList)
458 {
459 if (kvStorePtr_ == nullptr) {
460 HILOG_ERROR("kvStore is nullptr");
461 return;
462 }
463
464 DistributedKv::Key key(KEY_RECOVER_INFO_PREFIX + bundleName);
465 DistributedKv::Status status;
466 {
467 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
468 status = kvStorePtr_->Delete(key);
469 }
470 if (status != DistributedKv::Status::SUCCESS) {
471 HILOG_ERROR("delete data from kvStore error: %{public}d", status);
472 return;
473 }
474
475 DistributedKv::Value value = ConvertAbilityRecoverInfoToValue(recoverInfoList, sessionIdList);
476 {
477 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
478 status = kvStorePtr_->Put(key, value);
479 }
480 if (status != DistributedKv::Status::SUCCESS) {
481 HILOG_ERROR("insert data to kvStore error: %{public}d", status);
482 }
483 }
484
ConvertAbilityRecoverInfoToValue(const std::vector<std::string> & recoverInfoList,const std::vector<int> & sessionIdList)485 DistributedKv::Value AppExitReasonDataManager::ConvertAbilityRecoverInfoToValue(
486 const std::vector<std::string> &recoverInfoList, const std::vector<int> &sessionIdList)
487 {
488 nlohmann::json jsonObject = nlohmann::json {
489 { JSON_KEY_RECOVER_INFO_LIST, recoverInfoList },
490 { JSON_KEY_SESSION_ID_LIST, sessionIdList },
491 };
492 DistributedKv::Value value(jsonObject.dump());
493 HILOG_INFO("ConvertAbilityRecoverInfoToValue value: %{public}s", value.ToString().c_str());
494 return value;
495 }
496
ConvertAbilityRecoverInfoFromValue(const DistributedKv::Value & value,std::vector<std::string> & recoverInfoList,std::vector<int> & sessionIdList)497 void AppExitReasonDataManager::ConvertAbilityRecoverInfoFromValue(const DistributedKv::Value &value,
498 std::vector<std::string> &recoverInfoList, std::vector<int> &sessionIdList)
499 {
500 nlohmann::json jsonObject = nlohmann::json::parse(value.ToString(), nullptr, false);
501 if (jsonObject.is_discarded()) {
502 HILOG_ERROR("failed to parse json sting.");
503 return;
504 }
505 if (jsonObject.contains(JSON_KEY_RECOVER_INFO_LIST)
506 && jsonObject[JSON_KEY_RECOVER_INFO_LIST].is_array()) {
507 recoverInfoList.clear();
508 auto size = jsonObject[JSON_KEY_RECOVER_INFO_LIST].size();
509 for (size_t i = 0; i < size; i++) {
510 if (jsonObject[JSON_KEY_RECOVER_INFO_LIST][i].is_string()) {
511 recoverInfoList.emplace_back(jsonObject[JSON_KEY_RECOVER_INFO_LIST][i]);
512 }
513 }
514 }
515 if (jsonObject.contains(JSON_KEY_SESSION_ID_LIST)
516 && jsonObject[JSON_KEY_SESSION_ID_LIST].is_array()) {
517 sessionIdList.clear();
518 auto size = jsonObject[JSON_KEY_SESSION_ID_LIST].size();
519 for (size_t i = 0; i < size; i++) {
520 if (jsonObject[JSON_KEY_SESSION_ID_LIST][i].is_number_integer()) {
521 sessionIdList.emplace_back(jsonObject[JSON_KEY_SESSION_ID_LIST][i]);
522 }
523 }
524 }
525 }
526
InnerDeleteAbilityRecoverInfo(const std::string & bundleName)527 void AppExitReasonDataManager::InnerDeleteAbilityRecoverInfo(const std::string &bundleName)
528 {
529 if (kvStorePtr_ == nullptr) {
530 HILOG_ERROR("kvStore is nullptr");
531 return;
532 }
533
534 DistributedKv::Key key(KEY_RECOVER_INFO_PREFIX + bundleName);
535 DistributedKv::Status status;
536 {
537 std::lock_guard<std::mutex> lock(kvStorePtrMutex_);
538 status = kvStorePtr_->Delete(key);
539 }
540
541 if (status != DistributedKv::Status::SUCCESS) {
542 HILOG_ERROR("delete data from kvStore error: %{public}d", status);
543 }
544 }
545 } // namespace AbilityRuntime
546 } // namespace OHOS
547