4 Commits

Author SHA1 Message Date
Yawasau
05130a9898 feat: 流式備份/恢復、遠端預掃優化、增量邏輯強化
新功能
- 流式備份/恢復: remote_stream=1 支援 SMB+WebDAV 邊壓邊傳不佔本機空間
- 遠端預掃: 單次連線取全部列表 + 批量 json 下載 (120 往返→6 連線)
- 主循環增量比對零網路開銷 (讀本地快取)
- 最終計數核驗 verify_backup_manifest (三態顯示)
- conf 重構: smb_url/webdav_url 按協議分組,切換 remote_type 免重輸

修復
- 流式 staging 以遠端 json 快取為種子,解決權限/SSAID 無變化仍重備
- 上傳 json 前合併遠端版本,防 version 等欄位被部分覆蓋丟失
- 版本比對讀本地同步副本,修復流式模式每輪誤報版本變化
- 清單偵測版本更新強制重備 apk,防 json 被失敗輪汙染後 apk 缺檔
- apk 版本相符仍核對遠端檔存在性,污染數據自動自愈
- 流式失敗不傳 json,確保下輪整體重備不殘留壞數據
- smbclient cd 失敗停留根目錄導致列表/大小統計污染 → 前綴過濾
- WebDAV href URL 編碼改通用 %XX awk 查表解碼 (中文/空格/+ 全解)
- json 預掃改全量批量抓,不再靠列表交集 (修 smbclient 中文名轉碼毀名)
- 殺舊進程改單次 ps 快照整樹殺 (修 busybox ps 無 PPID / 誤殺自身)
- smbclient stdin 命令還原內嵌換行 (修中文多層路徑建目錄失敗)
- 連線失敗轉本地備份時補顯本地分區統計
- ms_to_readable 對永不休眠值特判顯示
- 單 app 備份入口補遠端預掃流程
- .changed_apps 去重、TMPDIR 殘留全清、tab 縮排統一

優化
- 遠端預掃: 120 連線→6 連線,主循環零網路開銷
- 殺舊進程: ~15 秒→< 1 秒 (逐 /proc 遞迴→單次 ps 快照 awk)
- 批量權限: JVM fork 3N→3
2026-06-13 12:29:18 +08:00
Yawasau
debf83a88c perf: 備份提速近3倍, dex調用批量化, 修復數個bug
性能優化:
- 並行目錄大小預掃(8並發), 主迴圈查表免重複遍歷, 提速約3倍
- 零fork查表: 權限/版本/UID/安裝來源/後台狀態改載入動態變量純記憶體查詢
- _dir_size改寫全域變量返回, 消除子shell fork
- 內建glob取代ls檢查tar存在性
- 備份權限預掃批量(getRuntimePermissions 1次+awk分組生成JSON)
- 恢復權限批量設置, JVM啟動3N→3
- appops reset集中執行

新增功能:
- 恢復後權限驗證(讀回比對授予/拒絕, _perm_verify=0可關)
- dex調用計數器(_dex_debug=1)
- 批量權限進度提示

問題修復:
- 權限JSON以包名為鍵導致多權限互相覆蓋只存1個(改為權限名為鍵), 舊備份需重備
- 自定義資料夾含點名稱(service.d)恢復時被誤截斷, 改為只去.tar/.tar.zst後綴
- _dir_size處理非應用名稱的bad substitution, 加變量名防呆
- grep -qFx改精確awk比對
2026-06-07 16:27:12 +08:00
Yawasau
e31c31515c feat: 權限預掃/JSON驗證/遠端比對/互動統一及多項修復
功能新增:
- ask_yn helper 統一 Lo=0/1/2 互動邏輯
- prepare_permissions_map 備份前預掃 runtime permissions,取代逐 app fork dex
- 備份完成後自動驗證本次變動應用的 JSON 結構
- remote_list_backups 加入本地/遠端差異比對,支援直接補上傳/補下載
- show_conf/remote_conf_line 各功能執行前顯示對應 conf
- get_backup_dirname/per_app_upload_and_cleanup 邏輯抽成獨立函數

邏輯修復:
- Backup_Permissions/Backup_ssaid 移出 size 判斷,size 無變化時也偵測變更
- 權限變更列出具體項目 (permName: false→true)
- .changed_apps 去重從 grep -qFx 改為 awk /data/data/com.termux/files/usr/bin/push==n,避免特殊字元誤判
- 僅上傳變更應用訊息加 remote_type 守衛,未設遠端時不顯示
- 遠端斷線保存 _remote_type_orig,支援中途開 WiFi 後重連
- 遠端缺檔本地無變化時免重壓直接上傳
- Lo=2 恢復未安裝應用選項順序顛倒 bug
- Lo=2 更新腳本誤設 update 變數(應為 choose)bug
- Media 備份無內容不留空殼
- 全腳本去除 bc 依賴改用 awk

其他:
- 單獨備份模式只預掃該 app 權限
- 頂部加區塊索引,各分區加分隔標題
- 縮排統一為 Tab
- 掛載路徑顯示從 mount:[...] 改為 └─ 掛載於:
2026-06-02 00:42:04 +08:00
Yawasau
3dc8bbdb2b feat: 合併遠端增量備份相關功能 (基於 PR #123) 2026-05-29 08:40:20 +08:00
5 changed files with 5053 additions and 1938 deletions

View File

@@ -19,6 +19,12 @@ setDisplayPowerMode=0
#自定義備份文件輸出位置 支持相對路徑(留空則默認當前路徑)
Output_path=""
#自定義備份目錄後綴(留空則不添加後綴)
#支持日期時間變量:%yyyymmdd %hhmmss %yyyymmddhhmmss %yyyy %mm %dd
#例_daily → Backup_zstd_0_daily
#例_%yyyymmdd → Backup_zstd_0_20260522
Backup_suffix=""
#自定義applist.txt位置 支持相對路徑(留空則默認當前路徑)
list_location=""
@@ -37,7 +43,7 @@ cdn=1
mount_point="rannki|0000-1"
#使用者(如0 999等用戶如存在多個用戶留空強制選擇無多個用戶則默認用戶0不詢問)
user=
user=0
#備份模式
#1包含數據+安裝包0僅包安裝包
@@ -59,20 +65,19 @@ backup_media=0
Background_apps_ignore=0
#添加自定義備份路徑 例Download DCIM等文件夾 請使用絕對路徑,請勿刪除""
Custom_path="
/storage/emulated/0/Pictures/
/storage/emulated/0/Download/
/storage/emulated/0/Music
/storage/emulated/0/DCIM/
/data/adb
"
Custom_path=""
#黑名單模式(1完全忽略不備份 0僅備份安裝包注意此選項Backup_Mode=1時黑名單模式才能使用)
blacklist_mode=0
#備份黑名單(備份策略由「黑名單模式」控制,此處只作為黑名單應用列表)
blacklist="
#com.esunbank
com.facebook.orca
com.facebook.katana
com.instagram.barcelona
com.instagram.android
com.esunbank.ESUNWALLET
com.esunbank
#com.chailease.tw.app.android.ccfappcust"
#位於data的預裝應用白名單 例:相冊 錄音機 天氣 計算器等(默認屏蔽備份預裝應用,如需備份請添加預裝應用白名單)
@@ -124,21 +129,45 @@ rgb_c=213
#遠程備份類型 (留空不啟用)
#推薦 webdav (穩定)
#smb 支援 SMB1/CIFSWindows Server 需手動開啟
#smb 支援 SMB2/SMB3 (本腳本拒絕 SMB1/CIFS, 會自動協商到伺服器支援的最高版本)
remote_type=
# 保存原始值, 供連線失敗後 (如中途開 WiFi) 重新檢測用
_remote_type_orig=
#遠程地址
#WebDAV例: http://192.168.1.100:8080/dav/
#遠程地址 (兩種協議分開設定, 切換 remote_type 免重輸)
#SMB例: smb://192.168.1.100/backup/
remote_url=
smb_url=
#認證用戶名
smb_remote_user=
#認證密碼
smb_remote_pass=""
#WebDAV例: http://192.168.1.100:8080/dav/
webdav_url=
#認證用戶名
webdav_remote_user=
#認證密碼
webdav_remote_pass=""
#遠程認證用戶名
remote_user=
#流式上傳 (邊壓邊傳, 不佔本機空間)
#1 開啟流式: 數據直接壓縮→管道傳到遠端, 本機不留 tar (省空間, 全量上傳, 不做本機校驗/增量)
#0 關閉(預設): 先壓到本機→校驗→再上傳 (保留本機檔案, 支援增量)
#支援 smb / webdav 兩種 remote_type
remote_stream=0
#遠程認證密碼
remote_pass=
#流式上傳除錯 (1=失敗時印出 smbclient/curl 的具體錯誤, 用於排查流式失敗原因)
_stream_debug=1
#遠程備份完成後是否保留本地檔案
#1保留本地檔案(上傳後不刪除) 0上傳成功後刪除本地檔案
remote_keep_local=0
#邊備份邊上傳 (每備份完一個應用立即上傳,然後刪除本機檔案再備份下一個,以節省本機空間)
#1 開啟 0 關閉
#開啟後:每個應用備份完成 → 立即上傳遠端 → 上傳成功後刪除本機檔案 → 繼續備份下一個
#關閉後:先備份所有應用 → 全部備份完再統一上傳
remote_upload_per_app=0
#log 目錄大小上限 (單位 MB), 達到上限會在啟動時自動清空 log/
#留空或設 0 = 關閉自動清理
log_max_size_mb=1

View File

@@ -158,7 +158,11 @@
"2512BPNDAI" "Xiaomi 17 Ultra 印度版"
"25128PNA1C" "Xiaomi 17 Ultra by Leica 國行版 (衛星通訊)"
"25128PNA1G" "Leica Leitzphone powered by Xiaomi 國際版"
"2605EPN8EC" "Xiaomi 17 Max"
"M531DA" "Xiaomi 17T 國行版"
"2602DPT53G" "Xiaomi 17T 國際版"
"2602DPT53I" "Xiaomi 17T 印度版"
"M025EC" "Xiaomi 17T Pro 國行版"
"2602EPTC0G" "Xiaomi 17T Pro 國際版"
"2602EPTC0R" "Xiaomi 17T Pro 日本版 (無鎖)"
"2014616" "小米 Note 雙網通版"
@@ -634,7 +638,8 @@
"24069RA21C" "Redmi Turbo 3"
"24129RT7CC" "REDMI Turbo 4"
"25053RT47C" "REDMI Turbo 4 Pro"
"2511FRT34C" "REDMI Turbo 5"
"2511FRT34C" "REDMI Turbo 5 國行版"
"2606FRT34I" "REDMI Turbo 5 印度版"
"2602BRT18C" "REDMI Turbo 5 Max"
"M1903F10A" "Redmi K20 全網通版"
"M1903F10C" "Redmi K20 運營商全網通版"
@@ -851,7 +856,7 @@
"2410FPCC5G" "POCO C75 國際版"
"2410FPCC5I" "POCO C75 印度版"
"24116PCC1I" "POCO C75 5G 印度版"
"25128PC17G" "POCO C81 Pro 國際版"
"25128PC17Y" "POCO C81 Pro 國際版"
"25128PC17L" "POCO C81 Pro 拉美版"
"25128PC17I" "POCO C81 印度版"
"26020PCB4I" "POCO C81x 印度版"
@@ -863,11 +868,12 @@
"24074PCD2I" "POCO Pad 5G 印度版"
"25099RP08G" "POCO Pad X1 國際版"
"2509ARPBDG" "POCO Pad M1 國際版"
"2603APC14G" "POCO Pad C1 國際版"
"FYJ01QP" "小米米家翻譯機"
"21051191C" "CyberDog 仿生四足機器人"
"2405AVPB7C" "小米澎湃智能座艙 (第一代 SU7/SU7 Ultra)"
"25033VP3FC" "小米澎湃智能座艙 (YU7/新一代 SU7)"
"2503CVPC6C" "Xiaomi YU7 後排移動控制屏"
"2503CVPC6C" "小米汽車後排移動控制屏"
"MI-ONE" "Mi 1 Lite"
"2109119BC" "Xiaomi Civi China"
"2109119BC" "Xiaomi Civi 1S China"
@@ -2899,6 +2905,7 @@
"RMX5171" "realme 16 5G"
"RMX5120" "realme 16 Pro 5G"
"RMX5131" "realme 16 Pro+ 5G"
"RMX5268" "realme 16T 5G"
"RMX1921" "realme XT Global"
"RMX1922" "realme XT India"
"RMX1992" "realme X2 India"
@@ -3128,6 +3135,8 @@
"V2465A" "vivo S30 Pro mini"
"V2528A" "vivo S50 / vivo S50t"
"V2527A" "vivo S50 Pro mini"
"V2571A" "vivo S60"
"V2572A" "vivo S60 元氣版"
"V1901A" "vivo Y3 全網通版"
"V1901T" "vivo Y3 移動全網通版"
"V1930A" "vivo Y3 標準版 全網通版"
@@ -3173,6 +3182,7 @@
"V2164A" "vivo Y55s 5G"
"V2559A" "vivo Y60 5G / vivo Y6t 5G"
"V2559BA" "vivo Y60m 5G"
"V2532BA" "vivo Y6m"
"V1731CA" "vivo Y71s"
"V2102A" "vivo Y71t 5G"
"V2164PA" "vivo Y73t 5G"
@@ -3209,6 +3219,7 @@
"V2516A" "vivo Y500 Pro"
"V2531A" "vivo Y500i / vivo Y500s / vivo Y6"
"V2561A" "vivo Y600 Pro"
"V2553A" "vivo Y600 Turbo"
"V2115A" "vivo T1"
"V2199GA" "vivo T2"
"V2188A" "vivo T2x"
@@ -3416,7 +3427,6 @@
"V2418" "vivo V40 Lite 5G Indonesia"
"V2337" "vivo V40 SE 5G"
"V2451" "vivo V50"
"V2504" "vivo V50 Pro"
"V2428" "vivo V50e"
"V2441" "vivo V50 Lite"
"V2453" "vivo V50 Lite 5G"
@@ -3427,6 +3437,7 @@
"V2540" "vivo V70"
"V2548" "vivo V70 Elite"
"V2558" "vivo V70 FE"
"V2637" "vivo V70 Lite 5G"
"vivo 1920_20" "vivo S1 Pro"
"V2168" "vivo T1"
"V2157" "vivo T1 5G"
@@ -3446,6 +3457,7 @@
"V2509" "vivo T4 Lite 5G"
"V2518" "vivo T4R 5G"
"V2510" "vivo T4 Pro"
"V2504" "vivo T4 Ultra"
"V2568" "vivo T5 Pro"
"V2545" "vivo T5x 5G"
"V2603" "vivo T5 Lite 5G"
@@ -3527,7 +3539,8 @@
"V2036_21" "vivo Y31"
"V2521" "vivo Y31 5G"
"V2534" "vivo Y31 Pro 5G"
"V2611" "vivo Y31d"
"V2636" "vivo Y31d"
"V2543" "vivo Y31d Pro"
"V2533" "vivo Y31e 5G"
"V2057" "vivo Y33"
"V2109-EG" "vivo Y33A"
@@ -3718,6 +3731,8 @@
"PLW110" "OPPO Reno15"
"PLV110" "OPPO Reno15 Pro"
"PMD110" "OPPO Reno15c"
"PMM110" "OPPO Reno16"
"PMK110" "OPPO Reno16 Pro"
"PCLM10" "OPPO Reno Ace"
"PDHM00" "OPPO Ace2"
"PACM00" "OPPO R15 全網通版"
@@ -3802,7 +3817,7 @@
"PLT120" "OPPO A6s / OPPO A6i+ / OPPO A6k"
"PMT110" "OPPO A6s Pro"
"PLT130" "OPPO A6v"
"PLT140" "OPPO A6x"
"PLT140" "OPPO A6x / OPPO A6m"
"PMC110" "OPPO A6c"
"PBCM30" "OPPO K1"
"PCGM00" "OPPO K3 全網通版"
@@ -3839,6 +3854,7 @@
"OPD2501" "OPPO Pad Air5"
"OPD2511" "OPPO Pad 5 Pro"
"OPD2515" "OPPO Pad Mini"
"OPD2601" "OPPO Pad 6"
"OB19O1" "OPPO Band 運動版"
"OB19O3" "OPPO Band 運動版 (國際版)"
"OB19O7" "OPPO Band 活力版"

BIN
tools/bc

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff