Releases: YAWAsau/backup_script
Release list
202608151605
SpeedBackup 更新日誌
版本:v24.20.14-7.66-758-netwatch-fifo-cleanup-r335-202607232022
發布日期:2026-08-15
本次重點
這次更新主要強化 恢復期間的進程守護、AppState 驗證分級、appList 速度、遠端流式恢復穩定性,並修正多個恢復流程中的邊界問題。
主要改進
恢復守護流程重構
- 恢復流程改為更嚴格的守護語義,避免 App 在資料恢復過程中被系統或自身喚醒後寫入舊狀態。
- 一般 App:恢復期間若被喚醒,會即時終止並在結尾重新確認。
- 高風險 App、目前預設桌面、百度輸入法等特殊 App:改走 cgroup-first 流程。
- 預設桌面恢復時不再使用 force-stop,避免產生 stopped-state 副作用。
- 預設桌面若恢復中立刻 respawn,會交給 ProcessObserver 事件驅動 cgroup-freeze,不再重複追殺造成卡頓。
ProcessObserver / cgroup-freeze 強化
- 新增恢復期間的
action=cgroup-freeze事件處理。 - 修正 default HOME / Launcher 恢復時中途 respawn 沒有被凍結的問題。
- 修正 ProcessObserver 版本字串顯示不同步問題。
- 清理不支援 proc snapshot 時的
unknown_command噪音,改為正常 skip 記錄。
AppState 驗證改善
- AppState 驗證新增廠商限制分級。
- 對 MIUI / HyperOS 等系統限制導致的不可恢復項目,改標記為 vendor constrained,不再誤判為真失敗。
- AppState 恢復統計更準確,可區分成功、廠商限制、真正 mismatch 與失敗。
appList 生成速度修復
- 修正 appList 顯示階段大量 debug timeline 寫入造成的效能下降。
- 保留逐行顯示,不改成靜默輸出。
- appList 生成體感已恢復到約 1 秒級別。
遠端 / 流式恢復穩定性
-
修正 WebDAV 流式恢復結束時,終端可能出現:
can't create .remote_netwatch_fifo...can't open .remote_netwatch_fifo...Interrupted system call
-
FIFO reader / writer 背景程序錯誤已收進 debug log,不再污染終端畫面。
-
清理遠端監控與進度通知相關暫存檔,避免跨輪殘留影響通知或顯示。
Media / 自定義資料夾修復
- 修正只備份部分 Media / 自定義資料夾時,遠端舊的
app_details.json內容被覆蓋,導致未選項目從遠端清單消失的問題。 - 例如第一次備份 DCIM / Download / Pictures,第二次只備份 DCIM 時,Download / Pictures 不應從遠端清單中遺失。
hidden API 相容性
- hidden API bypass 改為 softgate。
- bypass 成功或失敗只作為記錄,不再作為硬性失敗條件。
- 實際是否可用以 Dex 功能自檢與恢復流程結果為準。
修復項目
- 修復 default HOME 恢復時中途 respawn 後殘留 process 的問題。
- 修復高風險 App 恢復守護進度過早顯示 100% 的假卡問題。
- 修復 appList 生成因 debug timeline 過度寫入導致變慢的問題。
- 修復遠端流式恢復結束時 FIFO
Interrupted system call顯示到終端的問題。 - 修復
.progress_notify_pct_*、.restore_appcount_notify_idx*等暫存 marker 沒有被清理的問題。 - 修復 proc snapshot 不支援時產生不必要 unknown command 噪音的問題。
- 修復 ProcessObserver 版本字串未同步的問題。
- 修復 Media 子集備份可能導致遠端清單缺項的問題。
- 修復 AppState 在部分廠商 ROM 上把系統限制誤判為恢復失敗的問題。
實測結果
已測試通過:
- Android 16 / SDK 36 環境。
- WebDAV 遠端流式恢復。
- 一般 App 恢復。
- default HOME / Launcher 恢復。
- AppState / AppOps / 電池策略 / SSAID 恢復驗證。
- 恢復期間 cgroup-freeze 守護。
- 恢復後 kill-before-thaw 收尾。
- appList 生成速度回歸。
- speed_debug 打包與終端輸出清理。
注意事項
- 此版本更換了遠端json放置方法 不支持舊版恢復。
- 如果從較舊版本升級,建議直接使用完整更新包。
遠端斷線早停、SSAID 恢復報告、Dex/AppState 修正
更新日誌
本次更新重點集中在遠端流式備份/恢復穩定性、WebDAV / SMB 斷線收斂、SSAID 恢復提示、Dex AppState 顯示修正,以及 native helper 建置策略調整。
主要變更
遠端斷線處理全面強化
- 新增並完善
netwatch遠端網路監控邏輯。 - WebDAV / SMB 遠端流式備份、流式恢復、遠端統計、遠端 JSON 檢查、遠端孤兒清理等主流程已接入斷線早停判斷。
- 當 LAN 路由或 Wi-Fi 位址變更時,腳本會立即標記遠端 fatal,不再繼續後續遠端操作。
- WebDAV 斷線時會停止 WebDAV daemon,避免 relay / getstdout / PUT retry 重新啟動 daemon 後卡住。
- SMB 斷線時會停止目前 active
smbclient子進程,避免smbclient在網路中斷後長時間阻塞。 - 遠端 fatal 後會跳過最終遠端檔案計數核驗,避免斷線後又重新連線造成卡住。
WebDAV / SMB 流式恢復修復
- 修復 WebDAV 流式恢復斷網後可能重新啟動 daemon 的問題。
- 修復 SMB 流式恢復斷網後仍嘗試下載下一個資料包的問題。
- 修復 APK / user / user_de 流式解壓失敗後仍誤報成功的問題。
- 斷線造成半截 tar / zstd 時,不再繼續安裝半截 APK。
- 遠端流式恢復中斷後,會以乾淨提示提前結束本輪恢復,不再誤顯示「沒有安裝無法恢復數據」。
- WebDAV relay expected abort 不再污染
stderr.log,改寫入專用 debug log。
SSAID 恢復報告改善
-
AppState 恢復後新增 SSAID 恢復摘要。
-
會顯示本輪 SSAID:
- 已寫回數量
- 已相同跳過數量
- 恢復失敗數量
- 檢查總數
-
只有 SSAID 實際被寫回時才提示重啟手機。
-
SSAID 已相同時會跳過寫入,不會硬寫,也不會提示重啟。
-
新增
speed_debug/ssaid_restore_report.tsv,方便確認每個 App 的 SSAID 恢復狀態。
Dex / AppState 修正
-
Dex 更新至 v2.6.97 系列基準。
-
AppInventory snapshot 接入 RootDaemon cache,減少反覆呼叫
pm/cmd package。 -
App 清單、版本、UID、安裝狀態與 APK path map 由同一份 AppInventory 來源生成。
-
修正 AppOps 本地化文字:
精凖位置→精準位置
-
AppState restore / verify、權限、AppOps、特殊存取、SSAID 等流程維持原有相容性。
native helper 建置與驗證調整
filewatch、procwait、propwait、netwatch改為 dynamic PIE + 16KB aligned 建置策略。- 更新 helper 版本字串為 dyn16k。
- tools 端 SHA 驗證改為單一來源表,避免啟動驗證與 runtime helper 驗證使用兩份 SHA 清單造成不同步。
- 修復 dynamic helper 更新後
unixsock/netwatch等工具 SHA mismatch 的風險。 smbclientwrapper 新增 active pid 追蹤,方便斷線時精準終止目前傳輸子進程。
debug / 診斷改善
-
remote_netwatch.log在偵測到路由或位址變更時立即寫入,不再出現 main log 有 fatal 但 netwatch log 空白的情況。 -
改善 remote fatal、stream abort、restore clean abort 等 debug 記錄。
-
stderr.log、root_daemon_stderr.log、webdav_daemon_stderr.log在已知斷線場景下保持乾淨。 -
最終 debug 包更容易判斷:
- 是否真的斷網
- 哪個遠端流程中止
- WebDAV daemon / SMB child 是否已被正確停止
- SSAID 是寫回、相同跳過,還是失敗
修復問題
- 修復 WebDAV 流式恢復斷網後可能卡住。
- 修復 SMB 流式備份/恢復斷網後
smbclient未立即收斂。 - 修復 SMB
smbclient rc=143被誤判為成功。 - 修復 remote stream fatal 後仍執行最終遠端核驗。
- 修復斷網後仍繼續下載下一個資料包。
- 修復 APK 流式解壓失敗卻印出成功。
- 修復半截 APK 仍進入安裝流程。
- 修復 SSAID 實際寫回後畫面沒有明確列出。
- 修復 SSAID already-matches 時提示語義不清。
- 修復 AppOps「精準位置」中文錯字。
- 修復 r55+ 單一工具 SHA 來源後,部分工具簽名比較仍讀舊區塊的問題。
測試狀態
已實測通過:
- WebDAV 正常流式恢復
- WebDAV 流式恢復中斷 Wi-Fi
- SMB 流式恢復中斷 Wi-Fi
- WebDAV / SMB netwatch 斷線早停
- SSAID 不同時寫回並提示重啟
- SSAID 相同時跳過且不提示重啟
- Dex
classes.dex載入與dex_check.sh驗證 - RootDaemon early prewarm
- dynamic helper SHA 驗證
stderr.log/root_daemon_stderr.log/webdav_daemon_stderr.log清潔度
注意事項
- 本次更新包含
tools.sh、classes.dex、native helper 相關變更,請保持tools/目錄完整更新。 - 若使用遠端 WebDAV / SMB 流式模式,建議更新後重新測一次遠端連線。
- 若恢復過 SSAID 且畫面提示已寫回,建議重啟手機後再開啟相關 App。
- 斷網測試期間,WebDAV server 端例如 rclone 可能出現
unexpected EOF,這通常是 client 中途斷線造成的 server-side 噪音,不代表備份檔被寫壞。
202607260112
SpeedBackup 更新日誌(2026-07-25)
本次更新重點是穩定化新版遠端/本地備份流程、統一 Dex daemon 呼叫、提升無變化快跑速度,並修復恢復驗證與日誌/設定檔細節問題。
重要變更
1. 本地 / WebDAV / SMB 無變化快跑大幅加速
- 新增完整 fast-skip 預掃與 batch-collapse。
- 本地備份、WebDAV 流式備份、SMB 流式備份在全部 App 無變化時會直接全數跳過,不再保留 1 個 App 進主流程。
- 減少逐 App UI、通知、前景狀態、壓縮/資料檢查造成的空跑耗時。
- 已驗證本地、WebDAV、SMB 在全無變化情境下可
remain=0完整跳過。
2. AppState / 權限 / AppOps 恢復驗證修正
- Dex 升級到
v2.6.95。 - 修正 Android 15/16 上定位類 AppOps 驗證假 mismatch。
- 新增容忍衍生定位 AppOps:
android:gps/ op2android:monitor_location_high_power/ op42
- 先前部分定位類 App restore 成功但 verify 顯示不一致,現在已修正。
3. Root unified daemon 穩定化
- AppState、HiddenApi、Notification 相關高頻操作統一走
SpeedBackupRootDaemon。 - 舊 AppState daemon / Notify daemon / HiddenApi daemon 不再啟動。
- 每輪流程 root daemon 僅啟動一次,避免多 daemon 重複啟動與 fallback 混亂。
4. WebDAV / SMB 遠端流程修正
- WebDAV 遠端下載改成 item 級進度,避免逐檔刷屏。
- WebDAV EOF / empty response 不再把可預期的連線結束刷進 daemon stderr。
- WebDAV per-app
backup.sh/recover.sh/upload.shwrapper 補齊與下載恢復邏輯修正。 - SMB mkdirs preflight 修正,避免 base 目錄不存在時逐層建立失敗。
- 遠端 JSON 健康檢查會列出缺失/損壞 app_details 清單,不再靜默略過。
5. 正在運行 App 備份安全性調整
- 備份前改用較安全的停止流程:
cmd activity stop-app→ Dex HiddenApi force-stop →am force-stop。 - 移除 broad
kill -9/pkill -f追殺,避免輸入法、系統服務或高頻喚醒 App 導致主腳本被系統殺死。 - 若 App 停不住或立即復活,會跳過不安全的 data entry,而不是硬殺。
6. 舊版 app_details.json 自動相容
- 新版恢復流程可自動兼容舊版
app_details.json。 - 舊 JSON 沒有新版
app_state時,會自動從permissions、battery_settings、Ssaid、install_diagnostics等欄位轉換成統一 AppState restore record。 - 不需要手動把舊備份 JSON 轉成新版格式。
7. 自動更新流程強化
- 本地/Download/QQ 收到同版本完整 release 包時允許覆蓋更新。
- 成功套用後會刪除更新 zip。
- 拒絕向下更新,避免舊包覆蓋新版本。
- 線上檢查同版本時只記錄
NO_NEWER,不反覆提示更新。 - 更新失敗、拒絕、回滾路徑會清理
/data/local/tmp/speedbackup_update.*暫存。
8. legacy log 不再 0KB
- 修復
log/log_yyyy-mm-dd_hh-mm.txt被建立但內容為 0KB 的問題。 - 不恢復舊的
teepipeline,避免 mksh/subshell 問題。 - 改為在 speed_debug snapshot / final pack 前把
main.log鏡像同步到 legacy log。
9. 設定檔註解污染修正
- 修復多次語系同步後
演算法被重複轉換成演演演算法的問題。 - 新增註解 sanitizer,只修正註解行,不修改使用者設定值。
Compression_method=zstd等實際設定不受影響。
10. dex_check.sh 清理
dex_check.sh改為只檢查目前 Dex v2.6.95 真正存在且主線正在使用的功能面。- 移除過時舊入口、舊 fallback、舊 WebDAV/curl、已刪功能的殘留檢查。
- 減少誤報,方便發布前確認 Dex current surface 是否正常。
202607232022
SpeedBackup 2026-07-23 更新日誌
本次為大型穩定性更新,主要強化應用權限狀態、SSAID、WebDAV、SMB、Dex daemon、日誌與錯誤判定。備份格式版本號未變更。
主要更新
1. AppState 備份、恢復與驗證強化
-
完善應用權限、AppOps、特殊權限、通知設定及 SSAID 的批量收集、恢復與驗證流程。
-
修正切換 WebDAV/SMB 遠端來源後,未實際變更卻顯示權限差異的問題。
-
修正
允許(0) → 允許(0)等無效權限差異。 -
有效 SSAID 不再被空值或無效資料覆蓋。
-
改用語義化比較,不再只依賴原始 AppOps row。
-
ROM 將 AppOps raw row 正規化,但實際 effective mode 相同時,不再誤判為部分恢復。
-
恢復及驗證報告可更準確區分:
- 完全成功
- 部分成功
- 失敗
- ROM scope drift
- 檔案 readback
- Provider effective readback
2. SSAID 恢復安全性修正
-
SSAID 僅接受 16 位十六進位字串。
-
寫入前統一轉換為小寫。
-
無效 SSAID 直接跳過,避免污染
settings_ssaid.xml。 -
使用正確的 Android 8+ per-app SSAID 路徑:
- packageName 解析目前 UID
- UID 轉換為 uidKey
- 寫入
settings_ssaid.xml
-
不使用
settings put secure android_id,避免錯寫一般 Secure Android ID。 -
每個應用寫入 SSAID 後,立即修復檔案 metadata,不再等全部應用寫完才處理。
-
新增 root-owned
settings_ssaid.xml自動修復。 -
寫入後自動嘗試恢復:
- owner:
system:system - mode:
0600 - SELinux context
- owner:
-
新增詳細 SSAID 報告欄位:
uidKeypathexpectedactualreadbackSourcebeforeMetaafterWriteMetaafterMetametadataRestoreproviderEffectiveReadback
新增 capability:
appstate.ssaid.metadata_restore.v1appstate.appops.effective_scope_drift.v1
3. WebDAV 穩定性與相容性提升
- WebDAV 主線改為 Dex daemon 搭配 unix socket,減少重複啟動
app_process的成本。 - 改善遠端目錄逐層建立流程。
MKCOL遇到200/201/204/405時,可配合PROPFIND確認目錄是否已存在。- 遇到父目錄不存在時,會先建立父層再重試。
- 改善 rclone serve WebDAV 等後端的相容性。
- 強化 PUT、MOVE、GET、DELETE、STAT 及目錄操作的錯誤判定。
- WebDAV 保持 standard API 實作,不錯誤宣稱或載入 AndroidHiddenApiBypass。
4. SMB 穩定性修正
- SMB 主線維持 native
smbclient 4.24.4。 - 新增 smbclient child process OOM 保護。
- 修正 mksh 背景 child 誤讀主程序 stdin,造成操作流程卡住的問題。
- 保留 fd9 stdin 隔離處理。
- SMBJ/jcifs-ng 實驗支線不併入正式版本,避免速度及相容性倒退。
5. Dex 與 daemon 架構更新
- Dex 更新至
v2.6.81-ssaid-metadata-restore。 - AppState、通知及 Hidden API 操作可使用 AndroidHiddenApiBypass。
- WebDAV 不使用 Hidden API bypass。
- 批量操作優先共用 daemon,降低多次啟動 Java VM 的開銷。
- daemon 啟動或 unix socket 不可用時,保留單次
app_processfallback。 - 改善批量安裝、PackageInfo、安裝來源、UID、通知及 AppState 操作。
- 保留 Java/Kotlin 混合架構及
com.xayah.dexABI,相容現有 tools.sh 呼叫入口。
6. JSON 與備份資訊處理
- 保留 shell + jq 主線,
tools/jq不移除。 - 改善
app_details.json格式與資料精簡。 - 新增更新既有備份 JSON 的流程,可更新目前格式而不重新計算 Size。
- 避免刷新 JSON 時破壞既有 SSAID 等受保護欄位。
- 清除 TMPDIR 中舊版 jqless、jsonjq、backupplan、appdetails 等實驗線殘留。
7. 日誌與執行穩定性
- 改善前景及背景執行時的日誌刷新。
- daemon stderr 分開記錄,方便定位 Dex 或通知程序錯誤。
stderr.log=0視為正式測試通過條件。- 改善遠端切換、重複備份及異常中止時的狀態清理。
- 首屏版本顯示不再為了取得版本資訊額外啟動完整 Dex daemon。
升級注意事項
- 請使用完整的
SpeedBackup_release_20260723-201342.zip。 - 舊版產生的備份理論上此版本做了兼容處理,但是建議用此版進行全新備份。
- 不要將舊版
tools.sh與新版classes.dex混用。 - 不建議繼續使用舊版,因 SSAID 寫入可能將
settings_ssaid.xml改成root:root 0644。 - 已加入每個應用寫入後立即修復 metadata 的處理。
- SSAID 恢復後建議重新啟動 Android。
providerEffectiveReadback=false不代表恢復失敗,只表示目前僅確認檔案/SettingsState readback,未宣稱 SettingsProvider runtime cache 已立即更新。- 使用原始碼自行更新 Dex 時,必須重新編譯
classes.dex。
通知與電池設定支援 + AppOps 特殊權限擴充 dex優化
更新日誌
dex 源碼
底層基礎設施修復
AppOpsManagerHidden.java補齊MODE_ALLOWED/MODE_ERRORED/MODE_DEFAULT/MODE_FOREGROUND常數,以及strOpToOp/opToPublicName/opToName/unsafeCheckOpRawNoThrow/checkOpNoThrow方法聲明——讓後續所有 AppOps 名稱反查機制真正可編譯、可執行
新增功能
getRuntimePermissions擴充:新增EXTRA_OP機制,主動查詢已知特殊權限清單(重疊顯示、子母畫面、所有檔案存取權等 9 項)+ 被動列出getOpsForPackage記錄裡剩餘的 op,含多層名稱反查(官方 API → 反射 → fallback 表 → 純數字)- 新增
getNotificationSettings/setNotificationSettings:通知總開關、重要性、角標、對話/泡泡設定,並深入到個別NotificationChannel/NotificationChannelGroup層級 - 新增
getBatterySettings/setBatterySettings:背景執行限制(RUN_IN_BACKGROUND/RUN_ANY_IN_BACKGROUND)+ Doze 白名單 - 新增
hasPictureInPictureActivity:查詢子母畫面前先確認 app manifest 確實宣告支援 PiP,避免無意義查詢 - 新增整套反射工具(
callFirst/callRequired/invokeFlexible/areArgsCompatible):動態探測系統服務方法簽名,應對不同 Android 版本 API 差異
修復
- Doze 白名單讀寫改為優先呼叫正式
IDeviceIdleControllerAIDL 介面(getFullPowerWhitelist/addPowerSaveWhitelistApp/removePowerSaveWhitelistApp),原本的dumpsys文字解析降級為失敗時的 fallback - fallback 層內部優化:優先嘗試輕量的
cmd deviceidle whitelist,失敗才退到dumpsys
tools.sh
新增功能
- 新增
prepare_battery_settings_map/prepare_notifications_map:通知/電池設定批量預掃,避免逐 app 各自 fork dex 呼叫 - 新增
Backup_Notifications:通知設定備份邏輯 - 新增三段「恢復後驗證」機制:AppOps mode 驗證、通知設定驗證、電池/背景設定驗證——還原寫入後立即重新查詢比對,而非假設寫入必定成功
- 新增
_notify_cn/_battery_cn:通知/電池設定 key 中文化對照表
優化
_json_health_check擴充:新增notification_settings/battery_settings欄位存在性檢查(弱提示)- 新增型態檢查:確認上述欄位若存在必須是 object 型態,避免恢復端讀取異常
- 新增 key/value 格式檢查:
notification_settings限定合法 key 前綴,battery_settings限定合法 key 與 mode 值格式 - 通知分類恢復驗證容錯:區分「app 層級設定缺失」(真正錯誤)與「
NOTIFY_CHANNEL/NOTIFY_GROUP尚未建立」(非錯誤,因部分通知分類僅在 app 首次建立通知後才存在),並彙整顯示避免刷版
修復
- 全腳本 6 處
TMPDIR清空邏輯統一加固:原本只檢查非空的判斷,升級為明確排除空字串與根目錄/,避免異常時誤觸發大範圍rm -rf _cleanup_tmp_files重構時遺漏 17 個暫存檔清理項目(.pkg_installer、.battery_wl、.installed_pkgs、.smb_scan_results、.backup_done、.update_apks、.add_apks、.ssaid_apks、.batch_opsreset、.restore_ssaid、.remote_scripts、.remote_files、.dex_call_log、.stream_restore_list、.json_fetch、.verify_files、.listver_changed),已全部補回
Commit 記錄
dex
b1: 修復: AppOpsManagerHidden 補齊缺失的常數與方法聲明 (MODE_*, opToPublicName, opToName, strOpToOp, checkOpNoThrow 等)
b2: 新增: getRuntimePermissions 擴充 EXTRA_OP 機制, 主動查詢特殊權限清單並支援名稱反查
b3: 新增: getNotificationSettings/setNotificationSettings, 支援應用層與通知分類/群組層級設定
b4: 新增: getBatterySettings/setBatterySettings, 支援背景執行限制與 Doze 白名單
b5: 新增: hasPictureInPictureActivity 前置檢查, 避免對不支援 PiP 的應用做無意義查詢
b6: 修復: Doze 白名單改用正式 IDeviceIdleController API, dumpsys 文字解析降級為 fallback
b7: 優化: fallback 層優先嘗試 cmd 指令, 失敗才退回 dumpsys, 減少不必要的雙重執行
tools.sh
c1: 新增: prepare_battery_settings_map/prepare_notifications_map 批量預掃, 新增 Backup_Notifications
c2: 新增: 還原後三段驗證機制 (AppOps mode/通知設定/電池設定), 不再假設寫入必定成功
c3: 新增: _notify_cn/_battery_cn 中文化對照表
c4: 優化: JSON健全度檢查擴充 notification_settings/battery_settings 的存在性/型態/格式驗證
c5: 優化: 通知分類恢復驗證容錯, 區分真正缺失與尚未建立的分類, 彙整顯示避免刷版
c6: 修復: 全腳本 TMPDIR 清空邏輯加固, 防止空值/根目錄誤觸發大範圍 rm -rf
c7: 修復: _cleanup_tmp_files 重構時遺漏的17個暫存檔清理項目全部補回
新增流式備份與恢復
備份腳本 發布說明
🆕 新增功能
流式備份/恢復
remote_stream=1支援 SMB + WebDAV 雙協議邊壓邊傳,數據不佔本機空間- 流式恢復從遠端直接解壓還原,無需本地暫存
- 流式上傳基礎設施:自動上傳 start.sh / restore_settings.conf / appList.txt / MT管理器.apk / tools/ 目錄
遠端預掃優化
prepare_remote_filelist:單次連線取得遠端全部檔案列表(SMBrecurse ls/ WebDAVPROPFIND Depth:infinity)prepare_remote_json_map:批量下載所有 app 的遠端 json(SMB 每批 20 檔 ~6 連線 / WebDAV 8 併發)prepare_remote_scripts_map:從列表零額外連線判斷入口腳本存在性- 主循環增量比對零網路開銷(直接讀本地快取)
最終計數核驗
verify_backup_manifest+_manifest_add:備份結束後逐檔核對存在性- 本地備份:
[[ -f ]]直接查;流式/遠端:單次列表比對 + 單檔 fallback - 結果三態顯示:✅ 全在 /
⚠️ 缺失清單
conf 重構
smb_url/smb_remote_user/smb_remote_passwebdav_url/webdav_remote_user/webdav_remote_pass- 切換
remote_type免重輸地址帳密,內部自動分發
🔧 修復
增量/重複備份
- 流式 staging 以遠端 json 快取為種子,解決權限/SSAID/installer 無變化仍重備
- 上傳 json 前合併遠端現有版本,防止部分欄位覆蓋導致 version 等欄位丟失
- 「檢查已更新應用」版本讀取改讀本地同步副本(流式上傳成功後同步),不再每輪誤報版本變化
- 清單偵測到版本更新的 app 強制重備 apk(防遠端 json 被失敗輪汙染成新版本號而 apk 仍是舊檔)
- apk 版本相符仍核對遠端 apk 檔實際存在(版本號吻合但 apk 缺檔時自動補備)
- 流式上傳失敗時不傳 json(缺 json 下輪必重備,防壞數據被增量跳過殘留)
- 單 app 備份入口補上遠端預掃流程
遠端列表/統計
- SMB smbclient cd 到不存在目錄停留 share 根 → 列表/大小統計加目錄標頭前綴過濾,防污染
- WebDAV href URL 編碼改通用 %XX awk 查表解碼(中文/空格/+ 全解)
- json 預掃不再靠列表交集(smbclient 列表中文名轉碼毀名),改全量批量抓
- 「本次備份增加/減少/未改變」改為前後快照差值,對齊本地 Calculate_size 口徑
進程管理
- 殺舊進程從「只殺主 sh」改為整棵進程樹(tar/zstd/smbclient 管道子進程不再托孤)
- 從逐 /proc 遞迴(數千 fork,~15 秒)改為單次 ps 快照 awk 算清單(< 1 秒)
- 使用
/system/bin/ps -e -o pid=,ppid=,args=(toybox),修復 busybox ps 無 PPID 欄導致解析全錯 - self + MY_PID 祖先鏈 + 子孫樹保護集,防誤殺自身
流式完整性
- Synology 不支援 chunked PUT → 啟動檢測明確提示
- 雲盤代理停頓誤觸低速保護 →
--speed-time 300 - LINE 等大體積應用 SMB 超時 →
-t 300 - smbclient stdin 命令必須一行一條(分號非分隔符),還原內嵌換行設計
顯示/邏輯
- 流式模式不顯示本地分區統計;連線失敗轉本地時正確顯示
ms_to_readable對 ≥ 2000000000ms 顯示「永不休眠」.changed_apps去重(同 app 多數據類型不再重複記錄)- 行尾空白 ×7、空格縮排 ×21 統一為 tab
⚡ 效能優化
| 項目 | 之前 | 之後 |
|---|---|---|
| 遠端預掃(120 app) | 120 次獨立連線 | 1 次列表 + 6 次批量 get |
| 主循環增量比對 | 每 app 最多 5 次遠端往返 | 0 次(讀本地快取) |
| 計數核驗 | N 次下載 | 1 次列表 + awk 比對 |
| 殺舊進程 | 遞迴逐 /proc,~15 秒 | 單次 ps 快照,< 1 秒 |
🛠 技術棧
| 分類 | 工具/版本 |
|---|---|
| Shell | mksh R59(#!/system/bin/sh),root |
| 壓縮 | zstd v1.6.0 自定義編譯(--ultra -3 -T0 --priority=rt) |
| 封存 | tar 1.35(--checkpoint 進度 / split apk 支援) |
| 遠端 SMB | smbclient 4.16.11(SMB3.1.1) |
| 遠端 WebDAV | curl 8.18.0-DEV |
| JSON | jq 1.8.1(備份端)/ awk 手工解析(恢復端) |
| Android 隱藏 API | com.xayah.dex.HiddenApiUtil — getRuntimePermissions / grant / revoke / setOpsMode 批量模式(JVM fork 3N→3) |
| SSAID | com.xayah.dex.SsaidUtil |
| Locale 注入 | APP_LABEL_LOCALE env → smali 層 applyLocale 攔截,解決 dex 無法讀取用戶 locale |
| 並發 | 8 路 subshell + workdir 分檔 + wait 批次 |
| 進程鎖 | mkdir 原子操作防重複執行 + 整樹殺進程保護 |
202606071629: perf: 備份提速近3倍, dex調用批量化, 修復數個bug
更新內容
⚡ 性能優化
備份提速近 3 倍(126 應用全跳過場景:約 57 秒 → 20 秒)
- 並行目錄大小預掃:備份開頭以 8 並發預先計算所有應用的 data/user/user_de/obb 目錄大小存入查詢表,主迴圈直接查表,免去重複遍歷海量檔案(實測較串行快約 3 倍)。
- 零 fork 查表機制:權限、版本號、UID、安裝來源、後台運行狀態等查詢,從逐個 fork awk 讀檔改為載入動態變量後純記憶體查詢,消除每應用數次進程啟動開銷。
- 消除命令替換 fork:
_dir_size改為寫全域變量返回,避免$(...)子 shell 開銷。 - 內建 glob 取代 ls:檢查 tar 備份是否存在改用 shell 內建通配,消除每應用的 ls 進程啟動。
dex 調用批量化(調用次數不隨應用數量增長)
- 備份端權限預掃批量:
getRuntimePermissions一次讀取所有應用權限,並用 awk 分組直接生成 JSON(省去逐個 jq),dex 僅啟動 1 次。 - 恢復端權限批量設置:grant / revoke / setOps 由每應用各調一次改為迴圈結束後一次性批量執行,JVM 啟動從 3N 次降至 3 次。
- appops reset 集中執行:恢復時 appops reset 由逐應用即時執行改為收集後在批量階段統一處理。
✨ 新增功能
- 恢復後權限驗證:權限設置完成後自動讀回實際權限,與備份記錄逐項比對授予/拒絕狀態,顯示「✅ 權限驗證通過」或列出不一致項(可用
_perm_verify=0關閉)。 - dex 調用計數器:調試開關
_dex_debug=1可統計各 dex 命令實際調用次數,用於驗證批量化是否生效。 - 批量權限進度提示:恢復時顯示「重置應用 ops 中…」「批量設置應用權限中…」等提示,避免誤以為卡住。
🐛 問題修復
- 權限 JSON 記錄錯誤(重要):修復備份時權限以「包名」為鍵、導致同一應用多個權限互相覆蓋、最終只保存 1 個權限的嚴重 bug。改為以「權限名」為鍵完整保存所有權限。舊備份需重新備份一次以修正。
- 含點名稱的自定義資料夾恢復失敗:修復恢復時檔名按第一個點截斷、導致
service.d被誤切為service、路徑獲取失敗的問題。改為只去除.tar/.tar.zst後綴,保留名稱中的點。 - 自定義資料夾/中文名預掃報錯:修復
_dir_size處理非應用名稱(如service.d、中文資料夾名)時產生的bad substitution錯誤,加入變量名合法性防呆,非法時安全回退現算。 - 列表成員判斷:將
grep -qFx替換為精確的 awk 比對。
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應用選項
更改了檢測應用是否存在邏輯
其他細節優化 現在備份恢復速度應該是加快了