diff --git a/frameworks/native/backup_ext/include/ext_backup.h b/frameworks/native/backup_ext/include/ext_backup.h index fba69dafbfc45438ca51d27f072cbe505f41a478..441b94c694547ec05924fa07c7699940b5489fb3 100644 --- a/frameworks/native/backup_ext/include/ext_backup.h +++ b/frameworks/native/backup_ext/include/ext_backup.h @@ -132,8 +132,28 @@ public: */ virtual ErrCode OnRestore(std::function callback); + /** + * @brief 数据迁移判断 + * + * @return true + * @return false + */ bool WasFromSpeicalVersion(void); + /** + * @brief Version for clone and cloud + * + * @return true + * @return false + */ + bool SpeicalVersionForCloneAndCloud(void); + + /** + * @brief 数据以准备就绪 + * + * @return true + * @return false + */ bool RestoreDataReady(); public: diff --git a/frameworks/native/backup_ext/src/ext_backup.cpp b/frameworks/native/backup_ext/src/ext_backup.cpp index 4b5ab3ec640bf1b08ea0f55511d146a849782b32..7220ffdf47e2cd015c08929beb023f499828b45b 100644 --- a/frameworks/native/backup_ext/src/ext_backup.cpp +++ b/frameworks/native/backup_ext/src/ext_backup.cpp @@ -15,6 +15,7 @@ #include "ext_backup.h" +#include #include #include @@ -215,7 +216,18 @@ void ExtBackup::OnDisconnect(const AAFwk::Want &want) bool ExtBackup::WasFromSpeicalVersion(void) { - if (appVersionCode_ == 0 && appVersionStr_ == "0.0.0.0") { + if (appVersionCode_ == BConstants::DEFAULT_VERSION_CODE && appVersionStr_ == BConstants::DEFAULT_VERSION_NAME) { + return true; + } + return false; +} + +bool ExtBackup::SpeicalVersionForCloneAndCloud(void) +{ + auto iter = + find_if(BConstants::DEFAULT_VERSION_NAMES_VEC.begin(), BConstants::DEFAULT_VERSION_NAMES_VEC.end(), + [appVersionStr {appVersionStr_}](const auto &versionName) { return versionName == appVersionStr; }); + if (appVersionCode_ == BConstants::DEFAULT_VERSION_CODE && iter != BConstants::DEFAULT_VERSION_NAMES_VEC.end()) { return true; } return false; diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 987333bb3086a03a12a291bfe6004b1c08dbf85c..7e2d4200d93cd0066c8da5a7697ae1f0d3e30ce4 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -349,7 +349,12 @@ int BackupExtExtension::DoRestore(const string &fileName) // REM: 解压启动Extension时即挂载好的备份目录中的数据 string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_RESTORE); string tarName = path + fileName; - UntarFile::GetInstance().UnPacket(tarName, "/"); + // 当用户指定fullBackupOnly字段或指定版本的恢复,解压目录当前在/backup/restore + if (extension_->SpeicalVersionForCloneAndCloud() || extension_->UseFullBackupOnly()) { + UntarFile::GetInstance().UnPacket(tarName, path); + } else { + UntarFile::GetInstance().UnPacket(tarName, "/"); + } HILOGI("Application recovered successfully, package path is %{public}s", tarName.c_str()); return ERR_OK; diff --git a/tools/backup_tool/src/tools_op_restore_async.cpp b/tools/backup_tool/src/tools_op_restore_async.cpp index 6869963eca88766141aad401bfec87f9caea6f1c..15d82429d48e331a62bee6eea14f1547f19c4537 100644 --- a/tools/backup_tool/src/tools_op_restore_async.cpp +++ b/tools/backup_tool/src/tools_op_restore_async.cpp @@ -185,6 +185,10 @@ static int32_t ChangeBundleInfo(const string &pathCapFile, const vector for (auto name : bundleNames) { string versionName = string(BConstants::DEFAULT_VERSION_NAME); uint32_t versionCode = static_cast(BConstants::DEFAULT_VERSION_CODE); + if (type == "false") { + versionName = string(BConstants::DEFAULT_VERSION_NAME_CLONE); + versionCode = static_cast(BConstants::DEFAULT_VERSION_CODE); + } for (auto &&bundleInfo : cacheBundleInfos) { if (bundleInfo.name != name) { continue; diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 70c2ed6da950429c94f86a8cd223fdecd33b3b72..183f69098534381330fd8717a0de54754928868d 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -43,12 +43,6 @@ enum ServiceSchedAction { FINISH, }; -enum EntryKey { - SUPER_LONG_PATH = 0, - SUPER_LONG_LINK_PATH, - SUPER_LONG_SIZE, -}; - constexpr int SPAN_USERID_UID = 20000000; constexpr int SYSTEM_UID = 0; constexpr int XTS_UID = 1; @@ -59,26 +53,9 @@ constexpr int BACKUP_LOADSA_TIMEOUT_MS = 4000; constexpr int DECIMAL_BASE = 10; // 十进制基数 -constexpr int HEADER_SIZE = 512; // 打包文件头部Header结构体大小 -constexpr int BLOCK_SIZE = 512; // 打包文件数据段尾部补充的全零字节块上限大小 -constexpr int BLOCK_PADDING_SIZE = 1024; // 打包文件尾部追加的全零字节块大小 constexpr off_t BIG_FILE_BOUNDARY = 2 * 1024 * 1024; // 大文件边界 constexpr unsigned long BIG_FILE_NAME_SIZE = 16; // 大文件名长度(hash处理) -constexpr int PATHNAME_MAX_SIZE = 100; // 打包文件头部Header结构体各字段数组/字符串大小。 -constexpr int MODE_MAX_SIZE = 8; -constexpr int UGID_MAX_SIZE = 8; -constexpr int FILESIZE_MAX_SIZE = 12; -constexpr int TIME_MAX_SIZE = 12; -constexpr int CHKSUM_MAX_SIZE = 8; -constexpr int LINKNAME_MAX_SIZE = 100; -constexpr int MAGIC_SIZE = 6; -constexpr int VERSION_SIZE = 2; -constexpr int UGNAME_MAX_SIZE = 32; -constexpr int DEV_MAX_SIZE = 8; -constexpr int PREFIX_SIZE = 155; -constexpr int PADDING_SIZE = 12; - constexpr int PATHES_TO_BACKUP_SIZE = 13; // 应用默认备份的目录个数 constexpr uint32_t BACKUP_PARA_VALUE_MAX = 5; // 读取backup.para字段值的最大长度 constexpr int SA_THREAD_POOL_COUNT = 1; // SA THREAD_POOL 最大线程数 @@ -87,19 +64,6 @@ constexpr int EXT_CONNECT_MAX_TIME = 15000; // SA 启动 extension 等待连接 constexpr int IPC_MAX_WAIT_TIME = 3000; // IPC通讯最大等待时间(s) -constexpr off_t FILESIZE_MAX = 077777777777; // 打包文件头部Header结构体fileSize字段最大值。 - -// 打包文件头部Header结构体typeFlag字段值。 -constexpr char TYPEFLAG_REGULAR_FILE = '0'; -constexpr char TYPEFLAG_SYMBOLIC_LINK = '2'; -constexpr char TYPEFLAG_DIRECTORY = '5'; -constexpr char TYPEFLAG_EXTENDED = 'x'; - -// 打包文件扩展数据段字段值。 -static inline std::string ENTRY_NAME_LINKPATH = "linkpath"; -static inline std::string ENTRY_NAME_PATH = "path"; -static inline std::string ENTRY_NAME_SIZE = "size"; - // backup.para内配置项的名称,该配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 static inline std::string BACKUP_DEBUG_OVERRIDE_EXTENSION_CONFIG_KEY = "backup.debug.overrideExtensionConfig"; @@ -156,9 +120,21 @@ static inline std::string_view BACKUP_CONFIG_JSON = "backup_config.json"; // 恢复应用安装包URL判断 static inline std::string_view RESTORE_INSTALL_PATH = "/data/storage/el2/restore/bundle.hap"; -// 双生单场景默认的版本信息 +// 特殊版本信息 constexpr int DEFAULT_VERSION_CODE = 0; static inline std::string_view DEFAULT_VERSION_NAME = "0.0.0.0"; +static inline std::string_view DEFAULT_VERSION_NAME_CLONE = "99.99.99.999"; +static inline std::string_view DEFAULT_VERSION_NAME_CLONE_2 = "99.99.99.998"; +static inline std::string_view DEFAULT_VERSION_NAME_CLONE_3 = "99.99.99.997"; +static inline std::string_view DEFAULT_VERSION_NAME_PC = "99.99.99.996"; +static inline std::string_view DEFAULT_VERSION_NAME_CLOUD = "99.99.99.995"; +static inline std::vector DEFAULT_VERSION_NAMES_VEC = { + DEFAULT_VERSION_NAME_CLONE, + DEFAULT_VERSION_NAME_CLONE_2, + DEFAULT_VERSION_NAME_CLONE_3, + DEFAULT_VERSION_NAME_PC, + DEFAULT_VERSION_NAME_CLOUD, +}; // 应用默认备份的目录,其均为相对根路径的路径。为避免模糊匹配,务必以斜线为结尾。 static inline std::array PATHES_TO_BACKUP = { diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index d6a7ccba6acbfe577a1d5fca468164638e2de609..3bd5479ba58749b55209ab2e79a3497e07d6aae9 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -62,7 +62,7 @@ static tuple, vector> GetDirFilesDetai if (IsEmptyDirectory(path)) { smallFiles.emplace_back(path); - return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; + return {ERR_OK, files, smallFiles}; } unique_ptr> dir = {opendir(path.c_str()), closedir}; @@ -105,7 +105,7 @@ static tuple, vector> GetDirFilesDetai } } - return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; + return {ERR_OK, files, smallFiles}; } tuple> BDir::GetDirFiles(const string &path) @@ -129,7 +129,7 @@ tuple> BDir::GetDirFiles(const string &path) } } - return {BError(BError::Codes::OK).GetCode(), files}; + return {ERR_OK, files}; } static set ExpandPathWildcard(const vector &vec)