diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 277b00f215b059b6f2d9216935c808bf3139d0b9..bd5fa812920894e5bb9e07122bca8da08e372973 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -503,6 +503,15 @@ private: */ ErrCode BackupSA(std::string bundleName); + /** + * @brief SA增量备份恢复入口 + * + * @param bundleName SAID + * + * @return ErrCode OK if backup sa, otherwise backup sa failed. + */ + ErrCode IncrementalBackupSA(std::string bundleName); + /** * @brief 执行通知调用方 * diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 8f7bfa679ac9b08d0f078a08be2ad83ae8648688..12f7ce461fadd1ad981587034a9672db7329503d 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1020,6 +1020,7 @@ ErrCode Service::SAResultReport(const std::string bundleName, const std::string session_->GetServiceReverseProxy()->BackupOnBundleFinished(errCode, bundleName); } else if (sennario == BackupRestoreScenario::INCREMENTAL_BACKUP) { session_->GetServiceReverseProxy()->IncrementalBackupOnResultReport(restoreRetInfo, bundleName); + session_->GetServiceReverseProxy()->IncrementalBackupOnBundleFinished(errCode, bundleName); } OnAllBundlesFinished(BError(BError::Codes::OK)); if (sennario == BackupRestoreScenario::FULL_RESTORE || sennario == BackupRestoreScenario::INCREMENTAL_RESTORE) { @@ -1145,7 +1146,11 @@ void Service::ExtStart(const string &bundleName) try { HILOGE("begin ExtStart, bundle name:%{public}s", bundleName.data()); if (SAUtils::IsSABundleName(bundleName)) { - BackupSA(bundleName); + if (session_->GetIsIncrementalBackup()) { + IncrementalBackupSA(bundleName); + } else { + BackupSA(bundleName); + } return; } if (IncrementalBackup(bundleName)) { @@ -1881,9 +1886,17 @@ void Service::OnSABackup(const std::string &bundleName, const int &fd, const std auto task = [bundleName, fd, result, errCode, this]() { HILOGI("OnSABackup bundleName: %{public}s, fd: %{public}d, result: %{public}s, err: %{public}d", bundleName.c_str(), fd, result.c_str(), errCode); - session_->GetServiceReverseProxy()->BackupOnFileReady(bundleName, "", move(fd), errCode); + BackupRestoreScenario scenario = BackupRestoreScenario::FULL_BACKUP; + if (session_->GetIsIncrementalBackup()) { + scenario = BackupRestoreScenario::INCREMENTAL_BACKUP; + session_->GetServiceReverseProxy()->IncrementalBackupOnFileReady(bundleName, "", move(fd), INVALID_FD, + errCode); + } else { + scenario = BackupRestoreScenario::FULL_BACKUP; + session_->GetServiceReverseProxy()->BackupOnFileReady(bundleName, "", move(fd), errCode); + } FileReadyRadarReport(bundleName, "", errCode, IServiceReverse::Scenario::BACKUP); - SAResultReport(bundleName, result, errCode, BackupRestoreScenario::FULL_BACKUP); + SAResultReport(bundleName, result, errCode, scenario); }; threadPool_.AddTask([task]() { try { diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 2f78c020c0643e099599919ff7004f4b185f31ab..3e8e487163ee6877ff53988247ffe149ee849585 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -791,6 +791,32 @@ bool Service::IncrementalBackup(const string &bundleName) return false; } +ErrCode Service::IncrementalBackupSA(std::string bundleName) +{ + HILOGI("IncrementalBackupSA begin %{public}s", bundleName.c_str()); + IServiceReverse::Scenario scenario = session_->GetScenario(); + auto backUpConnection = session_->GetSAExtConnection(bundleName); + std::shared_ptr saConnection = backUpConnection.lock(); + if (saConnection == nullptr) { + HILOGE("lock sa connection ptr is nullptr"); + return BError(BError::Codes::SA_INVAL_ARG); + } + if (scenario == IServiceReverse::Scenario::BACKUP) { + auto ret = saConnection->CallBackupSA(); + session_->GetServiceReverseProxy()->IncrementalBackupOnBundleStarted(ret, bundleName); + BundleBeginRadarReport(bundleName, ret, scenario); + if (ret) { + HILOGE("IncrementalBackupSA ret is %{public}d", ret); + ClearSessionAndSchedInfo(bundleName); + NoticeClientFinish(bundleName, BError(BError::Codes::EXT_ABILITY_DIED)); + return BError(ret); + } + } else if (scenario == IServiceReverse::Scenario::RESTORE) { + session_->GetServiceReverseProxy()->IncrementalRestoreOnBundleStarted(BError(BError::Codes::OK), bundleName); + } + return BError(BError::Codes::OK); +} + void Service::NotifyCallerCurAppIncrementDone(ErrCode errCode, const std::string &callerName) { IServiceReverse::Scenario scenario = session_->GetScenario(); diff --git a/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp b/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp index 57e412c92c862ca7f41048a2ec2a0d82b570f0c4..8aecf1ee6cb835def1c1844025a145b14f22ab37 100644 --- a/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental_reverse_proxy.cpp @@ -19,6 +19,7 @@ #include "b_error/b_excep_utils.h" #include "filemgmt_libhilog.h" #include "module_app_gallery/app_gallery_dispose_proxy.h" +#include "b_sa/b_sa_utils.h" namespace OHOS::FileManagement::Backup { using namespace std; @@ -28,13 +29,18 @@ void ServiceReverseProxy::IncrementalBackupOnFileReady(string bundleName, string { BExcepUltils::BAssert(Remote(), BError::Codes::SDK_INVAL_ARG, "Remote is nullptr"); MessageParcel data; + bool appFlag = true; + if (SAUtils::IsSABundleName(bundleName)) { + appFlag = false; + } + bool fdFlag = true; - if (fd < 0 || manifestFd < 0) { + if (fd < 0 || (appFlag && manifestFd < 0)) { fdFlag = false; } if (!data.WriteInterfaceToken(GetDescriptor()) || !data.WriteString(bundleName) || !data.WriteString(fileName) || !data.WriteBool(fdFlag) || - (fdFlag == true && (!data.WriteFileDescriptor(fd) || !data.WriteFileDescriptor(manifestFd))) || + (fdFlag == true && (!data.WriteFileDescriptor(fd) || (!data.WriteFileDescriptor(manifestFd) && appFlag))) || !data.WriteInt32(errCode)) { throw BError(BError::Codes::SA_BROKEN_IPC); } diff --git a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp index ed65c4e39093b7e8ca8e51b0a42b3c85e754905d..6bd257715aeea809b03c612c078616e6c00b73c7 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -137,6 +137,11 @@ bool Service::IncrementalBackup(const string&) return false; } +ErrCode Service::IncrementalBackupSA(std::string bundleName) +{ + return BError(BError::Codes::OK); +} + void Service::NotifyCallerCurAppIncrementDone(ErrCode, const std::string&) {} void Service::SendUserIdToApp(string&, int32_t) {} diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index 6e3a6b1142d6c8cc259cb4e58685deb57fa357a3..5e4e17dd7b9ae133f8d33d1deb353e5b97fc2d02 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -151,8 +151,9 @@ HWTEST_F(ServiceTest, SUB_Service_SAResultReport_0000, TestSize.Level1) ret = service->SAResultReport("", "", 0, BackupRestoreScenario::FULL_BACKUP); EXPECT_EQ(ret, BError(BError::Codes::OK).GetCode()); - EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)); + EXPECT_CALL(*session, GetServiceReverseProxy()).WillOnce(Return(srProxy)).WillOnce(Return(srProxy)); EXPECT_CALL(*srProxy, IncrementalBackupOnResultReport(_, _)).WillOnce(Return()); + EXPECT_CALL(*srProxy, IncrementalBackupOnBundleFinished(_, _)).WillOnce(Return()); EXPECT_CALL(*session, OnBundleFileReady(_, _)).WillOnce(Return(false)); EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); ret = service->SAResultReport("", "", 0, BackupRestoreScenario::INCREMENTAL_BACKUP);