Releases: YAWAsau/backup_script
202605182003: feat: 性能與穩定性大改進,新增功能與防呆
主選單循環:跑完非備份動作回選單,不用反覆重啟
工具版本記錄:啟動時寫入 log/tools_version.log,便於除錯
log 自動清理:conf 新增 log_max_size_mb,達上限自動清空
SMB 主機名:掃描局網時顯示主機名
WebDAV 404 自動探測:目標目錄不存在時,自動列出根目錄實際內容,方便找出名稱差異
WebDAV 失敗智能識別:WRONG_VERSION_NUMBER / DNS / SSL / 連線拒絕等錯誤都會給出具體建議
DNS 解析 fallback:部分 ARM curl 二進制 DNS 失敗時自動透過 --resolve 繞過,解決網盤連線
conf 防呆:URL scheme 跟 remote_type 不一致時直接報錯
主要 Bug 修復
mksh 全面相容:<<<、arr=()、arr+=() 等 bash 專屬語法全改檔案/字串拼接
versionCode 解析:split apk 多行導致版本號被覆蓋為 1,造成「已備份應用」反覆重備
單獨備份保留清單:從子目錄跑 backup.sh 不再覆蓋整個 appList.txt
WebDAV XML 解析:兼容有 D: 前綴 / 無前綴,兼容 busybox awk
WebDAV 下載完整性:遞迴掃描檔案不再丟失
整數溢位:大於 2GB 的數據不再被誤判為「太小」
appList 同名 app:刪除 1 後綴後重新生成不再產生一模一樣的條目
trap EXIT 上傳失效:選單循環下備份結束直接觸發上傳,不再依賴 trap
小米 libc 雜訊:用 command -v 預檢 magisk,避免不必要的二進制呼叫
🔧 內部重構
新增 helper:app_details_read、release_details_read、prepare_pkg*_map、get_app_uid、jq_inplace、tar_compress_dir/glob、ts_inplace、_dns_resolve + curl wrapper 等,大幅減少重複代碼。
遠端備份功能
Changelog
從 GitHub 上一版到本次更新。本次主要新增完整的遠端備份與還原功能。
🎉 重大新增功能
1. 遠端備份(WebDAV / SMB)
完整的遠端上傳系統,支援 WebDAV 和 SMB 兩種協議。
功能:
- 備份完成自動上傳到 NAS / 雲端 / 區網電腦
- 智能範圍上傳 — 只傳本次備份的 app,不是整個資料夾
- 進度顯示與速度統計(每目錄完成印
完成 X% (12.5 MB/s)) - 上傳總耗時統計
- 失敗檔案累計處理,完整 log
- HTTP code 顯示(WebDAV 401/403/404 等)
- 「全部成功才刪本地」策略,任一失敗則本地全保留
- 可設定
remote_keep_local=1永遠保留本地檔案
conf 新增:
remote_type="webdav" # 或 smb
remote_url="http://192.168.1.100:8080/dav/"
remote_user="user"
remote_pass="pass"
remote_keep_local="0" # 1=上傳成功後保留本地, 0=刪除本地遠端目錄結構:腳本自動在 remote_url 後加 Backup_${Compression_method}_${user}/ 一層,結構與本地完全鏡像,例如:
smb://NAS/Backup/
Backup_zstd_0/
8591遊戲交易/...
Animeko/...
wifi/wifi.json
tools/
start.sh
restore_settings.conf
2. 遠端下載備份
從 NAS / 雲端下載完整備份回手機,可直接執行恢復。
流程:
- 主選單「列出遠端備份」→ 連線、檢查必要檔案(tools/、start.sh、restore_settings.conf 缺一報錯)→ 產生
appList_network.txt - 編輯
appList_network.txt用#註解掉不要下載的 app - 主選單「從遠端下載備份」→ 下載到
$MODDIR/Backup_zstd_X/ - 點
start.sh直接恢復,跟本地備份一樣
特性:
- 固定 3 項(tools/ start.sh restore_settings.conf)自動下載,不需要列在清單
- WebDAV 並行下載(4 路同時)
- SMB 每個目錄一次連線批次傳輸
- 完整 UTF-8 中文路徑支援
- 下載總耗時統計
3. 連線測試入口(主選單第 6 項)
三層測試,獨立驗證遠端設定,不會觸發備份或上傳:
- TCP 預檢 — 3 秒內探測 host:port 可達性
- 認證測試 — 各協議對應方式驗證帳密
- 路徑測試 — 嘗試列出遠端目標路徑
每層失敗有對應的精準錯誤(認證失敗 / share 不存在 / 路徑不存在等)。
4. 區網 SMB 主機掃描(scan_smb)
腳本啟動時自動掃描區網,列出所有開放 SMB 的主機與共享。50 個 IP 一批並行掃描,通常 5-10 秒完成。
本機 IP: 192.168.0.228
掃描 192.168.0.0/24 上的 SMB 主機 (445 port)...
...已掃描 50/254
...
發現 SMB: 192.168.0.205
共享: ADMIN$
共享: Backup
共享: C$
5. 單獨上傳備份
兩個入口,讓你不用重新備份就能補傳:
- 主選單第 7 項:讀
appList.txt+Custom_path,把現有本地備份的對應目錄全部上傳 - 每個 app 子目錄自動生成
upload.sh:用 MT 管理器點某個 app 的 upload.sh,只上傳該 app
6. 啟動 Logo
腳本啟動時顯示 ASCII art logo (SPEED 字樣 + BACKUP/RESTORE/SYNC slogan,亮青配粉紅)。
🚀 效能優化
SMB 批次傳輸
- 上傳:按遠端目錄分組,每組一次 smbclient 連線批次傳所有檔案(原本每檔重連)
- 下載:每個目錄用
-D參數一次連線傳完該目錄全部檔案
WebDAV 並行下載
- 先遞迴 PROPFIND 掃出所有檔案 URL
- 再用
curl -Z --parallel-max 4並行下載,4 路同時 - 小檔多時可省 50-75% 時間
共用 helper 函數
抽出 helper 消除重複代碼:
remote_parse_smb_url— SMB URL 解析(取代 4 處重複)smb_filter_noise— smbclient 輸出過濾(取代 5 處重複)dir_has_files— 目錄非空判斷(取代 3 處重複)url_encode_path/url_decode_path— 完整 UTF-8 URL 編解碼
🐛 Bug 修復
強制 curl HTTP/1.1
某些 WebDAV 伺服器(openresty / nginx)在 curl 8.x 預設 HTTP/2 PUT 會回 404。所有 curl 呼叫加 --http1.1 強制使用 HTTP/1.1,跟 WebDAV 1999 年協議最相容。
WebDAV 中文路徑無法上傳
原本只處理 4 個 ASCII 字元(%20 %2B %23 %25),中文 app 名(UTF-8 多 byte)上傳失敗。新版用 od + awk 完整編碼,中文 / 空白 / 特殊字元全支援。
SMB 中文路徑失敗
SMB 上傳指令的中文路徑被單引號包住,實際 smbclient 解析時把引號當字面字元,導致 NT_STATUS_OBJECT_PATH_NOT_FOUND。修正為不加引號直接傳。
smbclient 找不到 smb.conf
自編 smbclient 寫死找 /usr/local/samba/etc/samba/smb.conf,Android 上沒這檔。加 -s /dev/null 跳過 config 讀取。
WebDAV 預建初始目錄
某些嚴格的 WebDAV 伺服器不會自動建中介目錄。新版上傳前先 MKCOL Backup_zstd_X/ 自己。
檔案 / 目錄顯示區分
原本根目錄檔案(start.sh、restore_settings.conf)會被當作目錄顯示「上傳目錄」。改成判斷 rel 含 / 與否,根目錄檔案顯示「上傳檔案」。
失敗處理改進
- 累積失敗清單,不再
break終止後續 remote_keep_local=0時改為「全部成功才刪除所有檔」- 失敗時本地全部保留(含已上傳的)
沒網路時不再卡住
- smbclient 加
-t 10命令 timeout - 事前
remote_precheckTCP 預檢(3 秒內判斷可達) - 失敗時停用上傳但保留本地備份
Trap EXIT 不誤觸發
原本任何選項退出都會觸發 remote_cleanup(連測試連線、列出備份這種非備份操作也會)。改用 REMOTE_TRIGGER 旗標,只有 backup / backup_media / backup_update_apk 成功完成才設旗標,其他操作不觸發上傳。
單獨上傳不重複跑
主動呼叫上傳完後清掉 REMOTE_TRIGGER,避免 trap EXIT 又跑一次。single_upload / upload_current_backup 不重複呼叫 remote_setup(啟動時已跑過)。
主選單支援多位數選項
case 從 [1-9] 改成 [0-9]*,支援 10+ 項選單。
📋 conf 變更
新增遠端相關設定:
#色彩設定 (256 色 ANSI 編號)
#常用值: 39藍 51青 82綠 196紅 208橘 213粉 220黃 165紫
rgb_a="${rgb_a:-220}" # 主色 (亮黃)
rgb_b="${rgb_b:-51}" # 輔色1 (亮青)
rgb_c="${rgb_c:-213}" # 輔色2 (粉紅)
#遠程備份類型 (留空不啟用)
#推薦 webdav (穩定)
#smb 僅支援 SMB1/CIFS,Windows Server 需手動開啟
remote_type="${remote_type:-}"
#遠程地址
#WebDAV例: http://192.168.1.100:8080/dav/
#SMB例: smb://192.168.1.100/backup/
remote_url="${remote_url:-}"
remote_user="${remote_user:-}"
remote_pass="${remote_pass:-}"
#遠程備份完成後是否保留本地檔案
#1保留本地檔案(上傳後不刪除) 0上傳成功後刪除本地檔案
remote_keep_local="${remote_keep_local:-0}"🎨 配色與可維護性
- 統一配色方案:
rgb_a=220亮黃 /rgb_b=51亮青 /rgb_c=213粉紅,跟 logo 配色一致 - 全腳本 40+ 函數補上中文注釋,提高可維護性
echoRgb函數加完整色碼對照表注釋- conf 內 rgb 設定加常用色碼提示
📊 統計
- 行數:2863 → 4348 行(+1485 行)
- 主選單從 6 項擴充到 10 項
- 新增遠端備份 / 下載 / 上傳 / 測試共 4 大模組
- 完整 UTF-8 中文路徑支援
🆕 選單對照
| # | 舊版 | 新版 |
|---|---|---|
| 1 | 生成應用列表 | 生成應用列表 |
| 2 | 備份應用 | 備份應用 |
| 3 | 備份已更新應用 | 備份已更新應用 |
| 4 | 備份自定義資料夾 | 備份自定義資料夾 |
| 5 | 備份WiFi | 備份WiFi |
| 6 | 殺死運行中腳本 | 測試遠端連線 ✨ |
| 7 | - | 單獨上傳當前備份 ✨ |
| 8 | - | 列出遠端備份 ✨ |
| 9 | - | 從遠端下載備份 ✨ |
| 10 | - | 殺死運行中腳本 |
202508162209
修復restore_settimgs.conf user=不會跟隨使用者設定自動設置
classes.dex更新 現在支持wifi密碼備份恢復
更新後台應用獲取邏輯
更新應用pid獲取邏輯 可以更有效殺死目標應用
移除刷入模塊支持 腳本不應該處理模塊的領域 專注於應用備份
選單增加備份wifi與恢復wifi設置選項
更新邏輯優化
應用uid獲取方式效率優化,優先調用pm list packages 避免重複調用dex與多用戶設置失敗修復
修復while循環遭遇pm(cmd)輸出異常退出問題
優化了匹配包名邏輯 重複或類似包明現在可以更好的處理
修復了部分終端與不同設備遭遇的applist.txt提示的權限問題,更改了txt輸出方式與邏輯
修復已經移除應用被輸出備份問題
新增單獨恢復包含ssaid應用選項
更改了檢測應用是否存在邏輯
其他細節優化 現在備份恢復速度應該是加快了
202507071944
修復生成應用列表失敗
去除recovery下的備份模式 潛在族群太少,而且大部分設備已經沒有twrp可以使用
202507071542
調整環境變量優先級別
修復部分終端提示context權限的攔截問題
修復更新備份腳本後start.sh腳本錯誤與腳本創建失敗
此版本請勿使用自動更新,因為此前版本腳本存在問題,請手動解壓縮或是全新使用
@XayahSuSuSu 幫助修復了dex的幾個問題 當備份權限為空時不在提示錯誤
202507061817
將全部腳本整合為strst.sh 舊腳本將不在兼容
使用了5ec1cff 的cmd來解決部分設備提示cmd context問題
修復獲取資料夾使用者id失敗問題
修復部分終端內恢復split apk的異常終止問題
調整備份已更新應用功能的邏輯
zstd更新版本
細節優化
202504261629
更新cdn 上個版本假設你在腳本看到此更新訊息時請手動下載,因為上個版本cdn是壞的
202504260051
修復ksu用戶備份出現校驗失敗問題
修復部分用戶出現自動更新被關閉問題
修復ksu用戶顯示壓縮率異常
修復優化幾處問題
202504241535
修復當腳本異常終止時TMPDIR目錄沒被正確刪除
更新CDN地址
更新dex,機型目錄
備份權限時只有返回true or false時才會備份,防止錯誤被記錄在json
恢復uid時部分應用獲取uid失敗修復,並且修復了無論如何都會調用一次dex與即使dex調用成功仍然調用dumpsys造成效率低下問題
Json記錄了備份時間,供對比
修復了單獨恢復應用時腳本沒有正確設置ssaid的問題
修復單獨恢復腳本調用時仍然會恢復自定義資料夾問題
恢復資料夾內的Module資料夾現在支持刷入ksu模塊
輸出排除應用增加包名如下
com.android.soundrecorder
com.duokan.phone.remotecontroller
com.android.calendar
com.android.deskclock
com.android.calendar|com.android.deskclock
Md5:960e8a3472ab00f91946b27f8443ee1e
Sha256:a9e8c38317b6b69fa2fe0754ec734a7a6e2c30cfe921cb01852c99898f2f36b5
非本人tg QQ GitHub下載之壓縮包慎用
202501192040
更新dex 適配狀態欄通知 修復米米os2狀態欄通知
檢測應用是否包含keystore 如有擇提示風險
json紀錄備份時間
優化恢復時獲取應用uid效率與邏輯 防止重複調用app_process
優化關閉螢幕後的喚醒邏輯
備份恢復非user_id=0 解密其他用戶目錄(感謝群友測試與幫助)
選擇後台行腳本時狀態欄通知將通知進度
conf選擇螢幕關閉備份時狀態欄提示與播放音效(螢幕關閉會很焦慮到底備份好了沒有 有音效就可以知道腳本還在執行與否)
目前cdn異常 自動更新需要修改tools.sh
cdn=5才能使用