• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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