Repository navigation
hi 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 इस तरह बनाया गया है कि कोई AI असिस्टेंट या एजेंट मॉड्यूल की हर सामग्री और क्रिया को headless रूप से प्रशासित कर सके, ठीक उसी तरह जैसे कोई व्यक्ति WebUI के माध्यम से करता है। WebUI तो बस एक छोटे JSON API का एक क्लाइंट है; आपका एजेंट दूसरा क्लाइंट है। API का उपयोग करें, WebUI को scrape न करें।
सब कुछ एक ही प्रवेश बिंदु से होकर गुजरता है, जो डिवाइस पर root के रूप में चलता है:
sh /data/adb/modules/vdbackup/scripts/helper.sh <verb> <base64(JSON-args)>
- आर्गुमेंट एक ही JSON ऑब्जेक्ट होते हैं, base64-encoded, जो एक argv टोकन के रूप में भेजे जाते हैं।
- कमांड stdout पर एक JSON ऑब्जेक्ट प्रिंट करता है:
{"ok":true,...}या{"ok":false,"code":"ERR_...","message":"..."}. उसे parse करें; कभी भी टेक्स्ट scrape न करें। - लंबी कार्रवाइयाँ (
backup,restore,import) तुरंत{"ok":true,"opid":"..."}लौटाती हैं और detached चलती हैं (कॉल करने वाले/WebUI के चले जाने पर भी वे जीवित रहती हैं)। उनकी प्रगति को poll करें; जब कॉल लौटता है तब वे पूरी नहीं हुई होतीं। -
progressऔरcancelएक JSON ऑब्जेक्ट नहीं, बल्कि कच्चे opid स्ट्रिंग का base64 लेते हैं।
आपके shell के लिए एक छोटा helper:
b64() { printf '%s' "$1" | base64 -w0; }
H=/data/adb/modules/vdbackup/scripts/helper.sh
sh "$H" backup "$(b64 '{"package":"com.example.app","mode":"full"}')"इसे किसी वर्कस्टेशन से चलाने के लिए, इसे अपने सामान्य root चैनल के माध्यम से डिवाइस तक चलाएँ
(root के रूप में adb shell, या एक SSH-to-root सेटअप)। मॉड्यूल बंडल किए गए बाइनरी के साथ आता है, इसलिए
एक बार इंस्टॉल होने के बाद स्थानीय backup/restore के लिए इसे इंटरनेट की ज़रूरत नहीं; केवल क्लाउड
गंतव्य (rclone/restic/ssh) ही नेटवर्क से बात करते हैं।
| Verb | Args (JSON) | Returns |
|---|---|---|
ping |
{} |
{ok,version,abi} |
overview |
{user?} |
{ok:true,apps,instances,path_backups,jobs,backups_size,free,total} गिनती (आकार bytes में): backups वाले ऐप्स, कुल backup इंस्टेंस, स्वतंत्र path backups, निर्धारित कार्य, कुल backups आकार, और backups फ़ाइल सिस्टम का खाली/कुल। non-detached, तुरंत लौटती है; WebUI होम ओवरव्यू द्वारा उपयोग की जाती है। |
config-get |
{} |
{ok,config} |
config-set |
config ऑब्जेक्ट (या {key,value}) |
{ok} |
keygen |
{} |
एन्क्रिप्शन के लिए age keypair बनाता है |
list-apps |
{user?} |
{ok,apps:[{package,label,system,versionCode}]} (dex, shell fallback) |
label |
{package,user?} |
{ok,label} (असली स्थानीयकृत ऐप नाम, संदर्भ-मुक्त) |
icon |
{package,user?,vc?} |
{ok,package,icon} (base64 PNG; प्रति package+vc कैश किया गया) |
backup |
नीचे देखें |
{ok,opid} (detached) |
restore |
नीचे देखें |
{ok,opid} (detached) |
import |
{from,ref,password,ssaid,user} |
{ok,opid} (detached) |
import-scan |
{from,path} |
{ok,backups:[...]} |
progress |
base64(opid) | live progress-<opid>.json
|
cancel |
base64(opid) | {ok,cancelled} |
list-ops |
{} |
{ok,ops:[...]} (पुनः कनेक्ट होने के बाद reattach) |
list-apps/icons
|
{user?} / {user?,items:[{package,vc}]}
|
ऐप सूची / बैच base64 आइकन |
list-backups |
{package?} |
{ok,backups:[{ref,package,label,versionName,versionCode,created_at,mode,items}]} |
list-users |
{} |
{ok,users:[{id,name}]} डिवाइस के Android उपयोगकर्ता (मल्टी-यूज़र). |
list-dirs |
{path} |
{ok,path,parent,dirs:[...]} किसी पथ की उप-निर्देशिकाएँ (फ़ोल्डर पिकर). |
path-list |
{user?} |
{ok,backups:[...]} स्वतंत्र फ़ोल्डर/फ़ाइल बैकअप. |
provenance |
{} |
बंडल बाइनरी का ऑडिट मैनिफ़ेस्ट (PROVENANCE.json). |
backup-info |
{ref} |
{ok,...} एक backup का पूरा विवरण (संस्करण, इंस्टॉल स्रोत, स्थिति, तिथि, mode, आकार, items, अनुमति गणना, डिवाइस) |
backup-icon |
{ref} |
{ok,icon} manifest से base64 PNG (ऐप अनइंस्टॉल होने पर भी काम करता है) |
delete-backup |
{ref} |
{ok,deleted} (ref का backups निर्देशिका के अंतर्गत होना आवश्यक) |
prune |
{package,user?,keep} |
{ok,pruned:[...]} किसी पैकेज के नवीनतम N रखें |
log-read |
{limit?} |
{ok,entries:[...]} ऑडिट लॉग, नवीनतम पहले |
log-export |
{user?} |
{ok:true,path} (backups डायरेक्टरी के अंदर लिखी गई .txt का पूर्ण path) या {ok:false,code:"ERR_LOG_EXPORT"}. गतिविधि लॉग (audit.jsonl) और एक छोटा build/डिवाइस हेडर एक ही उपयोगकर्ता-दृश्य टेक्स्ट फ़ाइल में लिखती है ताकि इसे bug रिपोर्ट से संलग्न किया जा सके। non-detached, तुरंत लौटती है। |
special-categories |
{} |
{ok,categories:[{id,available}]} (messages/contacts/wifi/bluetooth/calendar/wallpaper/dns/system_settings) |
special-backup |
{categories,compression?,password?,portable?} |
{ok,opid} सिस्टम-व्यापी backup (detached) |
special-restore |
{ref,confirm:true,categories?,password?} |
{ok,opid} (रिबूट आवश्यक; confirm इसे गेट करता है) |
special-list |
{} |
{ok,backups:[{ref,created_at,categories}]} |
path-backup |
{path,compression?,password?} |
{ok,opid} किसी भी निरपेक्ष पथ का tar.zst+manifest.json के रूप में .paths/ के अंतर्गत backup लेता है (detached) |
path-restore |
{ref,confirm:true,password?} |
{ok,opid} किसी पथ backup को उसके मूल स्थान पर restore करता है (confirm इसे गेट करता है; detached) |
sysmount-status |
{} |
{ok,nomount,nm,ksu,live_capable} |
sysmount-add / sysmount-del / sysmount-list
|
{package,priv?} |
किसी इंस्टॉल्ड ऐप को सिस्टम ऐप के रूप में माउंट करें (systemless उप-मॉड्यूल; NoMount के ज़रिए live अन्यथा अगले बूट पर) |
companion-status / companion-install
|
{} |
Google Drive साथी स्थिति / ऑन-डिमांड इंस्टॉल |
dests-list / dest-add / dest-test / dest-del
|
{id,type,...} |
गंतव्य प्रबंधन |
remote-add / remote-list / remote-del
|
{name,backend,params:{...}} |
rclone remote प्रबंधन (वह rclone.conf प्रविष्टि बनाता है जिसकी ओर type:"rclone" dest इशारा करता है); backend कोई भी rclone backend हो सकता है, कोई श्वेतसूची नहीं |
remote-authorize |
{backend} |
{ok:true,url} (इंजन पहले ही Android VIEW intent के ज़रिए फ़ोन का ब्राउज़र उस सहमति URL पर खोल चुका है) या {ok:false,code:"ERR_AUTHORIZE"}। ऑन-डिवाइस OAuth के लिए एक स्थानीय callback सर्वर (127.0.0.1:53682) पर rclone authorize <backend> चलाता है। |
remote-authorize-poll |
{} |
प्रतीक्षा के दौरान {ok:true,done:false,url}, उपयोगकर्ता की सहमति मिलने पर {ok:true,done:true,token} (वह token जो remote-add को भेजना है), या {ok:false,code:"ERR_AUTHORIZE"}। |
remote-authorize-cancel |
{} |
{ok:true,cancelled:true}; किसी लंबित प्राधिकरण को रोकता है। |
cloud-status |
{} |
{ok,rclone,restic,fetchable,size} (क्या rclone/restic बाइनरी मौजूद हैं, क्या यह lite संस्करण उन्हें ला सकता है, डाउनलोड आकार बाइट में) |
cloud-fetch |
{} |
{ok,opid} (detached) lite संस्करण पर rclone/restic ऐडऑन डाउनलोड+सत्यापन+इंस्टॉल करता है |
schedule-set / schedule-list / schedule-delete
|
नीचे देखें | निर्धारित कार्य (एक बैकअप या एक restore; एक अकेले ऐप, एक समूह, या सभी ऐप्स को लक्षित करते हुए) |
scheduler-tick |
{} |
देय कार्य चलाता है + धारण लागू करता है + ऑटो-बैकअप ऑब्ज़र्वर (boot heartbeat इसे कॉल करता है) |
update-check |
{} |
{ok,current_version,current_code,latest_version,latest_code,update_available,zipUrl,changelog,notes} (detached नहीं; तुरंत लौटता है; विफलता पर ERR_UPDATE_CHECK - नीचे देखें) |
progress को poll करने पर कार्रवाई का live progress-<opid>.json लौटता है। ये फ़ील्ड
हमेशा मौजूद रहते हैं:
| फ़ील्ड | प्रकार | अर्थ |
|---|---|---|
opid |
string | कार्रवाई id |
percent |
int | 0-100 पूर्णता |
phase |
string | वर्तमान चरण लेबल |
item |
string | संसाधित किया जा रहा वर्तमान आइटम प्रकार |
done |
bool | किसी टर्मिनल लेखन (finish / dry-run / restore-test) पर true |
एक चल रही कार्रवाई इन वैकल्पिक live फ़ील्ड को भी ले जा सकती है। अज्ञात होने पर ये अनुपस्थित या खाली रहते हैं, और टर्मिनल लेखनों पर हटा दिए जाते हैं (finish / dry-run / restore-test):
| फ़ील्ड | प्रकार | अर्थ |
|---|---|---|
rate |
string | स्थानांतरण गति, जैसे "4.2 MiB/s" (खाली = अज्ञात) |
eta |
string | अनुमानित शेष समय, जैसे "1m12s" (खाली = अज्ञात) |
n |
int | वर्तमान आइटम अनुक्रमणिका (0 = अज्ञात) |
of |
int | कुल आइटम गणना (0 = अज्ञात) |
cur |
string | वर्तमान आइटम नाम (खाली = कोई नहीं) |
क्लाउड ट्रांसफर rate/eta भरते हैं (percent rclone से आता है); स्थानीय Full backup
n/of/cur भरते हैं। चरण लेबल में चेकसम-सील चरण verified और, क्लाउड ट्रांसफर के लिए,
transfer तथा mirror <item> शामिल हैं।
{
"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 {ref} लेते हैं (एक backup निर्देशिका / scan ref)। restore यह भी स्वीकार करता है:
"items" (बैकअप के आइटम प्रकारों का एक उपसमुच्चय जिसे पुनर्स्थापित करना है; सभी के लिए छोड़ दें), "test": true
(एक temp निर्देशिका में निकालकर सत्यापित करें, बिना live ऐप को छुए), snapshot/mirror के लिए "mode",
किसी एन्क्रिप्टेड बैकअप के लिए "password", "ssaid" (opt-in), और इंस्टॉल-स्रोत विकल्प
"spoof_installer" (config से डिफ़ॉल्ट, इंस्टॉल के समय installer को Play Store पर सेट करता है) तथा
"deep_spoof": true (उन्नत opt-in; पैकेज डेटाबेस संपादित करके आरंभकर्ता पैकेज और पैकेज स्रोत को भी गढ़ता
है, एक रिबूट के बाद लागू होता है)। import "from": "neo" | "databackup" लेता है और, किसी
एन्क्रिप्टेड Neo backup के लिए, "password"।
एक निर्धारित कार्य एक लक्ष्य और एक action चुनता है:
{
"id": "nightly-games",
"action": "backup", // "backup" (default) | "restore"
"package": "com.example.app", // एक ऐप - या -
"packages": ["com.a","com.b"], // ऐप्स का एक समूह - या -
"all": true, // सभी ऐप्स, बहिष्कृत-ऐप्स सूची को छोड़कर
"cron": "daily", // hourly | daily | weekly
"at": "02:30", // HH:MM
"mode": "full",
"dest": "local",
"keep": 5,
"items": ["apk","data"],
"require_wifi": false, // गेट: केवल Wi-Fi पर चलाएँ
"require_charging": false, // गेट: केवल चार्ज होते समय चलाएँ
"min_battery": 0, // गेट: केवल इस बैटरी स्तर या उससे ऊपर चलाएँ % (0-100)
"days": [1,2,3,4,5] // गेट: केवल इन सप्ताह-दिनों पर चलाएँ (0=रविवार)
}लक्ष्य के लिए package, packages या all में से ठीक एक दें। एक backup कार्य सामान्य
mode/dest/keep/items बनाए रखता है। एक restore कार्य (action: "restore") हर लक्षित ऐप का सबसे हाल
का backup (या एक स्पष्ट ref) restore करता है और हर रन पर ऐप के वर्तमान डेटा को अधिलेखित करता है - यह
जानबूझकर और opt-in है, इसलिए इसे केवल उपयोगकर्ता के सीधे अनुरोध पर ही सेट करें।
एक निर्धारित कार्य वैकल्पिक गेट शर्तें ले जा सकता है। जब किसी देय कार्य की गेट पूरी न हो,
तो उसे छोड़ दिया जाता है और अगले tick पर, उसके शेड्यूल को आगे बढ़ाए बिना, पुनः प्रयास किया
जाता है (उसका last_run मुहर नहीं किया जाता, इसलिए शर्त पूरी होते ही वह चल पड़ता है):
| फ़ील्ड | प्रकार | गेट |
|---|---|---|
require_wifi |
bool | केवल Wi-Fi पर होते हुए चलाएँ |
require_charging |
bool | केवल चार्ज होते समय चलाएँ |
min_battery |
int (0-100) | केवल इस बैटरी स्तर या उससे ऊपर चलाएँ |
days |
array of int (0-6, 0=रविवार) | केवल इन सप्ताह-दिनों पर चलाएँ |
इनके ऊपर हमेशा एक न्यूनतम ऊष्मीय सुरक्षा जाँच लागू होती है: जब तक डिवाइस गंभीर रूप से गर्म
है, एक निर्धारित कार्रवाई छोड़ दी जाती है। हर गेट स्किप audit trail में op:"scheduler-gated" के
रूप में wifi / charging / battery / days / thermal में से किसी reason के साथ लिखा
जाता है।
एक क्लाउड गंतव्य एक type:"rclone" dest है जो किसी rclone remote का नाम देता है; उस
remote को पहले remote-add से बनाएँ। backend कोई भी rclone backend हो सकता है - कोई
श्वेतसूची नहीं है। remote-add किसी भी backend नाम को स्वीकार करता है (dropbox, onedrive,
box, pcloud, mega, b2, s3, sftp, smb, webdav, ftp, drive और rclone द्वारा
समर्थित ~70 अन्य), और params सीधे key=value जोड़ियों के रूप में rclone config में भेज दिए
जाते हैं। पासवर्ड फ़ील्ड अस्पष्ट रूप में संग्रहीत होते हैं, कभी भी स्पष्ट रूप में नहीं। सामान्य backend और
उनके 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"`)
ऑन-डिवाइस OAuth (बिना PC के)। जिन backend को ब्राउज़र से साइन-इन चाहिए (Google Drive, Dropbox,
OneDrive, Box, pCloud) उन्हें किसी डेस्कटॉप या हाथ से चिपकाए गए token की ज़रूरत नहीं। remote-authorize
को {backend} के साथ कॉल करें: इंजन एक स्थानीय callback सर्वर (127.0.0.1:53682) पर
rclone authorize <backend> चलाता है और Android VIEW intent के ज़रिए फ़ोन का अपना ब्राउज़र प्रदाता के
सहमति पृष्ठ पर खोलता है, और {ok:true,url} लौटाता है (या {ok:false,code:"ERR_AUTHORIZE"})।
remote-authorize-poll ({}) को poll करें: यह प्रतीक्षा के दौरान {ok:true,done:false,url} और
उपयोगकर्ता की मंज़ूरी मिलने पर {ok:true,done:true,token} लौटाता है - वह token remote-add को भेजें।
remote-authorize-cancel ({}) किसी लंबित प्राधिकरण को रोकता है ({ok:true,cancelled:true})। किसी भी
कंप्यूटर से rclone authorize "<backend>" के आउटपुट को हाथ से चिपकाना अब भी फ़ॉलबैक के रूप में समर्थित है।
Google Drive के दो रास्ते हैं: यह drive remote (किसी Google Cloud प्रोजेक्ट की ज़रूरत नहीं, rclone के
अपने OAuth का उपयोग करता है - ऑन-डिवाइस remote-authorize से प्राधिकृत करें, या किसी भी कंप्यूटर पर एक
बार rclone authorize "drive" चलाएँ और token भेजें) या opt-in साथी ऐप (आपका अपना OAuth client id)।
दोनों अंततः सामान्य गंतव्य बन जाते हैं।
config फ़ील्ड network_policy नियंत्रित करता है कि क्लाउड ट्रांसफर कौन-सा कनेक्शन उपयोग कर सकते हैं:
any (default), wifi, या mobile। इसे config-set से सेट करें। जब यह wifi या
mobile हो, तो हर क्लाउड ट्रांसफर (Full rclone/Drive अपलोड, Mirror sync, remote
restic snapshot backup/restore, Mirror restore) पहले सक्रिय ट्रांसपोर्ट जाँचता है और
मेल न खाने पर ERR_NET_POLICY के साथ रुक जाता है - मैनुअल और निर्धारित दोनों कार्यों के लिए।
स्थानीय गंतव्यों पर कभी रोक नहीं लगती।
-
चेकसम सील (क्लाउड)। किसी सफल क्लाउड कॉपी के बाद engine एक remote चेकसम जाँच
(
rclone check) चलाता है; मेल न खाने पर कार्रवाईERR_VERIFYके साथ विफल होती है। जिन backend का स्थानीय पक्ष के साथ कोई साझा hash नहीं होता, उन्हें छोड़ दिया जाता है (यह विफलता नहीं है)। -
कोटा जाँच (क्लाउड, Full mode)। किसी
rcloneremote पर Full-mode अपलोड से पहले engine remote का खाली स्थान (rclone about --json) पूछता है और यदि backup फ़िट न हो तोERR_QUOTAके साथ मना कर देता है। जो remote कोटा जानकारी नहीं बताते, उन्हें छोड़ दिया जाता है। Mirror mode एक delta sync है और इससे मुक्त है।
full संस्करण सभी बाइनरी को बंडल करता है और कभी नेटवर्क की ज़रूरत नहीं होती। lite संस्करण दो
सबसे बड़ी, rclone और restic, को छोड़ देता है और जब आप पहली बार कोई क्लाउड या snapshot क्रिया
चलाते हैं तब उन्हें ऑन-डिमांड लाता है। cloud-status बताता है कि क्या वे पहले से मौजूद हैं, क्या यह
संस्करण उन्हें ला सकता है, और डाउनलोड आकार बाइट में। cloud-fetch detached चलता है (इसके
opid के साथ progress को पोल करें): यह प्रति-आर्किटेक्चर rclone+restic ऐडऑन डाउनलोड करता है,
मॉड्यूल में बेक किए गए SHA-256 के विरुद्ध उसे सत्यापित करता है, और उसे रनटाइम कैश में इंस्टॉल करता
है। इसके प्रगति चरण downloading, verifying, और installing हैं; अंतिम कोड सफलता पर ERR_NONE
है, या विफलता पर ERR_FETCH (डाउनलोड विफल) / ERR_FETCH_VERIFY (चेकसम मेल नहीं खाया, छोड़ दिया
गया)। full संस्करण पर यह अनावश्यक है। lite संस्करण पर किसी क्लाउड या snapshot गंतव्य के लिए
backup/restore, बाइनरी मौजूद होने से पहले, ERR_CLOUD_FETCHABLE के साथ विफल होता है; क्लाइंट
को cloud-fetch चलाने की पेशकश करनी चाहिए, फिर पुनः प्रयास करना चाहिए।
special-categories बताता है कि किसी डिवाइस में कौन-सी सिस्टम-व्यापी श्रेणियाँ हैं; special-backup
उन श्रेणियों को कैप्चर करता है जो आप categories में पास करते हैं और special-restore उन्हें फिर से
लागू करता है। श्रेणियाँ हैं:
| श्रेणी | यह क्या है | restore शब्दार्थ |
|---|---|---|
messages |
SMS/MMS | provider प्रतिस्थापन (मिटाएँ + निकालें) |
contacts |
संपर्क और कॉल लॉग | provider प्रतिस्थापन (मिटाएँ + निकालें) |
wifi |
सहेजे गए Wi-Fi नेटवर्क | provider प्रतिस्थापन (मिटाएँ + निकालें) |
bluetooth |
Bluetooth जोड़ियाँ | provider प्रतिस्थापन (मिटाएँ + निकालें) |
calendar |
कैलेंडर provider (com.android.providers.calendar, app + डेटा); calendar.json में पोर्टेबल रूप से भी निर्यात |
provider प्रतिस्थापन (मिटाएँ + निकालें) |
wallpaper |
होम और लॉक वॉलपेपर तथा wallpaper_info.xml, कच्चे (बाइनरी) रूप में संग्रहीत |
फ़ाइलें प्रतिस्थापित |
dns |
निजी DNS mode और विनिर्देशक, settings से पढ़ा गया | idempotent settings put
|
system_settings |
system/global/secure settings का पूरा dump |
opt-in, idempotent settings put, डिवाइस settings को अधिलेखित करता है |
system_settings कड़ाई से opt-in है और restore पर विनाशकारी है। ssaid की तरह, यह restore
किए जाने पर डिवाइस-व्यापी settings को अधिलेखित करता है, इसलिए यह उपयोगकर्ता की स्पष्ट सहमति के पीछे
गेट किया गया है और audit trail में लिखा जाता है। इसे कभी default रूप से न चुनें; केवल किसी सीधे,
जानबूझकर किए गए उपयोगकर्ता अनुरोध पर।
path-backup / path-restore साझा स्टोरेज पर या /data के अंतर्गत किसी भी निरपेक्ष पथ - एक
फ़ोल्डर या एक अकेली फ़ाइल - का backup और restore करते हैं, प्रति-app मॉडल से बाहर। संग्रह
VDBackup के अपने प्रारूप में tar.zst तथा एक manifest.json के रूप में लिखा जाता है (SHA-256
सीलबंद, एन्क्रिप्टेड होने पर एक RECOVERY kit के साथ), backups निर्देशिका में .paths/ के अंतर्गत।
// path-backup
{ "path": "/sdcard/DCIM/Camera", "compression": "zstd:10", "password": "..." }
// path-restore
{ "ref": "<.paths ref>", "confirm": true, "password": "..." }- स्रोत पथ निरपेक्ष होना चाहिए और अनुमत रूट्स में से एक के अंतर्गत होना चाहिए:
/storage/emulated,/data/media,/sdcard,/data. जो पथ मौजूद नहीं है वहERR_NO_PATHके साथ विफल होता है; अनुमत रूट्स से बाहर का पथ, या..वाला पथ,ERR_BAD_PATHके साथ विफल होता है। -
path-restoreमूल स्थान पर वापस लिखता है, इसलिए यह विनाशकारी है और"confirm": trueकी माँग करता है -special-restoreकी तरह एक भारी-घर्षण वाला गेट। एकrefजो वैध पथ backup नहीं है,ERR_BAD_REFके साथ विफल होता है। - दोनों detached चलते हैं; लौटाए गए
opidके साथprogressको poll करें।
update-check बताता है कि मॉड्यूल का कोई नया संस्करण प्रकाशित हुआ है या नहीं, ताकि कोई एजेंट
(या WebUI) उसे दिखा सके। यह एक तुरंत लौटने वाला read verb है - यह detached नहीं है, इसलिए
poll करने के लिए कोई opid नहीं होता। केवल उपयोगकर्ता की स्पष्ट क्रिया से ट्रिगर होकर, यह बंडल किए
गए curl से root-साइड HTTP अनुरोध के ज़रिए मॉड्यूल का प्रकाशित अपडेट मैनिफ़ेस्ट (module.prop में से
updateJson URL) लाता है - यह WebView के बाहर चलता है, इसलिए WebUI की CSP के अधीन नहीं है - और
प्रकाशित versionCode की तुलना इंस्टॉल किए गए से करता है। यह कोई आर्गुमेंट नहीं लेता।
सफल होने पर यह लौटाता है:
| फ़ील्ड | प्रकार | अर्थ |
|---|---|---|
ok |
bool | true |
current_version |
string | इंस्टॉल किया गया versionName |
current_code |
int | इंस्टॉल किया गया versionCode |
latest_version |
string | प्रकाशित versionName |
latest_code |
int | प्रकाशित versionCode |
update_available |
bool |
true जब latest_code, current_code से बड़ा हो |
zipUrl |
string | प्रकाशित zip का URL |
changelog |
string | प्रकाशित changelog का URL |
notes |
string | रिलीज़ नोट्स |
यदि कोई updateJson URL नहीं है, नेटवर्क अनुरोध विफल हो जाता है, या मैनिफ़ेस्ट पार्स नहीं हो पाता,
तो यह {"ok":false,"code":"ERR_UPDATE_CHECK"} लौटाता है।
update-check केवल उपलब्धता और रिलीज़ नोट्स की रिपोर्ट करता है; अपडेट स्वयं आपका root मैनेजर
(KernelSU / APatch / Magisk) मॉड्यूल के updateJson के ज़रिए करता है, कभी भी यह verb नहीं।
-
ssaidकड़ाई से opt-in है (default बंद)। यह एक सिस्टम फ़ाइल को फिर से लिखकर डिवाइस के ANDROID_ID का backup / restore करता है; कोई restore केवल एक reboot के बाद लागू होता है, और पिछली फ़ाइल rollback के लिए हमेशा पहले सहेजी जाती है।"ssaid": trueकेवल किसी सीधे, जानबूझकर किए गए उपयोगकर्ता अनुरोध पर भेजें - कभी भी default रूप से नहीं। -
परिवर्तनकारी क्रियाएँ (restore, delete, import) विनाशकारी हैं और एक स्थानीय ऑडिट
ट्रेल (
logs/audit.jsonl) में लॉग की जाती हैं। Restore विश्वासयोग्य है (wipe-फिर-निकालें), इसलिए यह ऐप को backup की ठीक-ठीक स्थिति में वापस कर देता है। उन्हें कॉल करने से पहले इरादे की पुष्टि करें। -
system_settingsopt-in और विनाशकारी है, ठीकssaidकी तरह। इसे restore करना डिवाइस-व्यापी settings को अधिलेखित करता है, इसलिए इसे केवल किसी सीधे उपयोगकर्ता अनुरोध पर भेजें; यह स्पष्ट सहमति द्वारा गेट किया गया है और audit trail में दर्ज होता है। -
Restore idempotent है। कच्चे provider restore (messages/contacts/wifi/bluetooth/calendar)
विलय करने के बजाय प्रतिस्थापित करते हैं - provider डेटा मिटा दिया जाता है और संग्रह उसके ऊपर
निकाला जाता है - इसलिए उसी backup को फिर से restore करने से पंक्तियाँ दोहराई नहीं जा सकतीं।
dnsऔरsystem_settingsidempotentsettings putसे फिर से लागू किए जाते हैं। -
संग्रह निष्कर्षण पथ-ट्रैवर्सल के विरुद्ध सुरक्षित है। Restore root के रूप में चलता है, इसलिए हर
संग्रह (restore, import, special-restore, path-restore) किसी भी लेखन से पहले जाँचा जाता है: वह संग्रह
जिसके सदस्य निरपेक्ष पथ उपयोग करते हैं या
..रखते हैं, एक भी विनाशकारी लेखन होने से पहलेERR_UNSAFE_ARCHIVEके साथ पहले ही अस्वीकार कर दिया जाता है (GNU tar भी--no-absolute-namesके साथ चलता है)। एक छेड़छाड़ किया गया संग्रह कभी अपनी लक्ष्य निर्देशिका से बाहर नहीं निकल सकता। - संरक्षण (SELinux/uid/gid/modes/xattr) या APK नियम (APK हमेशा संपीड़ित होते हैं,
कभी एन्क्रिप्ट नहीं जब तक
encrypt_apkसेट न हो) को कभी कमज़ोर न करें। - JSON आउटपुट को सत्य के स्रोत के रूप में लें;
ok/codeजाँचें,progresspoll करें, और अनुमान लगाने के बजायERR_*कोड सामने लाएँ।
आंतरिक विवरण के लिए ARCHITECTURE.md और FILE-STRUCTURE.md देखें।
यह दस्तावेज़ीकरण Claude (Anthropic) के साथ तैयार किया गया था और इसे VD171 द्वारा अनुरक्षित किया जाता है। सुधार और बेहतरी का स्वागत है - CONTRIBUTING.md देखें।