diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000000000000000000000000000000000000..286ddac767c081781e0939fea7020e4786a3242d
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,162 @@
+Language: Cpp
+# BasedOnStyle: LLVM
+# 访问说明符(public、private等)的偏移
+AccessModifierOffset: -4
+# 开括号(开圆括号、开尖括号、开方括号)后的对齐
+AlignAfterOpenBracket: Align
+# 连续赋值时,等号对齐
+AlignConsecutiveAssignments: false
+# 连续赋值时,变量名对齐
+AlignConsecutiveDeclarations: false
+# 左对齐逃脱换行(使用反斜杠换行)的反斜杠
+AlignEscapedNewlinesLeft: true
+# 水平对齐二元和三元表达式的操作数
+AlignOperands: true
+# 对齐连续的尾随的注释
+AlignTrailingComments: true
+# 允许函数声明的所有参数在放在下一行
+AllowAllParametersOfDeclarationOnNextLine: false
+# 允许短的块放在同一行
+AllowShortBlocksOnASingleLine: false
+# 允许短的case标签放在同一行
+AllowShortCaseLabelsOnASingleLine: false
+# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
+AllowShortFunctionsOnASingleLine: Empty
+# 允许短的if语句保持在同一行
+AllowShortIfStatementsOnASingleLine: false
+# 允许短的循环保持在同一行
+AllowShortLoopsOnASingleLine: false
+# 总是在定义返回类型后换行(deprecated)
+AlwaysBreakAfterDefinitionReturnType: None
+# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数),
+# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
+AlwaysBreakAfterReturnType: None
+# 总是在多行string字面量前换行
+AlwaysBreakBeforeMultilineStrings: true
+# 总是在template声明后换行
+AlwaysBreakTemplateDeclarations: true
+# false表示函数实参要么都在同一行,要么都各自一行
+BinPackArguments: true
+# false表示所有形参要么都在同一行,要么都各自一行
+BinPackParameters: false
+# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效
+BraceWrapping:
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: true
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: false
+ BeforeElse: false
+ IndentBraces: false
+# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
+BreakBeforeBinaryOperators: None
+# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似),
+# Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似),
+# Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
+# 注:这里认为语句块也属于函数
+BreakBeforeBraces: Custom
+# 在三元运算符前换行
+BreakBeforeTernaryOperators: true
+# 在构造函数的初始化列表的逗号前换行
+BreakConstructorInitializersBeforeComma: false
+# 每行字符的限制,0表示没有限制
+ColumnLimit: 120
+# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
+CommentPragmas: "^ IWYU pragma:"
+# 构造函数的初始化列表要么都在同一行,要么都各自一行
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+# 构造函数的初始化列表的缩进宽度
+ConstructorInitializerIndentWidth: 4
+# 延续的行的缩进宽度
+ContinuationIndentWidth: 4
+# 去除C++11的列表初始化的大括号{后和}前的空格
+Cpp11BracedListStyle: true
+# 继承最常用的指针和引用的对齐方式
+DerivePointerAlignment: false
+# 关闭格式化
+DisableFormat: false
+# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
+ExperimentalAutoDetectBinPacking: false
+# 需要被解读为foreach循环而不是函数调用的宏
+ForEachMacros: [foreach, Q_FOREACH, BOOST_FOREACH]
+# 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级,匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前),
+# 可以定义负数优先级从而保证某些#include永远在最前面
+IncludeCategories:
+ - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
+ Priority: 2
+ - Regex: '^(<|"(gtest|isl|json)/)'
+ Priority: 3
+ - Regex: ".*"
+ Priority: 1
+# 缩进case标签
+IndentCaseLabels: true
+# 缩进宽度
+IndentWidth: 4
+# 函数返回类型换行时,缩进函数声明或函数定义的函数名
+IndentWrappedFunctionNames: true
+# 保留在块开始处的空行
+KeepEmptyLinesAtTheStartOfBlocks: true
+# 开始一个块的宏的正则表达式
+MacroBlockBegin: ""
+# 结束一个块的宏的正则表达式
+MacroBlockEnd: ""
+# 连续空行的最大数量
+MaxEmptyLinesToKeep: 1
+# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All
+NamespaceIndentation: None
+# 使用ObjC块时缩进宽度
+ObjCBlockIndentWidth: 4
+# 在ObjC的@property后添加一个空格
+ObjCSpaceAfterProperty: false
+# 在ObjC的protocol列表前添加一个空格
+ObjCSpaceBeforeProtocolList: true
+# 在call(后对函数调用换行的penalty
+PenaltyBreakBeforeFirstCallParameter: 19
+# 在一个注释中引入换行的penalty
+PenaltyBreakComment: 300
+# 第一次在<<前换行的penalty
+PenaltyBreakFirstLessLess: 120
+# 在一个字符串字面量中引入换行的penalty
+PenaltyBreakString: 1000
+# 对于每个在行字符数限制之外的字符的penalty
+PenaltyExcessCharacter: 1000000
+# 将函数的返回类型放到它自己的行的penalty
+PenaltyReturnTypeOnItsOwnLine: 120
+# 指针和引用的对齐: Left, Right, Middle
+PointerAlignment: Right
+# 允许重新排版注释
+ReflowComments: true
+# 允许排序#include
+SortIncludes: true
+# 在C风格类型转换后添加空格
+SpaceAfterCStyleCast: false
+# 在赋值运算符之前添加空格
+SpaceBeforeAssignmentOperators: true
+# 开圆括号之前添加一个空格: Never, ControlStatements, Always
+SpaceBeforeParens: ControlStatements
+# 在空的圆括号中添加空格
+SpaceInEmptyParentheses: false
+# 在尾随的评论前添加的空格数(只适用于//)
+SpacesBeforeTrailingComments: 1
+# 在尖括号的<后和>前添加空格
+SpacesInAngles: false
+# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
+SpacesInContainerLiterals: true
+# 在C风格类型转换的括号中添加空格
+SpacesInCStyleCastParentheses: false
+# 在圆括号的(后和)前添加空格
+SpacesInParentheses: false
+# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响
+SpacesInSquareBrackets: false
+# 在C++11的列表初始化的大括号之前添加空格
+SpaceBeforeCpp11BracedList: true
+# 标准: c++03,c++11,c++14,c++17,c++20,Latest,Auto
+Standard: c++17
+# tab宽度
+TabWidth: 4
+# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
+UseTab: Never
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..600d2d33badf45cc068e01d2e3c837e11c417bc4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.vscode
\ No newline at end of file
diff --git a/BUILD.gn b/BUILD.gn
index af0c7ab4989f36f146f596b51f92249b98c5dbd5..44bf745721fd01f28153251a002e27cf0ca27838 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 Huawei Device Co., Ltd.
+# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
@@ -14,5 +14,41 @@
import("//build/ohos.gni")
group("libremotefileshare") {
- deps = [ "//foundation/filemanagement/app_file_service/interfaces/kits/js:remotefileshare" ]
+ deps = [
+ "//foundation/filemanagement/app_file_service/interfaces/innerkits/remote_file_share/native:remote_file_share_native",
+ "//foundation/filemanagement/app_file_service/interfaces/kits/js:remotefileshare",
+ ]
+}
+
+group("tgt_backup_extension") {
+ deps = [
+ "frameworks/native/backup_ext:backup_extension_ability_native",
+ "interfaces/api/js/napi/backup_ext:backupextensionability_napi",
+ ]
+}
+
+group("tgt_backup_kit_inner") {
+ deps = [ "interfaces/inner_api/native/backup_kit_inner" ]
+}
+
+group("tgt_backup_sa") {
+ deps = [
+ "services:backup_para_etc",
+ "services:backup_sa_etc",
+ "services:backup_sa_profile",
+ "services/backup_sa",
+ ]
+}
+
+group("tgt_backup_tool") {
+ deps = [ "tools/backup_tool" ]
+}
+
+group("tgt_backup_tests") {
+ testonly = true
+
+ deps = [
+ "tests/moduletests",
+ "tests/unittests",
+ ]
}
\ No newline at end of file
diff --git a/OAT.xml b/OAT.xml
index b736383c31b96f2c098e45a0ae74575006f4a95d..fd08f5d9ae490b3f796188d9f9022f3e3586b8f3 100644
--- a/OAT.xml
+++ b/OAT.xml
@@ -1,6 +1,5 @@
+
+ backup_sa
+
+ libbackup_sa.z.so
+
+
+ 5203
+ libbackup_sa.z.so
+
+
+ false
+ false
+ 1
+
+
diff --git a/services/BUILD.gn b/services/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..ae1fb99b67c69fb405470d957458741cfdf98194
--- /dev/null
+++ b/services/BUILD.gn
@@ -0,0 +1,39 @@
+# Copyright (c) 2022 Huawei Device Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/ohos.gni")
+import("//build/ohos/sa_profile/sa_profile.gni")
+
+group("backup_para_etc") {
+ deps = [ ":backup.para" ]
+}
+
+ohos_sa_profile("backup_sa_profile") {
+ sources = [ "5203.xml" ]
+ part_name = "app_file_service"
+}
+
+ohos_prebuilt_etc("backup_sa_etc") {
+ source = "backup.cfg"
+ relative_install_dir = "init"
+ part_name = "app_file_service"
+ subsystem_name = "filemanagement"
+}
+
+ohos_prebuilt_etc("backup.para") {
+ source = "backup.para"
+ install_images = [ "system" ]
+ part_name = "app_file_service"
+ subsystem_name = "filemanagement"
+ relative_install_dir = "param"
+}
\ No newline at end of file
diff --git a/services/backup.cfg b/services/backup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..84d391ce619ed8f98cf2852ca25b7b349902923a
--- /dev/null
+++ b/services/backup.cfg
@@ -0,0 +1,11 @@
+{
+ "services" : [{
+ "name" : "backup_sa",
+ "path" : ["/system/bin/sa_main", "/system/profile/backup_sa.xml"],
+ "ondemand" : true,
+ "uid" : "backup",
+ "gid" : ["backup"],
+ "secon" : "u:r:backup_sa:s0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/services/backup.para b/services/backup.para
new file mode 100644
index 0000000000000000000000000000000000000000..9878f6ca2839204bf60e62bd09c6e9bb6d898ccd
--- /dev/null
+++ b/services/backup.para
@@ -0,0 +1,14 @@
+# Copyright (c) 2022 Huawei Device Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+backup.debug.overrideExtensionConfig=false
\ No newline at end of file
diff --git a/services/backup_sa/BUILD.gn b/services/backup_sa/BUILD.gn
new file mode 100644
index 0000000000000000000000000000000000000000..0499ac1d6c1ecda977aa30ab507cbf5e07d6f425
--- /dev/null
+++ b/services/backup_sa/BUILD.gn
@@ -0,0 +1,55 @@
+# Copyright (c) 2022 Huawei Device Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/ohos.gni")
+import("//foundation/filemanagement/app_file_service/backup.gni")
+
+ohos_shared_library("backup_sa") {
+ sources = [
+ "src/module_ipc/service.cpp",
+ "src/module_ipc/service_reverse_proxy.cpp",
+ "src/module_ipc/service_stub.cpp",
+ "src/module_ipc/svc_backup_connection.cpp",
+ "src/module_ipc/svc_extension_proxy.cpp",
+ "src/module_ipc/svc_session_manager.cpp",
+ "src/module_sched/sched_scheduler.cpp",
+ ]
+
+ defines = [
+ "LOG_DOMAIN=0xD004303",
+ "LOG_TAG=\"BackupSA\"",
+ ]
+
+ include_dirs = [ "include" ]
+
+ deps = [
+ "${path_ability_runtime}/interfaces/inner_api/ability_manager:ability_manager",
+ "${path_access_token}/interfaces/innerkits/accesstoken:libaccesstoken_sdk",
+ "${path_backup}/utils:backup_utils",
+ ]
+
+ external_deps = [
+ "ability_base:want",
+ "app_file_service:backup_kit_inner",
+ "bundle_framework:appexecfwk_base",
+ "bundle_framework:appexecfwk_core",
+ "ipc:ipc_core",
+ "safwk:system_ability_fwk",
+ "samgr:samgr_proxy",
+ "init:libbegetutil",
+ ]
+
+ use_exceptions = true
+ part_name = "app_file_service"
+ subsystem_name = "filemanagement"
+}
diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h
new file mode 100644
index 0000000000000000000000000000000000000000..b8d37b08dba3b0e557a34c275480c35e60392eae
--- /dev/null
+++ b/services/backup_sa/include/module_ipc/service.h
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef OHOS_FILEMGMT_BACKUP_SERVICE_H
+#define OHOS_FILEMGMT_BACKUP_SERVICE_H
+
+#include
+#include
+
+#include "i_service_reverse.h"
+#include "iremote_stub.h"
+#include "module_sched/sched_scheduler.h"
+#include "service_stub.h"
+#include "svc_session_manager.h"
+#include "system_ability.h"
+
+namespace OHOS::FileManagement::Backup {
+class Service : public SystemAbility, public ServiceStub, protected NoCopyable {
+ DECLARE_SYSTEM_ABILITY(Service);
+
+ // 以下都是IPC接口
+public:
+ ErrCode InitRestoreSession(sptr remote, const std::vector &bundleNames) override;
+ ErrCode InitBackupSession(sptr remote,
+ UniqueFd fd,
+ const std::vector &bundleNames) override;
+ ErrCode Start() override;
+ UniqueFd GetLocalCapabilities() override;
+ ErrCode PublishFile(const BFileInfo &fileInfo) override;
+ ErrCode AppFileReady(const std::string &fileName, UniqueFd fd) override;
+ ErrCode AppDone(ErrCode errCode) override;
+ ErrCode GetExtFileName(std::string &bundleName, std::string &fileName) override;
+
+ // 以下都是非IPC接口
+public:
+ void OnStart() override;
+ void OnStop() override;
+ void StopAll(const wptr &obj, bool force = false);
+ int Dump(int fd, const std::vector &args) override;
+
+ /**
+ * @brief 执行启动 backup extension
+ *
+ * @param bundleName
+ * @return ErrCode
+ */
+ virtual ErrCode LaunchBackupExtension(const BundleName &bundleName);
+
+ /**
+ * @brief backup extension died
+ *
+ * @param bundleName 应用名称
+ */
+ void OnBackupExtensionDied(const std::string &&bundleName, ErrCode ret);
+
+ /**
+ * @brief extension启动连接成功
+ *
+ * @param bundleName 应用名称
+ */
+ void ExtConnectDone(std::string bundleName);
+
+ /**
+ * @brief extension启动连接失败
+ *
+ * @param bundleName 应用名称
+ */
+ void ExtConnectFailed(const std::string &bundleName, ErrCode ret);
+
+ /**
+ * @brief 执行backup extension 备份恢复流程
+ *
+ * @param bundleName 应用名称
+ */
+ virtual void ExtStart(const std::string &bundleName);
+
+public:
+ explicit Service(int32_t saID, bool runOnCreate = false) : SystemAbility(saID, runOnCreate)
+ {
+ session_ = sptr(new SvcSessionManager(wptr(this)));
+ };
+ ~Service() override = default;
+
+private:
+ /**
+ * @brief 验证调用者并返回名称
+ *
+ * @return std::string
+ */
+ std::string VerifyCallerAndGetCallerName();
+
+ /**
+ * @brief 清除Session Sched相关资源
+ *
+ * @param bundleName 应用名称
+ */
+ void ClearSessionAndSchedInfo(const std::string &bundleName);
+
+private:
+ static sptr instance_;
+ static std::mutex instanceLock_;
+ static inline std::atomic seed {1};
+
+ sptr session_;
+ sptr sched_;
+
+ friend class ServiceTest;
+};
+} // namespace OHOS::FileManagement::Backup
+
+#endif // OHOS_FILEMGMT_BACKUP_SERVICE_H
\ No newline at end of file
diff --git a/services/backup_sa/include/module_ipc/service_reverse_proxy.h b/services/backup_sa/include/module_ipc/service_reverse_proxy.h
new file mode 100644
index 0000000000000000000000000000000000000000..2ab8a6aa6f809da68abae28dd64a4c39f26933c7
--- /dev/null
+++ b/services/backup_sa/include/module_ipc/service_reverse_proxy.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef OHOS_FILEMGMT_BACKUP_SERVICE_REVERSE_PROXY_H
+#define OHOS_FILEMGMT_BACKUP_SERVICE_REVERSE_PROXY_H
+
+#include "i_service_reverse.h"
+#include "iremote_proxy.h"
+
+namespace OHOS::FileManagement::Backup {
+class ServiceReverseProxy final : public IRemoteProxy, protected NoCopyable {
+public:
+ void BackupOnFileReady(std::string bundleName, std::string fileName, int fd) override;
+ void BackupOnBundleStarted(int32_t errCode, std::string bundleName) override;
+ void BackupOnBundleFinished(int32_t errCode, std::string bundleName) override;
+ void BackupOnAllBundlesFinished(int32_t errCode) override;
+
+ void RestoreOnBundleStarted(int32_t errCode, std::string bundleName) override;
+ void RestoreOnBundleFinished(int32_t errCode, std::string bundleName) override;
+ void RestoreOnAllBundlesFinished(int32_t errCode) override;
+ void RestoreOnFileReady(std::string bundleName, std::string fileName, int fd) override;
+
+public:
+ explicit ServiceReverseProxy(const sptr &impl) : IRemoteProxy(impl) {}
+ ~ServiceReverseProxy() override = default;
+
+private:
+ static inline BrokerDelegator delegator_;
+};
+} // namespace OHOS::FileManagement::Backup
+
+#endif // OHOS_FILEMGMT_BACKUP_SERVICE_REVERSE_PROXY_H
\ No newline at end of file
diff --git a/services/backup_sa/include/module_ipc/service_stub.h b/services/backup_sa/include/module_ipc/service_stub.h
new file mode 100644
index 0000000000000000000000000000000000000000..6b44e3de41dd710949a0f552b669cd9bbbea0758
--- /dev/null
+++ b/services/backup_sa/include/module_ipc/service_stub.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef OHOS_FILEMGMT_BACKUP_SERVICE_STUB_H
+#define OHOS_FILEMGMT_BACKUP_SERVICE_STUB_H
+
+#include