Repository navigation
de AI AGENTS
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 ist so gebaut, dass ein KI-Assistent oder -Agent jeden Inhalt und jede Aktion des Moduls kopflos verwalten kann, genauso wie ein Mensch es über die WebUI tut. Die WebUI ist nur ein Client einer kleinen JSON-API; dein Agent ist ein weiterer. Nutze die API, scrape nicht die WebUI.
Alles läuft über einen einzigen Einstiegspunkt, als root auf dem Gerät ausgeführt:
sh /data/adb/modules/vdbackup/scripts/helper.sh <verb> <base64(JSON-args)>
- Argumente sind ein einzelnes JSON-Objekt, base64-kodiert, als ein argv-Token übergeben.
- Der Befehl gibt ein JSON-Objekt auf stdout aus:
{"ok":true,...}oder{"ok":false,"code":"ERR_...","message":"..."}. Parse das; scrape niemals Text. - Lange Operationen (
backup,restore,import) geben sofort{"ok":true,"opid":"..."}zurück und laufen abgekoppelt (sie überleben es, wenn der Aufrufer/die WebUI verschwindet). Frage ihren Fortschritt per Polling ab; sie sind nicht fertig, wenn der Aufruf zurückkehrt. -
progressundcancelnehmen base64 der rohen opid-Zeichenkette, kein JSON-Objekt.
Ein winziger Helfer für deine Shell:
b64() { printf '%s' "$1" | base64 -w0; }
H=/data/adb/modules/vdbackup/scripts/helper.sh
sh "$H" backup "$(b64 '{"package":"com.example.app","mode":"full"}')"Um es von einer Workstation aus zu steuern, führe das über deinen üblichen root-Kanal
zum Gerät aus (adb shell als root oder ein SSH-zu-root-Setup). Das Modul liefert gebündelte
Binärdateien mit, sodass es nach der Installation kein Internet für lokales
Backup/Restore benötigt; nur Cloud-Ziele (rclone/restic/ssh) sprechen mit dem Netzwerk.
| Verb | Args (JSON) | Gibt zurück |
|---|---|---|
ping |
{} |
{ok,version,abi} |
config-get |
{} |
{ok,config} |
config-set |
das config-Objekt (oder {key,value}) |
{ok} |
keygen |
{} |
erzeugt das age-Schlüsselpaar für die Verschlüsselung |
list-apps |
{user?} |
{ok,apps:[{package,label,system,versionCode}]} (dex, Shell-Fallback) |
label |
{package,user?} |
{ok,label} (echter lokalisierter App-Name, kontextfrei) |
icon |
{package,user?,vc?} |
{ok,package,icon} (base64-PNG; pro package+vc zwischengespeichert) |
backup |
siehe unten |
{ok,opid} (abgekoppelt) |
restore |
siehe unten |
{ok,opid} (abgekoppelt) |
import |
{from,ref,password,ssaid,user} |
{ok,opid} (abgekoppelt) |
import-scan |
{from,path} |
{ok,backups:[...]} |
progress |
base64(opid) | das Live-progress-<opid>.json
|
cancel |
base64(opid) | {ok,cancelled} |
list-ops |
{} |
{ok,ops:[...]} (nach dem Wiederverbinden erneut anhängen) |
list-apps/icons
|
{user?} / {user?,items:[{package,vc}]}
|
App-Liste / base64-Icons im Batch |
list-backups |
{package?} |
{ok,backups:[{ref,package,label,versionName,versionCode,created_at,mode,items}]} |
backup-info |
{ref} |
{ok,...} alle Details eines Backups (Version, Installationsquelle, Status, Datum, Modus, Größe, Elemente, Berechtigungszählungen, Gerät) |
backup-icon |
{ref} |
{ok,icon} base64-PNG aus dem Manifest (funktioniert, wenn die App deinstalliert ist) |
delete-backup |
{ref} |
{ok,deleted} (ref muss unter dem backups-Verzeichnis liegen) |
prune |
{package,user?,keep} |
{ok,pruned:[...]} die neuesten N eines Pakets behalten |
log-read |
{limit?} |
{ok,entries:[...]} Audit-Protokoll, das Neueste zuerst |
special-categories |
{} |
{ok,categories:[{id,available}]} (messages/contacts/wifi/bluetooth) |
special-backup |
{categories,compression?,password?,portable?} |
{ok,opid} systemweites Backup (abgekoppelt) |
special-restore |
{ref,confirm:true,categories?,password?} |
{ok,opid} (Neustart erforderlich; confirm schaltet es frei) |
special-list |
{} |
{ok,backups:[{ref,created_at,categories}]} |
sysmount-status |
{} |
{ok,nomount,nm,ksu,live_capable} |
sysmount-add / sysmount-del / sysmount-list
|
{package,priv?} |
eine installierte App als System-App einhängen (systemloses Submodul; live über NoMount, sonst beim nächsten Start) |
companion-status / companion-install
|
{} |
Status des Google-Drive-Begleiters / Installation bei Bedarf |
dests-list / dest-add / dest-test / dest-del
|
{id,type,...} |
Zielverwaltung |
remote-add / remote-list / remote-del
|
{name,backend,params:{...}} |
rclone-Remote-Verwaltung (erstellt den rclone.conf-Eintrag, auf den ein type:"rclone"-Ziel zeigt) |
schedule-set / schedule-list / schedule-delete
|
{id,package,mode,dest,cron,at,keep,items} |
geplante Aufträge |
scheduler-tick |
{} |
führt fällige Aufträge aus + wendet Aufbewahrung an + den Auto-Backup-Beobachter (der Boot-Heartbeat ruft das auf) |
{
"package": "com.example.app",
"user": 0,
"mode": "full", // full | snapshot | mirror
"compression": "zstd:10", // none | lz4 | zstd[:N] | gzip
"items": ["apk","data","data_de","obb","external","media"],
"encrypt_data": false,
"encrypt_apk": false,
"dest": "local", // local | <destination id>
"verify": true, // re-hash each archive vs the manifest (default on for Full)
"dry_run": false, // true = report a size plan, write nothing
"ssaid": false // OPT-IN, see below
}restore/import nehmen {ref} (ein Backup-Verzeichnis / Scan-ref). restore akzeptiert
außerdem: "items" (eine Teilmenge der Elementtypen des Backups zum Wiederherstellen; weglassen
für alle), "test": true (in ein temporäres Verzeichnis extrahieren und verifizieren, ohne die
Live-App zu berühren), "mode" für snapshot/mirror, "password" für ein verschlüsseltes Backup,
"ssaid" (opt-in) und die Installationsquellen-Optionen "spoof_installer" (Standard aus der
Konfiguration, setzt den Installer zur Installationszeit auf den Play Store) und
"deep_spoof": true (erweitertes Opt-in; fälscht zusätzlich das initiierende Paket und die
Paketquelle durch Bearbeiten der Paketdatenbank, wirkt nach einem Neustart). import nimmt
"from": "neo" | "databackup" und, für ein verschlüsseltes Neo-Backup, "password".
Ein Cloud-Ziel ist ein type:"rclone"-Ziel, das ein rclone-Remote benennt; erstelle
dieses Remote zuerst mit remote-add. Passwort-Felder werden verschleiert gespeichert, nie
im Klartext. Unterstützte backend-Werte und ihre params:
sftp : host, port, user, pass smb : host, port, user, pass
ftp : host, port, user, pass webdav: url, vendor, user, pass
s3 : provider, access_key_id, secret_access_key, endpoint, region
drive : token, scope (token = output of `rclone authorize "drive"`)
Google Drive hat zwei Wege: dieses drive-Remote (kein Google-Cloud-Projekt nötig, nutzt
rclones eigenes OAuth - führe rclone authorize "drive" einmal auf einem beliebigen Computer
aus und übergib den Token) oder die optionale Begleit-App (deine eigene OAuth-Client-ID).
Beide enden als gewöhnliche Ziele.
Das config-Feld network_policy steuert, welche Verbindung Cloud-Transfers nutzen dürfen:
any (Standard), wifi oder mobile. Setze es mit config-set. Wenn es wifi oder
mobile ist, prüft jeder Cloud-Transfer (Full-rclone/Drive-Upload, Mirror-Sync,
restic-Remote-Snapshot-Backup/-Restore, Mirror-Restore) zuerst den aktiven Transport und
bricht mit ERR_NET_POLICY ab, wenn er nicht passt - sowohl für manuelle als auch für geplante
Aufträge. Lokale Ziele werden nie eingeschränkt.
-
ssaidist strikt Opt-in (standardmäßig aus). Es sichert / stellt die ANDROID_ID des Geräts wieder her, indem es eine Systemdatei umschreibt; eine Wiederherstellung greift erst nach einem Neustart, und die vorherige Datei wird für ein Rollback immer zuerst gesichert. Sende"ssaid": truenur auf eine direkte, bewusste Benutzeranfrage hin - niemals standardmäßig. -
Mutierende Aktionen (restore, delete, import) sind destruktiv und werden in einem lokalen
Audit-Protokoll (
logs/audit.jsonl) festgehalten. Restore ist originalgetreu (löschen-dann-extrahieren), sodass die App auf den exakten Zustand des Backups zurückgesetzt wird. Bestätige die Absicht, bevor du sie aufrufst. -
Schwäche niemals die Bewahrung ab (SELinux/uid/gid/Modi/xattr) oder die APK-Regel (APKs
werden immer komprimiert, nie verschlüsselt, es sei denn,
encrypt_apkist gesetzt). - Behandle die JSON-Ausgabe als Quelle der Wahrheit; prüfe
ok/code, frageprogressper Polling ab und gibERR_*-Codes aus, statt zu raten.
Siehe ARCHITECTURE.md und FILE-STRUCTURE.md für die Interna.
Diese Dokumentation wurde mit Claude (Anthropic) erstellt und wird von VD171 gepflegt. Korrekturen und Verbesserungen sind willkommen - siehe CONTRIBUTING.md.