Skip to content

Releases: YAWAsau/backup_script

202608151605

Choose a tag to compare

@YAWAsau YAWAsau released this 15 Aug 08:08

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 修正

Choose a tag to compare

@YAWAsau YAWAsau released this 26 Jul 13:46

更新日誌

本次更新重點集中在遠端流式備份/恢復穩定性、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 建置與驗證調整

  • filewatchprocwaitpropwaitnetwatch 改為 dynamic PIE + 16KB aligned 建置策略。
  • 更新 helper 版本字串為 dyn16k。
  • tools 端 SHA 驗證改為單一來源表,避免啟動驗證與 runtime helper 驗證使用兩份 SHA 清單造成不同步。
  • 修復 dynamic helper 更新後 unixsock / netwatch 等工具 SHA mismatch 的風險。
  • smbclient wrapper 新增 active pid 追蹤,方便斷線時精準終止目前傳輸子進程。

debug / 診斷改善

  • remote_netwatch.log 在偵測到路由或位址變更時立即寫入,不再出現 main log 有 fatal 但 netwatch log 空白的情況。

  • 改善 remote fatal、stream abort、restore clean abort 等 debug 記錄。

  • stderr.logroot_daemon_stderr.logwebdav_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.shclasses.dex、native helper 相關變更,請保持 tools/ 目錄完整更新。
  • 若使用遠端 WebDAV / SMB 流式模式,建議更新後重新測一次遠端連線。
  • 若恢復過 SSAID 且畫面提示已寫回,建議重啟手機後再開啟相關 App。
  • 斷網測試期間,WebDAV server 端例如 rclone 可能出現 unexpected EOF,這通常是 client 中途斷線造成的 server-side 噪音,不代表備份檔被寫壞。

202607260112

Choose a tag to compare

@YAWAsau YAWAsau released this 25 Jul 17:13

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 / op2
    • android: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.sh wrapper 補齊與下載恢復邏輯修正。
  • 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 時,會自動從 permissionsbattery_settingsSsaidinstall_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 的問題。
  • 不恢復舊的 tee pipeline,避免 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

Choose a tag to compare

@YAWAsau YAWAsau released this 23 Jul 13:09

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
  • 新增詳細 SSAID 報告欄位:

    • uidKey
    • path
    • expected
    • actual
    • readbackSource
    • beforeMeta
    • afterWriteMeta
    • afterMeta
    • metadataRestore
    • providerEffectiveReadback

新增 capability:

  • appstate.ssaid.metadata_restore.v1
  • appstate.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_process fallback。
  • 改善批量安裝、PackageInfo、安裝來源、UID、通知及 AppState 操作。
  • 保留 Java/Kotlin 混合架構及 com.xayah.dex ABI,相容現有 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優化

Choose a tag to compare

@YAWAsau YAWAsau released this 21 Jun 06:09

更新日誌

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 白名單讀寫改為優先呼叫正式 IDeviceIdleController AIDL 介面(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個暫存檔清理項目全部補回

新增流式備份與恢復

Choose a tag to compare

@YAWAsau YAWAsau released this 13 Jun 04:32

備份腳本 發布說明


🆕 新增功能

流式備份/恢復

  • remote_stream=1 支援 SMB + WebDAV 雙協議邊壓邊傳,數據不佔本機空間
  • 流式恢復從遠端直接解壓還原,無需本地暫存
  • 流式上傳基礎設施:自動上傳 start.sh / restore_settings.conf / appList.txt / MT管理器.apk / tools/ 目錄

遠端預掃優化

  • prepare_remote_filelist:單次連線取得遠端全部檔案列表(SMB recurse ls / WebDAV PROPFIND 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_pass
  • webdav_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

Choose a tag to compare

@YAWAsau YAWAsau released this 07 Jun 08:32

更新內容

⚡ 性能優化

備份提速近 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: 性能與穩定性大改進,新增功能與防呆

Choose a tag to compare

@YAWAsau YAWAsau released this 18 May 12:06

主選單循環:跑完非備份動作回選單,不用反覆重啟
工具版本記錄:啟動時寫入 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 等,大幅減少重複代碼。

遠端備份功能

Choose a tag to compare

@YAWAsau YAWAsau released this 16 May 03:09

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 / 雲端下載完整備份回手機,可直接執行恢復。

流程:

  1. 主選單「列出遠端備份」→ 連線、檢查必要檔案(tools/、start.sh、restore_settings.conf 缺一報錯)→ 產生 appList_network.txt
  2. 編輯 appList_network.txt# 註解掉不要下載的 app
  3. 主選單「從遠端下載備份」→ 下載到 $MODDIR/Backup_zstd_X/
  4. 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.shrestore_settings.conf)會被當作目錄顯示「上傳目錄」。改成判斷 rel 含 / 與否,根目錄檔案顯示「上傳檔案」。

失敗處理改進

  • 累積失敗清單,不再 break 終止後續
  • remote_keep_local=0 時改為「全部成功才刪除所有檔」
  • 失敗時本地全部保留(含已上傳的)

沒網路時不再卡住

  • smbclient 加 -t 10 命令 timeout
  • 事前 remote_precheck TCP 預檢(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

Choose a tag to compare

@YAWAsau YAWAsau released this 16 Aug 14:32

修復restore_settimgs.conf user=不會跟隨使用者設定自動設置
classes.dex更新 現在支持wifi密碼備份恢復
更新後台應用獲取邏輯
更新應用pid獲取邏輯 可以更有效殺死目標應用
移除刷入模塊支持 腳本不應該處理模塊的領域 專注於應用備份
選單增加備份wifi與恢復wifi設置選項
更新邏輯優化
應用uid獲取方式效率優化,優先調用pm list packages 避免重複調用dex與多用戶設置失敗修復
修復while循環遭遇pm(cmd)輸出異常退出問題
優化了匹配包名邏輯 重複或類似包明現在可以更好的處理
修復了部分終端與不同設備遭遇的applist.txt提示的權限問題,更改了txt輸出方式與邏輯
修復已經移除應用被輸出備份問題
新增單獨恢復包含ssaid應用選項
更改了檢測應用是否存在邏輯
其他細節優化 現在備份恢復速度應該是加快了