Repository navigation
zh ARCHITECTURE
VD $ VD171 @ Priv8 edited this page Nov 4, 2026
·
1 revision
Languages: English | العربية | Čeština | Deutsch | Español | فارسی | Français | हिन्दी | Bahasa Indonesia | Italiano | 日本語 | 한국어 | Nederlands | Polski | Português | Русский | Svenska | ไทย | Türkçe | Tiếng Việt | 中文
VDBackup 是一个 root WebUI 模块。它分为三层:WebUI(你所看到的部分)、 shell 后端(以 root 身份完成实际工作的部分),以及捆绑的二进制文件 (归档工具和传输工具)。一切都已经以 root 身份运行,因此核心功能既没有 权限请求提示,也没有配套应用。
┌──────────────────────────────────────────────────────────┐
│ WebUI (module/webroot, vanilla JS) │
│ index.html · scripts.js · i18n.js · styles.css │
│ lang/en.js + 21 languages · config.json (CSP, no net) │
└───────────────┬──────────────────────────────────────────┘
│ ksu.exec("sh scripts/helper.sh <verb> <b64json>")
▼
┌──────────────────────────────────────────────────────────┐
│ scripts/helper.sh (dispatcher, returns JSON) │
│ list-apps · config · dests · backup/restore/import ... │
│ long ops -> setsid nohup scripts/worker.sh (detached) │
└───────────────┬───────────────────────────────┬──────────┘
│ │ progress-<opid>.json (poll)
▼ ▼
┌────────────────────────────────────┐ ┌──────────────────────────┐
│ scripts/worker.sh (root, detached)│ │ framework helper (opt.) │
│ force-stop · tar|zstd|age │ │ app_process + dex │
│ pm install · chown/chcon │ │ perms/appops/ssaid/... │
│ transfer · notify │ │ (dex primary, shell fb) │
└───────────────┬────────────────────┘ └──────────────────────────┘
▼
┌──────────────────────────────────────────────────────────┐
│ bin/<abi>/ tar · zstd · lz4 · rclone · rsync · ssh · restic │
└──────────────────────────────────────────────────────────┘
▼
Destinations: local · SFTP/SCP · SMB · WebDAV · FTP · S3 · 70+ (rclone)
rsync · restic repos · Google Drive (opt-in companion)
-
已是 root。 模块进程以 root 运行,因此引擎就是纯 shell。约 85% 的工作是
纯 shell(
tar/zstd/age/pm/am/chown/chcon/rclone/...)。 -
分离执行。 备份/恢复通过
setsid nohup作为独立的 root 进程运行。关闭 WebUI 不会中断它们;UI 通过读取logs/progress-<opid>.json重新连接。 -
框架辅助程序(~15%)。 细粒度权限、AppOps、SSAID、StorageStats、
图标和有特权的 Wi-Fi 需要 Android 框架。一个通过
app_process运行的 小型dex(没有已安装的应用)处理这些,并带有 shell 回退方案。 - 可移植性。 仅使用标准格式;备份无需此模块即可在 PC 上打开。
-
状态存放在
/data/adb/vdbackup/(配置、任务、目标、加密的 凭据、日志、暂存)。备份写入用户可见、凭据加密的存储/sdcard/VDBackup/(/data/media/<user>/VDBackup,按用户), 而不是/data/adb(它是设备加密的,且在首次解锁前可读)。
备份必须永远保持可恢复。这是一条硬性规则,而非尽力而为。
范围。 该保证涵盖由 v1.01 及以后(首个正式发布的版本)写入的备份,且仅涵盖正式发布的 已发行版本。v1.00 是一个仅供测试的构建,明确不在范围内;预发布和开发构建不在覆盖之列。从首个 公开版本起,下面的承诺是绝对的:
-
仅标准格式。 每个归档都是用
zstd、gzip或lz4压缩的普通tar, 可选择用age包装。没有专有容器,因此即使没有此模块,也可以用普通工具在任何 PC 上打开备份(参见etc/RECOVERY.md)。这是一种我们不能放弃的格式。 -
仅追加的元数据。
manifest.json携带format_version。该架构只会 增长:字段只能被添加,绝不会被移除、重命名或改作他用。恢复会防御性地 读取每个字段(缺失的可选字段回退到默认值),并根据文件名和扩展名来安装 APK 和提取归档,而不是假定固定的 manifest 结构。 - 向前兼容的恢复。 恢复绝不会因为备份陈旧而拒绝它,较旧的 VDBackup 会悄悄 跳过它不认识的条目类型,而不是失败。因此,较新的 VDBackup 能够恢复任何较旧的 备份,而标准格式的归档无论如何都能手动恢复。
简而言之:VDBackup 曾经写入的任何内容,未来的每一个 VDBackup(以及一台普通
PC)都仍然能够恢复。以破坏先前备份的方式更改格式是不被允许的;新功能都添加在
format_version 和新的、追加式的字段之后。
关于完整的技术设计(归档格式、元数据架构、流水线、加密、目标、导入器),维护者 保留着详细的设计笔记;本文件是面向贡献者的概览。