diff --git a/services/backup_sa/include/module_ipc/svc_session_manager.h b/services/backup_sa/include/module_ipc/svc_session_manager.h index 82308a60cf7cd5d2d0754b35682fc830b74910f6..1c0dc1d6cf0733f778a8bcc33ce71252d9f44de2 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -272,6 +272,14 @@ public: */ bool GetNeedToInstall(const std::string &bundleName); + /** + * @brief Whether to unload the service + * + * @return true + * @return false + */ + bool NeedToUnloadService(); + private: /** * @brief 获取backup extension ability diff --git a/services/backup_sa/include/module_sched/sched_scheduler.h b/services/backup_sa/include/module_sched/sched_scheduler.h index 63dfd299da453d3d17613482b8b0929d621651d6..cf9a086d18c64e040d0b6d76a0c66317e63e5b2e 100644 --- a/services/backup_sa/include/module_sched/sched_scheduler.h +++ b/services/backup_sa/include/module_sched/sched_scheduler.h @@ -65,6 +65,7 @@ public: void StartTimer() { extTime_.Setup(); + UnloadServiceTimer(); } public: @@ -90,6 +91,12 @@ private: */ void InstallingState(const std::string &bundleName); + /** + * @brief unload service timer + * + */ + void UnloadServiceTimer(); + private: mutable std::shared_mutex lock_; OHOS::ThreadPool threadPool_; diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index 93bed643711d55800837e7c5de66d95c30535f4d..f40291e698e5f908497e4204b483766de2874944 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -376,7 +376,7 @@ void SvcSessionManager::AppendBundles(const vector &bundleNames) if (!impl_.clientToken) { throw BError(BError::Codes::SA_INVAL_ARG, "No caller token was specified"); } - + for (auto &&bundleName : bundleNames) { BackupExtInfo info {}; info.backUpConnection = GetBackupExtAbility(bundleName); @@ -478,4 +478,13 @@ bool SvcSessionManager::GetNeedToInstall(const std::string &bundleName) auto it = GetBackupExtNameMap(bundleName); return it->second.bNeedToInstall; } + +bool SvcSessionManager::NeedToUnloadService() +{ + unique_lock lock(lock_); + if (!impl_.clientToken || !impl_.clientToken || !impl_.clientProxy || !impl_.backupExtNameMap.size()) { + return true; + } + return false; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/services/backup_sa/src/module_sched/sched_scheduler.cpp b/services/backup_sa/src/module_sched/sched_scheduler.cpp index e54e26a2350f1335f371b88f52baa346c627be5e..557539e4d1c75f767bf09ab1f1ca9efa72f33e79 100644 --- a/services/backup_sa/src/module_sched/sched_scheduler.cpp +++ b/services/backup_sa/src/module_sched/sched_scheduler.cpp @@ -27,10 +27,12 @@ #include "b_error/b_error.h" #include "filemgmt_libhilog.h" +#include "iservice_registry.h" #include "module_external/bms_adapter.h" #include "module_external/inner_receiver_impl.h" #include "module_ipc/service.h" #include "module_ipc/svc_session_manager.h" +#include "system_ability_definition.h" namespace OHOS::FileManagement::Backup { using namespace std; @@ -147,6 +149,30 @@ void SchedScheduler::InstallingState(const string &bundleName) } } +void SchedScheduler::UnloadServiceTimer() +{ + auto tryUnload = [sessionPtr {sessionPtr_}]() { + auto ptr = sessionPtr.promote(); + if (ptr && !ptr->NeedToUnloadService()) { + return; + } + HILOGI("Unload system ability"); + sptr saManager = + OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (saManager == nullptr) { + HILOGE("UnloadSA, GetSystemAbilityManager is null."); + return; + } + int32_t result = saManager->UnloadSystemAbility(FILEMANAGEMENT_BACKUP_SERVICE_SA_ID); + if (result != ERR_OK) { + HILOGE("UnloadSA, UnloadSystemAbility result: %{public}d", result); + return; + } + }; + int checkingIntervalInMs = 30000; + extTime_.Register(tryUnload, checkingIntervalInMs); +} + void SchedScheduler::InstallSuccess(const std::string &bundleName, const int32_t resultCode) { if (!resultCode) {