更好用、更强大的 安卓备份工具。 备份自动加密更安全,全面切换到rustic(restic),原生支持增量备份,备份更快更省时(比如微信增量备份,不用重新完整备份,省时快速),同时节省 60–90% 的存储空间。
ℹ️ 无需任何外部 Restic 二进制文件。 本地备份/恢复由 Rust 的
rustic_core库驱动(Rust 实现,兼容 restic 仓库格式),编译进librustic.so随 App 一同分发,并通过 JNI 直接调用。不再需要下载、安装或管理独立的 Restic Android CGO 二进制文件,此前上游二进制在 Android 上的 DNS 解析与动态链接问题也不复存在。详见 Native JNI 迁移。
- 🌳 需要 Root 权限。支持 Magisk、KernelSU 以及 APatch
- 🌀 多用户支持
- ☁️ 支持多种云存储协议
- 😎 100% 数据完整性保证
- ⚡ 极速
- ☀️ 简单易用
- ✨ 支持多版本备份
- 🌹 本地备份基于内置
rustic_core(JNI,兼容 restic 仓库)的块级去重 - 🔌 无需外部二进制——
rustic_core编译进librustic.so并通过 JNI 调用 - 🚀 集成 libsu 以增强 Root 操作体验
| 功能 | 旧版 (DataBackup) | 新版 (DataBackup Revived 3.0.0) |
|---|---|---|
| 本地存储 | ✅ 已支持 | ✅ 块级去重(JNI rustic,已完成) |
| Tencent COS 协议 | ❌ 不支持 | ✅ 块级去重(JNI rustic,已完成) |
| FTP 协议 | ✅ 已支持 | ✅ 块级去重(JNI rustic over librclone,已完成) |
| SFTP 协议 | ✅ 已支持 | ✅ 块级去重(JNI rustic over librclone,已完成) |
| WebDAV 协议 | ✅ 已支持 | ✅ 块级去重(JNI rustic,已完成) |
| SMB/CIFS 协议 | ✅ 已支持 | ❌ opendal不支持,后续移除 |
目前 JNI
rustic_core本地存储,远程协议均迁移到 JNI**。 腾讯 COS:是兼容S3协议的对象存储,特别说明:S3之间(比如AWS S3、腾讯云COS、阿里云OSS)可能存在参数差异,目前只适配了腾讯云COS,额外的其他S3对象存储目前还没有支持,在逐步适配中,敬请期待.
| 功能 | 旧版 | 新版 (已完成) |
|---|---|---|
| 本地备份引擎 | 仅 tar+zstd 压缩 | rustic 块级增量去重(JNI,无二进制) |
| Root 权限 | 自定义实现 | 集成 libsu |
| 存储效率 | 线性增长 | 节省 60–90% 空间 |
| 数据加密 | 无 | AES-256 加密 |
| 增量备份 | 不支持 | 原生支持 |
| 版本管理 | 文件覆盖 | 基于快照的版本控制 |
| APK 备份(本地) | 仅压缩 | rustic 增量去重 |
| 应用数据备份(本地) | 仅压缩 | rustic 增量去重 |
| 文件备份(本地) | 仅压缩 | rustic 增量去重 |
| 项目 | 旧版 | 新版 |
|---|---|---|
| 应用包名 | com.xayah.databackup.* |
com.xayah.databackup.revived.* |
| 版本号 | 2.x.x | 3.0.0(基于 rustic 的块级去重) |
| Root 框架 | 自定义 Root 服务 | libsu 集成 |
| 备份引擎 | 单一压缩 | 双层架构:非压缩 tar + rustic 块级去重与加密 |
| Restic/rustic 运行时 | 无 | 进程内 rustic_core,通过 JNI(librustic.so) |
原始数据 → 非压缩 tar 打包 → rustic 块级去重(JNI) → 本地仓库
- 第 1 层:打包层 — 将 APK/数据/文件打包为非压缩的
.tar归档,以最大化去重效率(例如 OBB/DATA/USER/USER_DE/MEDIA 输出apk.tar)。 - 第 2 层:rustic 去重层 — 在 restic 兼容仓库上进行块级去重、AES-256 加密与快照管理(标签格式:
userId-packageName-timestamp-apk)。
✅ 通过在去重前避免压缩,rustic 能更有效地识别并消除不同备份批次和设备之间的冗余数据块。
- Root 权限通过 libsu 处理,获得更好的 Magisk/KernelSU/APatch 支持、改进的错误处理与更强的安全性。
- APK 备份、应用数据备份、文件备份 均通过 JNI rustic 路径执行。
- 新 UI:还原列表页(浏览/选择快照)、快照详情页(类型与进度)。
- 交互流程:配置仓库 → 浏览快照 → 选择应用/文件版本 → 查看详情 → 一键还原。
| 特性 | 旧版备份 | rustic 备份(JNI,本地) |
|---|---|---|
| 存储效率 | 基础压缩 | 块级去重 + 压缩 |
| 增量备份 | 不支持 | 原生支持 |
| 数据加密 | 无 | AES-256 加密 |
| 版本管理 | 文件覆盖 | 基于快照的版本控制 |
| 还原粒度 | 批量还原 | 支持单个应用和单个文件的精准还原 |
| 存储占用 | 线性增长 | 节省 60–90% 空间 |
| Root 权限 | 自定义实现 | libsu 集成 |
| 备份运行时 | 无 | 进程内 rustic_core,通过 JNI |
DataBackup Revived 现已成为一个现代化数据管理平台,具备本地块级去重(内置 rustic,经 JNI 调用)与 libsu 集成;远程协议向 JNI 的迁移正在进行中。
🎯 本地备份/恢复已从"调用外部 Restic Android CGO 二进制"迁移到"通过 JNI 直接调用 Rust 的
rustic_core库"。Rust 代码编译进librustic.so随 App 分发,彻底消除对外部二进制的运行时依赖。
此前,所有本地备份/恢复都要调用外部 Restic Android CGO 二进制:需要单独分发/管理二进制、每次操作 fork 子进程、并解析文本/JSON 输出;上游二进制在 Android 上还存在 DNS 解析和动态链接问题。rustic-jni 迁移用原生进程内集成替代了它:
rustic_core固定到0.12.0,作为 native 子模块参考引入。- Rust crate 编译为静态库,链接进 JNI 锚点,打包为
librustic.so随 App 分发。 - 本地操作在运行时不再需要任何外部二进制,也不再 fork 子进程。
- 仓库格式仍与 restic 兼容,现有仓库可继续使用。
Kotlin (Rustic.kt)
│ external fun native* (JNI)
▼
AIDL (IRemoteRootService) ──► RemoteRootService / RemoteRootServiceImpl (root 进程)
│
▼
librustic.so (JNI 锚点 rustic.cpp + Rust 静态库)
│
▼
rustic_core (Rust) ──► 本地 / S3 仓库(经 opendal backend)
▲
└── 进度回调(字节/速度/百分比)──► Kotlin onProgress(JJF)V
-
Rust 侧(
source/native/src/main/jni/external/rustic/rustic):lib.rs组织 crate 模块(error、jni_bridge、jni_progress、progress、repository),并启用#![deny(improper_ctypes_definitions)]。jni_bridge.rs暴露Java_com_xayah_libnative_Rustic_*符号。repository.rs封装完整能力集:init_repository、repository_exists、validate_repository、create_snapshot(含带进度版本)、restore_snapshot(含带进度版本)、check_repository、forget_snapshot、prune_repository、list_snapshots_db。list_snapshots_db打开仓库读取全部快照,用静态编译的rusqlite(bundled)直写 SQLite.db文件:含 4 张表 +v_snapshots_full视图,Android 侧可用SQLiteDatabase.openDatabase(...)直接rawQuery(...)。
-
进度回调:
progress.rs定义与 JNI 无关的RusticProgressCallbacktrait,通过AndroidProgressBars桥接rustic_core的ProgressBars;只上报字节级进度(ProgressType::Bytes),spinner/counter 进度隐藏。- 进度回调节流到每秒一次(
PROGRESS_CALLBACK_INTERVAL = 1s);finish时上报整段传输的平均速度。 jni_progress.rs缓存onProgress(JJF)V方法 ID,通过attach_current_thread回调 Kotlin。
-
构建接线(CMake + Corrosion):
source/native/src/main/jni/CMakeLists.txt加入rustic子目录。source/native/src/main/jni/rustic/CMakeLists.txt通过FetchContent+corrosion_import_crate使用 Corrosion (v0.6.1) 构建 Rust 静态库(PROFILE release、LOCKED),再用--whole-archive链接进 JNI 锚点rustic.cpp生成librustic.so。rustic.map版本脚本仅导出Java_com_xayah_libnative_Rustic_*符号。- Cargo release profile 开启
lto = true、codegen-units = 1、panic = "abort"、strip = true,确保原生性能。
-
Kotlin 与 AIDL 层:
Rustic.kt提供带 backend options(Map<String,String>,key/value 两个字符串数组经 JNI zip 成 map)的 Kotlin API。IRemoteRootService.aidl新增 10 个 Rustic 方法(getRusticVersion、initRusticRepository、rusticRepositoryExists、validateRusticRepository、createRusticSnapshot、restoreRusticSnapshot、checkRusticRepository、forgetRusticSnapshot、pruneRusticRepository、listRusticSnapshotsDb),并用ICallback传递进度。- root 进程启动时加载库(
System.loadLibrary("rustic")+Rustic.initLogger()),RemoteRootServiceImpl在synchronized(lock)下把每个 AIDL 调用转发给Rustic。
- 阶段 0 — 固定
rustic_core到0.12.0并同步上游源作为 JNI 参考。 - 阶段 1 — 搭建 JNI 桥并逐个能力打通:
get_version→init/exists/validate→create/restore(带进度)→check→forget/prune→list_snapshots_db直写 SQLite;追加 opendal backend-options 贯通。 - 阶段 2 — 为新 JNI 符号接入 CMake + instrumented 测试;AIDL +
RemoteRootService接线。 - 阶段 3 — 本地 restore 迁移到 JNI rustic,贯通进度/plan 回调;发布 Rust release profile 使原生性能达到预期。
- Host 端测试(
base_test.rs):仓库探测/校验、快照创建-恢复-校验、多源快照、带进度快照、forget/prune、写 SQLite。 - 设备端测试(
RusticInstrumentedTest.kt):完整生命周期,并用SQLiteDatabase查询v_snapshots_full,覆盖新增 JNI 符号与opendal:fs非空选项贯通。
请从 Releases 获取 APK。
原作者 XayahSuSuSu:
本项目基于 XayahSuSuSu/Android-DataBackup 修改,遵循 GNU General Public License v3.0。














