Compare commits
7 Commits
2024112519
...
2025011920
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6248e2262e | ||
|
|
979b828cd9 | ||
|
|
a8c26d334c | ||
|
|
e979cf54d2 | ||
|
|
b5de2d1725 | ||
|
|
1aa4e0f440 | ||
|
|
8896743c06 |
25
README.md
25
README.md
@@ -18,12 +18,14 @@
|
||||
|
||||
- 數據完整:在更換系統之後,原有的數據全部保留,無需重新登陸或者下載額外數據包。
|
||||
- 支援備份SSAID 可完美備份LINE
|
||||
- 支援備份應用權限 可備份運行時權限與ops權限
|
||||
- 易操作:簡單几步即可備份應用完整數據!
|
||||
- 限制少:不限制機型,可跨安桌版本。
|
||||
- 功能強:可備份恢復`split apk`。
|
||||
- 算法多:目前支持的壓縮算法有 `tar(默認)` `lz4` `zstd`。
|
||||
- 速度快:即使使用`zstd`壓縮算法速率依舊快速(對比鈦備份 swift)。
|
||||
|
||||
- 算法多:目前支持的壓縮算法有 `tar(默認)`
|
||||
- `zstd`。
|
||||
- 速度快:即使使用`zstd`壓縮算法速率依舊快速(對比鈦備份 swift backup)。
|
||||
- 腳本自帶tools完整性效驗與壓縮包效驗
|
||||
## 如何使用
|
||||
`請認真閱讀以下說明,以減少不必要的問題`
|
||||
|
||||
@@ -39,6 +41,9 @@
|
||||
|
||||
4. 最後找到`backup_settings.conf`打開後根據提示設置保存,再打開`備份應用.sh`,等候備份結束完成後會在當前目錄生成一個以`Backup_壓縮算法名`命名的資料夾,裡面就是你的軟件備份。把這個資料夾整個保持到其他位置,刷完機后複製回手機,直接在資料夾裡找到`恢復備份.sh`即可恢復備份的所有數據,同樣道理,裡面也有個`appList.txt`,使用方法跟第3步驟一樣,不需要還原的刪除即可,另外進去備份好的資料夾找到單獨應用資料夾有個 Backup腳本 and restore腳本可以單獨備份與恢復腳本。
|
||||
|
||||
5. 腳本執行過程中請留意紅色字眼提示有無任何錯誤,並且使用恢復腳本時留意恢復結束後是否提示應用存在ssaid,假設提示存在ssaid請在恢復後立刻重啟已便套用ssaid,假設恢復ssaid後立刻打開應用會導致ssaid套用失敗,因為Android會產生一個新的saaid,如此會導致應用卡白屏或是提示需要登錄,ssaid是判斷應用是否換過環境與設備的判斷之一,保持一致可以減少諸如提示異地登錄或是需要重新登入驗證的方法。
|
||||
|
||||
|
||||
##### 附加說明:如何恢復 以下是關於恢復資料夾內的文件說明?
|
||||
|
||||
1. 找到恢復資料夾內的appList.txt打開 編輯列表 保存退出
|
||||
@@ -47,13 +52,13 @@
|
||||
|
||||
3. 重新生成應用列表.sh可用於刷新appList.txt內的列表 使用時機為當你刪除列表內的任何應用備份時,抑或者是恢復備份.sh提示列表錯誤時
|
||||
|
||||
4. 終止腳本.sh用於突然想要終止腳本或是意外操場時使用 同理備份資料夾也有一個,因為腳本無須後台特性不能使用常規手段終結,故此另外寫了一個腳本終止
|
||||
4. 終止腳本.sh用於突然想要終止腳本或是意外操作時使用 同理備份資料夾也有一個,因為腳本無須後台特性不能使用常規手段終結,故此另外寫了一個腳本終止
|
||||
|
||||
|
||||
# 關於如何更新腳本?
|
||||
- 目前有三種更新方法,有下列方式
|
||||
- 1.手動將下載的備份腳本zip不解壓縮直接放到腳本任意目錄(不包括tools目錄內)的任意地方執行任何腳本即可更新,腳本將提示
|
||||
- 2.此備份的任何腳本在執行時均會聯網檢測腳本版本,當更新時會自己提示與下載,根據腳本提示操作的即可
|
||||
- 2.此備份的任何腳本在執行時均會聯網檢測腳本版本,當更新時會自己提示與下載,根據腳本提示操作的即可(conf update=1時生效),腳本聯網僅作為檢查更新用途,無任何非法操作亦或是下發格機
|
||||
- 3.將下載的壓縮包不解壓縮直接放在/storage/emulated/0/Download腳本自動檢測更新,並按照提示操作即可
|
||||
- 4.在QQ群內下載的腳本不解壓縮腳本會自己檢測更新
|
||||
|
||||
@@ -61,7 +66,11 @@
|
||||
- 如果使用過程中出現問題,請攜帶截圖並詳細說明問題,建立 [issues](https://github.com/YAWAsau/backup_script/issues)。
|
||||
- 酷安 @[落葉淒涼TEL](http://www.coolapk.com/u/2277637)
|
||||
- QQ組 976613477
|
||||
- TG https://t.me/backup_script
|
||||
- TG https://t.me/yawasau_script
|
||||
|
||||
## 答疑
|
||||
- 一個shell腳本內為什麼有dex?
|
||||
- dex用來實現腳本難以實現的目的,目前saaid備份恢復,備份恢復運行時權限與ops權限,下載與訪問GitHub api來檢查腳本更新,列出使用者應用名稱與包名,繁體轉簡體均為dex的功能,感謝[Android-DataBackup](https://github.com/XayahSuSuSu/Android-DataBackup) by [XayahSuSuSu](https://github.com/XayahSuSuSu)
|
||||
|
||||
## 常見問題
|
||||
|
||||
@@ -87,7 +96,7 @@ A5;腳本備份時會比對上次備份時的備份SIZE大小 如果有差異就
|
||||
## 銘謝貢獻
|
||||
- 臭批老k([kmou424](https://github.com/kmou424)):提供部分與驗證函數思路
|
||||
- 屑老方([雄氏老方](http://www.coolapk.com/u/665894)):提供自動更新腳本方案
|
||||
- 依心所言&情非得已c:提供appinfo替代aapt作為更高效的dump包名
|
||||
- 胖子老陳(雨季騷年)
|
||||
- XayahSuSuSu([XayahSuSuSu](https://github.com/XayahSuSuSu)):提供App支持
|
||||
- XayahSuSuSu([XayahSuSuSu](https://github.com/XayahSuSuSu)):提供App支持,dex支持
|
||||
|
||||
`文檔編輯:Petit-Abba, YuKongA`
|
||||
|
||||
@@ -374,9 +374,12 @@
|
||||
"2409BRN2CC" "Redmi 14C 國行版"
|
||||
"2409BRN2CA" "Redmi 14C 國際版"
|
||||
"2409BRN2CI" "Redmi 14C 印度版"
|
||||
"2409BRN2CL" "Redmi 14C 拉美版 / 日本版"
|
||||
"2409BRN2CL" "Redmi 14C 拉美版 / 日韓版"
|
||||
"2409BRN2CY" "Redmi 14C 國際版 (NFC)"
|
||||
"2411DRN47C" "Redmi 14R 5G"
|
||||
"2411DRN47G" "Redmi 14C 5G 國際版"
|
||||
"2411DRN47R" "Redmi 14C 5G 日本版"
|
||||
"2411DRN47C" "Redmi 14R 5G 國行版"
|
||||
"2411DRN47I" "Redmi 14C 5G 印度版"
|
||||
"2014018" "紅米 Note 聯通 3G 標準版"
|
||||
"2013121" "紅米 Note 聯通 3G 增強版"
|
||||
"2014017" "紅米 Note 移動 3G 標準版"
|
||||
@@ -449,7 +452,7 @@
|
||||
"A001XM" "Redmi Note 9T 5G 日本版 (SoftBank)"
|
||||
"M2007J17C" "Redmi Note 9 Pro 5G 國行版"
|
||||
"M2003J6A1G" "Redmi Note 9S 國際版"
|
||||
"M2003J6A1R" "Redmi Note 9S 日本版 / Redmi Note 9S 韓國版"
|
||||
"M2003J6A1R" "Redmi Note 9S 日韓版"
|
||||
"M2003J6A1I" "Redmi Note 9 Pro 印度版"
|
||||
"M2003J6B1I" "Redmi Note 9 Pro Max 印度版"
|
||||
"M2003J6B2G" "Redmi Note 9 Pro 國際版"
|
||||
@@ -552,6 +555,7 @@
|
||||
"M2004J7BC" "Redmi 10X Pro 5G"
|
||||
"M2003J15SC" "Redmi 10X 4G"
|
||||
"24069RA21C" "Redmi Turbo 3"
|
||||
"24129RT7CC" "REDMI Turbo 4"
|
||||
"M1903F10A" "Redmi K20 全網通版"
|
||||
"M1903F10C" "Redmi K20 運營商全網通版"
|
||||
"M1903F10I" "Redmi K20 印度版"
|
||||
@@ -585,7 +589,9 @@
|
||||
"23117RK66C" "Redmi K70 Pro"
|
||||
"2311DRK48C" "Redmi K70E"
|
||||
"2407FRK8EC" "Redmi K70 至尊版"
|
||||
"24117RK2CC" "Redmi K80"
|
||||
"24117RK2CC" "REDMI K80"
|
||||
"24122RKC7C" "REDMI K80 Pro"
|
||||
"24127RK2CC" "REDMI K80 Pro 冠軍版"
|
||||
"2016020" "紅米 Pro 標準版"
|
||||
"2016021" "紅米 Pro 高配版 / 尊享版"
|
||||
"M1803E6E" "紅米 S2 全網通版"
|
||||
@@ -614,6 +620,7 @@
|
||||
"24048RN6CI" "Redmi A3x 印度版"
|
||||
"24044RN32L" "Redmi A3x 拉美版"
|
||||
"2409BRN2CG" "Redmi A3 Pro 國際版"
|
||||
"24116RNC1I" "Redmi A4 5G 印度版"
|
||||
"22081283C" "Redmi Pad 國行版"
|
||||
"22081283G" "Redmi Pad 國際版"
|
||||
"23073RPBFC" "Redmi Pad SE 國行版"
|
||||
@@ -623,7 +630,7 @@
|
||||
"2405CRPFDC" "Redmi Pad Pro Wi-Fi 國行版"
|
||||
"2405CRPFDG" "Redmi Pad Pro Wi-Fi 國際版"
|
||||
"2405CRPFDI" "Redmi Pad Pro Wi-Fi 印度版"
|
||||
"2405CRPFDL" "Redmi Pad Pro Wi-Fi 拉美版"
|
||||
"2405CRPFDL" "Redmi Pad Pro Wi-Fi 拉美版 / 韓國版"
|
||||
"24074RPD2C" "Redmi Pad Pro 5G 國行版"
|
||||
"24074RPD2G" "Redmi Pad Pro 5G 國際版"
|
||||
"24074RPD2I" "Redmi Pad Pro 5G 印度版"
|
||||
@@ -662,6 +669,10 @@
|
||||
"2311DRK48G" "POCO X6 Pro 5G 國際版"
|
||||
"2311DRK48I" "POCO X6 Pro 5G 印度版"
|
||||
"2312FRAFDI" "POCO X6 Neo 印度版"
|
||||
"24095PCADG" "POCO X7 國際版"
|
||||
"24095PCADI" "POCO X7 印度版"
|
||||
"2412DPC0AG" "POCO X7 Pro 國際版"
|
||||
"2412DPC0AI" "POCO X7 Pro 印度版"
|
||||
"M2004J19PI" "POCO M2 印度版"
|
||||
"M2003J6CI" "POCO M2 Pro 印度版"
|
||||
"M2010J19CG" "POCO M3 國際版"
|
||||
@@ -701,6 +712,7 @@
|
||||
"2310FPCA4I" "POCO C65 印度版"
|
||||
"2410FPCC5G" "POCO C75 國際版"
|
||||
"2410FPCC5I" "POCO C75 印度版"
|
||||
"24116PCC1I" "POCO C75 5G 印度版"
|
||||
"2405CPCFBG" "POCO Pad Wi-Fi 國際版"
|
||||
"24074PCD2I" "POCO Pad 5G 印度版"
|
||||
"FYJ01QP" "小米米家翻譯機"
|
||||
@@ -2228,7 +2240,7 @@
|
||||
"NX616J" "nubia X"
|
||||
"NX612J" "nubia V18"
|
||||
"NX651J" "nubia Play"
|
||||
"NX724J" "nubia Flip"
|
||||
"NX724J" "nubia Flip 5G / nubia Flip 5G S"
|
||||
"NX302J" "nubia 小牛"
|
||||
"NX513J" "nubia My 布拉格 全網通版"
|
||||
"NX513H" "nubia My 布拉格 雙 4G 版"
|
||||
@@ -2241,9 +2253,20 @@
|
||||
"NX301J" "nubia N5"
|
||||
"nubia 8150N" "nubia Neo 5G"
|
||||
"Z2352N" "nubia Neo 2 5G"
|
||||
"Z2461" "nubia Neo 3"
|
||||
"Z2465N" "nubia Neo 3 GT 5G"
|
||||
"Z2353" "nubia Music"
|
||||
"Z6255CA" "nubia Blade A72"
|
||||
"Z2460" "nubia Music 2"
|
||||
"Z2455" "nubia Focus"
|
||||
"Z2462N" "nubia Focus 2 5G"
|
||||
"Z2463N" "nubia Focus 2 Ultra 5G"
|
||||
"Z6255CA" "nubia A75"
|
||||
"nubia 8550" "nubia V50 Vita"
|
||||
"Z2356" "nubia V60"
|
||||
"Z2350" "nubia V60 Design"
|
||||
"Z2459" "nubia V70"
|
||||
"Z2458" "nubia V70 Design"
|
||||
"Z2467" "nubia V70 Max"
|
||||
"LPD-20W" "nubia Pad 3D"
|
||||
"NP02J" "nubia Pad 3D II"
|
||||
"NX609J" "紅魔電競遊戲手機"
|
||||
@@ -2368,6 +2391,8 @@
|
||||
"PJF110" "OnePlus Ace 3V 國行版"
|
||||
"PJX110" "OnePlus Ace 3 Pro 國行版"
|
||||
"PJZ110" "OnePlus 13 國行版"
|
||||
"PKG110" "OnePlus Ace 5 國行版"
|
||||
"PKR110" "OnePlus Ace 5 Pro 國行版"
|
||||
"AC2001" "OnePlus Nord 印度版"
|
||||
"AC2003" "OnePlus Nord 歐洲版 / 國際版"
|
||||
"DN2101" "OnePlus Nord 2 印度版"
|
||||
@@ -2405,9 +2430,10 @@
|
||||
"DE2118" "OnePlus Nord N200 T-Mobile 版"
|
||||
"CPH2389" "OnePlus Nord N300"
|
||||
"CPH2551" "OnePlus Open"
|
||||
"OPD2203" "OnePlus Pad"
|
||||
"OPD2203" "OnePlus Pad (國際)"
|
||||
"OPD2304" "OnePlus Pad Go LTE"
|
||||
"OPD2305" "OnePlus Pad Go Wi-Fi"
|
||||
"OPD2407" "OnePlus Pad (國行)"
|
||||
"OPD2404" "OnePlus Pad Pro"
|
||||
"OPD2403" "OnePlus Pad 2"
|
||||
"W101IN" "OnePlus Band 印度版"
|
||||
@@ -2478,6 +2504,7 @@
|
||||
"RMX3700" "真我 GT Neo5 SE"
|
||||
"RMX3852" "真我 GT Neo6"
|
||||
"RMX3850" "真我 GT Neo6 SE"
|
||||
"RMX5060" "真我 Neo7"
|
||||
"RMX1971" "真我 Q"
|
||||
"RMX2117" "真我 Q2 5G"
|
||||
"RMX2173" "真我 Q2 Pro 5G"
|
||||
@@ -2527,6 +2554,7 @@
|
||||
"RMX3781" "真我 V50s"
|
||||
"RMX3995" "真我 V60"
|
||||
"RMX3996" "真我 V60s"
|
||||
"RMX3953" "真我 V60 Pro"
|
||||
"RMP2108" "真我平板 X"
|
||||
"CPH1861" "realme 1"
|
||||
"RMX1805" "realme 2"
|
||||
@@ -2582,6 +2610,7 @@
|
||||
"RMX5000" "realme 13+ 5G"
|
||||
"RMX3990" "realme 13 Pro 5G"
|
||||
"RMX3921" "realme 13 Pro+ 5G"
|
||||
"RMX3940" "realme 14x 5G"
|
||||
"RMX1921" "realme XT Global"
|
||||
"RMX1922" "realme XT India"
|
||||
"RMX1992" "realme X2 India"
|
||||
@@ -2602,6 +2631,7 @@
|
||||
"RMX3709" "realme GT 3 240W"
|
||||
"RMX3851" "realme GT 6"
|
||||
"RMX3853" "realme GT 6T"
|
||||
"RMX5011" "realme GT 7 Pro"
|
||||
"RMX1946" "realme C2"
|
||||
"RMX2022" "realme C3 Global"
|
||||
"RMX2027" "realme C3 India"
|
||||
@@ -2636,6 +2666,7 @@
|
||||
"RMX3997" "realme C65 5G"
|
||||
"RMX3890" "realme C67"
|
||||
"RMX3782" "realme C67 5G"
|
||||
"RMX3941" "realme C75"
|
||||
"RMX3834" "realme Note 50"
|
||||
"RMX1833" "realme U1"
|
||||
"RMX3870" "realme P1 5G"
|
||||
@@ -2830,7 +2861,7 @@
|
||||
"V2343A" "vivo Y200 5G"
|
||||
"V2361GA" "vivo Y200 GT 5G"
|
||||
"V2353DA" "vivo Y200t 5G"
|
||||
"V2435A" "vivo Y300"
|
||||
"V2435A" "vivo Y300 5G"
|
||||
"V2410A" "vivo Y300 Pro 5G"
|
||||
"V2115A" "vivo T1"
|
||||
"V2188A" "vivo T2x"
|
||||
@@ -2911,6 +2942,7 @@
|
||||
"V2312A" "iQOO Z8x"
|
||||
"V2361A" "iQOO Z9"
|
||||
"V2352A" "iQOO Z9 Turbo"
|
||||
"V2352GA" "iQOO Z9 Turbo 長續航版"
|
||||
"V2417A" "iQOO Z9 Turbo+"
|
||||
"V2353A" "iQOO Z9x"
|
||||
"V2023A" "iQOO U1"
|
||||
@@ -2982,8 +3014,13 @@
|
||||
"V2349" "vivo V30 SE"
|
||||
"V2348" "vivo V40"
|
||||
"V2347" "vivo V40 Pro"
|
||||
"V2418" "vivo V40e"
|
||||
"V2341" "vivo V40 Lite"
|
||||
"V2403" "vivo V40e"
|
||||
"V2424" "vivo V40 Lite"
|
||||
"V2418" "vivo V40 Lite 5G"
|
||||
"V2337" "vivo V40 SE 5G"
|
||||
"V2427" "vivo V50"
|
||||
"V2428" "vivo V50e"
|
||||
"V2440" "vivo V50 Lite"
|
||||
"V1937" "vivo S1 Prime"
|
||||
"vivo 1920_20" "vivo S1 Pro"
|
||||
"V2168" "vivo T1"
|
||||
@@ -3052,6 +3089,7 @@
|
||||
"V2315" "vivo Y28 5G"
|
||||
"V2351" "vivo Y28s 5G"
|
||||
"V2407" "vivo Y28e 5G"
|
||||
"V2420" "vivo Y29 5G"
|
||||
"V2160" "vivo Y30 5G"
|
||||
"V2036_21" "vivo Y31"
|
||||
"V2057" "vivo Y33"
|
||||
@@ -3062,6 +3100,7 @@
|
||||
"V2324" "vivo Y36"
|
||||
"V2248" "vivo Y36 5G"
|
||||
"V2343" "vivo Y38 5G"
|
||||
"V2444" "vivo Y39 5G"
|
||||
"V2035" "vivo Y51"
|
||||
"V2031_21" "vivo Y51s"
|
||||
"V2053" "vivo Y52 5G"
|
||||
@@ -3070,6 +3109,7 @@
|
||||
"V2127" "vivo Y55 5G"
|
||||
"V2311" "vivo Y56 5G"
|
||||
"V2355" "vivo Y58 5G"
|
||||
"V2443" "vivo Y59 5G"
|
||||
"V2041" "vivo Y72"
|
||||
"V2060" "vivo Y72 5G"
|
||||
"V2059-EG" "vivo Y73"
|
||||
@@ -3094,6 +3134,7 @@
|
||||
"I2019" "iQOO 9 SE"
|
||||
"I2212" "iQOO 11"
|
||||
"I2220" "iQOO 12"
|
||||
"I2401" "iQOO 13"
|
||||
"I2202" "iQOO Neo6"
|
||||
"I2214" "iQOO Neo7 5G"
|
||||
"I2217" "iQOO Neo7 Pro 5G"
|
||||
@@ -3187,6 +3228,8 @@
|
||||
"PJJ110" "OPPO Reno11 Pro"
|
||||
"PJV110" "OPPO Reno12"
|
||||
"PJW110" "OPPO Reno12 Pro"
|
||||
"PKM110" "OPPO Reno13"
|
||||
"PKK110" "OPPO Reno13 Pro"
|
||||
"PCLM10" "OPPO Reno Ace"
|
||||
"PDHM00" "OPPO Ace2"
|
||||
"PACM00" "OPPO R15 全網通版"
|
||||
@@ -3259,6 +3302,7 @@
|
||||
"PKD130" "OPPO A3x"
|
||||
"PKL110" "OPPO A3i"
|
||||
"PJY110" "OPPO A3 Pro"
|
||||
"PKP110" "OPPO A5 Pro"
|
||||
"PBCM30" "OPPO K1"
|
||||
"PCGM00" "OPPO K3 全網通版"
|
||||
"PCGT00" "OPPO K3 移動版"
|
||||
@@ -3281,6 +3325,7 @@
|
||||
"OPD2102" "OPPO Pad Air"
|
||||
"OPD2201" "OPPO Pad 2"
|
||||
"OPD2301" "OPPO Pad Air2"
|
||||
"OPD2405" "OPPO Pad 3"
|
||||
"OPD2401" "OPPO Pad 3 Pro"
|
||||
"OB19B1" "OPPO Band 標準版 / 名偵探柯南限定版"
|
||||
"OB19B3" "OPPO Band NFC 版"
|
||||
@@ -3304,6 +3349,8 @@
|
||||
"OWW213" "OPPO Watch SE"
|
||||
"OWW221" "OPPO Watch 4 Pro"
|
||||
"OWW231" "OPPO Watch X"
|
||||
"OWW242" "OPPO Watch"
|
||||
"OWW251" "OPPO Watch"
|
||||
"CPH1875" "OPPO Find X"
|
||||
"CPH2023" "OPPO Find X2"
|
||||
"CPH2025" "OPPO Find X2 Pro"
|
||||
|
||||
BIN
tools/busybox
BIN
tools/busybox
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
450
tools/tools.sh
450
tools/tools.sh
@@ -8,9 +8,8 @@ shell_language="zh-TW"
|
||||
MODDIR="$MODDIR"
|
||||
MODDIR_NAME="${MODDIR##*/}"
|
||||
tools_path="$MODDIR/tools"
|
||||
Compression_rate=9
|
||||
script="${0##*/}"
|
||||
backup_version="202411251952"
|
||||
backup_version="202412282251"
|
||||
[[ $SHELL = *mt* ]] && echo "請勿使用MT管理器拓展包環境執行,請更換系統環境" && exit 2
|
||||
update_backup_settings_conf() {
|
||||
echo "#0關閉音量鍵選擇 (如選項未設置,則強制使用音量鍵選擇)
|
||||
@@ -27,6 +26,10 @@ background_execution="${background_execution:-0}"
|
||||
#1簡體中文 0繁體中文
|
||||
Shell_LANG="$Shell_LANG"
|
||||
|
||||
#備份開始後偽裝亮屏
|
||||
#1開啟 0關閉
|
||||
setDisplayPowerMode="${setDisplayPowerMode:-0}"
|
||||
|
||||
#自定義備份文件輸出位置 支持相對路徑(留空則默認當前路徑)
|
||||
Output_path=\""$Output_path"\"
|
||||
|
||||
@@ -150,6 +153,10 @@ Lo="${Lo:-0}"
|
||||
1終端有可能完全無顯示,但是log會持續刷新,可直接完全關閉終端
|
||||
background_execution="${background_execution:-0}"
|
||||
|
||||
#恢復開始後偽裝亮屏
|
||||
#1開啟 0關閉
|
||||
setDisplayPowerMode="${setDisplayPowerMode:-0}"
|
||||
|
||||
#腳本語言設置 為空自動針對當前系統語言環境自動翻譯
|
||||
#1簡體中文 0繁體中文
|
||||
Shell_LANG="$Shell_LANG"
|
||||
@@ -331,16 +338,21 @@ while read -r file expected_hash; do
|
||||
break
|
||||
fi
|
||||
done <<< "$(cat <<EOF
|
||||
zstd 55cc57a3d079dd90e74d972c705c4f9389dd00a7175de148e21000eab01f7ed9
|
||||
zstd 2388211eb3960070c6b4528f68f7129a9ef5d165a0fef0113ac59e723006f4ca
|
||||
tar 3c605b1e9eb8283555225dcad4a3bf1777ae39c5f19a2c8b8943140fd7555814
|
||||
classes.dex 9e7fa38737f14baed0fb3b0c378472a696869edfca08b3e9b19fd1f56c240b2b
|
||||
classes.dex 0057136d4da6c0a3d1bb3e67c9cd845acaed183217a9dfee423a05a3d30121ab
|
||||
bc b15d730591f6fb52af59284b87d939c5bea204f944405a3518224d8df788dc15
|
||||
busybox c629fce4b0dd3ba9775f851d0941e74582115f423258d3a79800f2bd11d30f5c
|
||||
busybox 4d60ab3f5a59ebb2ca863f2f514e6924401b581e9b64f602665c008177626651
|
||||
find 7fa812e58aafa29679cf8b50fc617ecf9fec2cfb2e06ea491e0a2d6bf79b903b
|
||||
jq 4dd2d8a0661df0b22f1bb9a1f9830f06b6f3b8f7d91211a1ef5d7c4f06a8b4a5
|
||||
keycheck 50645ee0e0d2a7d64fb4a1286446df7a4445f3d11aefd49eeeb88515b314c363
|
||||
zip d9015b3c5d3376a4f9f2d204afd2aeaa4a86fd0174da1be090e41622e73be0ec
|
||||
EOF)"
|
||||
if [[ $background_execution = 1 || $setDisplayPowerMode = 1 ]]; then
|
||||
alias notification="app_process /system/bin com.xayah.dex.NotificationUtil notify -t 'SpeedBackup' "$@""
|
||||
else
|
||||
alias notification="&>/dev/null"
|
||||
fi
|
||||
if [[ $quit -ne 0 ]]; then
|
||||
exit "$quit"
|
||||
fi
|
||||
@@ -423,6 +435,7 @@ echo_log() {
|
||||
Set_back_0
|
||||
else
|
||||
echoRgb "$1失敗,過世了" "0"
|
||||
notification "$RANDOM" "$name1: $1失敗,過世"
|
||||
result=1
|
||||
Set_back_1
|
||||
fi
|
||||
@@ -613,6 +626,7 @@ backup|Restore|Restore2|Getlist|backup_media)
|
||||
zstd | Zstd | ZSTD) user="$(echo "${0%}" | sed 's/.*\/Backup_zstd_\([0-9]*\).*/\1/')" ;;
|
||||
esac
|
||||
fi
|
||||
[[ $user != 0 ]] && am start-user "$user"
|
||||
path="/data/media/$user/Android"
|
||||
path2="/data/user/$user"
|
||||
path3="/data/user_de/$user"
|
||||
@@ -620,6 +634,7 @@ backup|Restore|Restore2|Getlist|backup_media)
|
||||
echoRgb "當前操作為用戶$user"
|
||||
export USER_ID="$user" ;;
|
||||
esac
|
||||
unset LD_LIBRARY_PATH
|
||||
#因接收USER_ID環境變量問題故將函數放在此處
|
||||
alias appinfo="app_process /system/bin com.xayah.dex.HiddenApiUtil getInstalledPackagesAsUser $USER_ID $@"
|
||||
alias appinfo2="app_process /system/bin com.xayah.dex.HiddenApiUtil getPackageLabel $USER_ID $@"
|
||||
@@ -631,6 +646,7 @@ alias get_Permissions="app_process /system/bin com.xayah.dex.HiddenApiUtil getRu
|
||||
alias Set_true_Permissions="app_process /system/bin com.xayah.dex.HiddenApiUtil grantRuntimePermission $USER_ID $@"
|
||||
alias Set_false_Permissions="app_process /system/bin com.xayah.dex.HiddenApiUtil revokeRuntimePermission $USER_ID $@"
|
||||
alias Set_Ops="app_process /system/bin com.xayah.dex.HiddenApiUtil setOpsMode $USER_ID $@"
|
||||
alias setDisplay="app_process /system/bin com.xayah.dex.HiddenApiUtil setDisplayPowerMode $@"
|
||||
find_tools_path="$(find "$path_hierarchy"/* -maxdepth 1 -name "tools" -type d ! -path "$path_hierarchy/tools")"
|
||||
Rename_script () {
|
||||
HT="${HT:=0}"
|
||||
@@ -747,10 +763,7 @@ update_script() {
|
||||
esac
|
||||
echoRgb "從$zipFile更新"
|
||||
if [[ -d $path_hierarchy/tools ]]; then
|
||||
cp -r "$path_hierarchy/tools" "$TMPDIR"
|
||||
mv "$zipFile" "$path_hierarchy"
|
||||
zipFile="$path_hierarchy/${zipFile##*/}"
|
||||
rm -rf "$path_hierarchy/tools"
|
||||
mv "$path_hierarchy/tools" "$TMPDIR"
|
||||
unzip -o "$zipFile" tools/* -d "$path_hierarchy" | sed 's/inflating/釋放/g ; s/creating/創建/g ; s/Archive/解壓縮/g'
|
||||
echo_log "解壓縮${zipFile##*/}"
|
||||
if [[ $result = 0 ]]; then
|
||||
@@ -785,7 +798,7 @@ update_script() {
|
||||
echoRgb "$update_path/tools已經更新完成"
|
||||
fi
|
||||
else
|
||||
cp -r "$TMPDIR/tools" "$MODDIR"
|
||||
mv "$TMPDIR/tools" "$MODDIR"
|
||||
fi
|
||||
rm -rf "$TMPDIR"/* "$zipFile" "$MODDIR/tools.sh"
|
||||
echoRgb "更新完成 請重新執行腳本" "2"
|
||||
@@ -1024,23 +1037,22 @@ size() {
|
||||
}
|
||||
#分區佔用信息
|
||||
partition_info() {
|
||||
unset Skip
|
||||
Occupation_status="$(df -B1 "${1%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-1)}')"
|
||||
Filesize2="$(size "$Filesize")"
|
||||
echo " -$2大小:$Filesize2 剩餘大小:$(size "$Occupation_status")"
|
||||
[[ $Filesize != "" ]] && [[ $(echo "$Filesize > $Occupation_status" | bc) -eq 1 ]] && echoRgb "$2備份大小將超出rom可用大小" "0" && exit 2
|
||||
[[ $Filesize != "" ]] && [[ $(echo "$Filesize > $Occupation_status" | bc) -eq 1 ]] && echoRgb "$2備份大小將超出rom可用大小" "0" && Skip=1
|
||||
Occupation_status="$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-1),$(NF)}')"
|
||||
}
|
||||
kill_app() {
|
||||
if [[ $name2 != bin.mt.plus && $name2 != com.termux && $name2 != bin.mt.plus.canary ]]; then
|
||||
if [[ $Pause_Freeze = 0 ]]; then
|
||||
if [[ $(dumpsys activity processes | grep "packageList" | cut -d '{' -f2 | cut -d '}' -f1 | egrep -w "^$name2$" | sed -n '1p') = $name2 ]]; then
|
||||
pkill -9 -f "$name2$|$name2[:/_]"
|
||||
killall -9 "$name2" &>/dev/null
|
||||
am force-stop --user "$user" "$name2" &>/dev/null
|
||||
am kill "$name2" &>/dev/null
|
||||
echoRgb "殺死$name1進程"
|
||||
fi
|
||||
fi
|
||||
if [[ $(dumpsys activity processes | grep "packageList" | cut -d '{' -f2 | cut -d '}' -f1 | egrep -w "^$name2$" | sed -n '1p') = $name2 ]]; then
|
||||
pkill -9 -f "$name2$|$name2[:/_]"
|
||||
killall -9 "$name2" &>/dev/null
|
||||
am force-stop --user "$user" "$name2" &>/dev/null
|
||||
am kill "$name2" &>/dev/null
|
||||
echoRgb "殺死$name1進程"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
Backup_apk() {
|
||||
@@ -1073,53 +1085,55 @@ Backup_apk() {
|
||||
Filesize="$(find "$apk_path2" -type f -printf "%s\n" | awk '{s+=$1} END {print s}')"
|
||||
rm -rf "$Backup_folder/apk.tar"*
|
||||
partition_info "$Backup" "$name1 apk"
|
||||
#備份apk
|
||||
echoRgb "$1"
|
||||
echo "$apk_path" | sed -e '/^$/d' | while read; do
|
||||
echoRgb "${REPLY##*/} $(size "$REPLY")"
|
||||
done
|
||||
(
|
||||
cd "$apk_path2"
|
||||
case $Compression_method in
|
||||
tar | TAR | Tar) tar --checkpoint-action="ttyout=%T\r" -cf "$Backup_folder/apk.tar" *.apk ;;
|
||||
zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" -cf - *.apk | zstd --ultra -3 -T0 -q --priority=rt >"$Backup_folder/apk.tar.zst" ;;
|
||||
esac
|
||||
)
|
||||
echo_log "備份$apk_number個Apk"
|
||||
if [[ $result = 0 ]]; then
|
||||
Validation_file "$Backup_folder/apk.tar"*
|
||||
if [[ $result = 0 ]]; then
|
||||
[[ $(sed -e '/^$/d' "$txt2" 2>/dev/null | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2"
|
||||
[[ $apk_version != "" ]] && {
|
||||
echoRgb "覆蓋app_details"
|
||||
jq --arg apk_version "$apk_version2" --arg software "$name1" '.[$software].apk_version = $apk_version' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
} || {
|
||||
echoRgb "新增app_details"
|
||||
extra_content="{
|
||||
\"$name1\": {
|
||||
\"PackageName\": \"$name2\",
|
||||
\"apk_version\": \"$apk_version2\"
|
||||
}
|
||||
}"
|
||||
jq --argjson new_content "$extra_content" '. += $new_content' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
}
|
||||
else
|
||||
rm -rf "$Backup_folder"
|
||||
fi
|
||||
if [[ $name2 = com.android.chrome ]]; then
|
||||
#刪除所有舊apk ,保留一個最新apk進行備份
|
||||
ReservedNum=1
|
||||
FileNum="$(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | wc -l)"
|
||||
while [[ $FileNum -gt $ReservedNum ]]; do
|
||||
OldFile="$(ls -rt /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | head -1)"
|
||||
rm -rf "${OldFile%/*/*}" && echoRgb "刪除文件:${OldFile%/*/*}"
|
||||
let "FileNum--"
|
||||
done
|
||||
[[ -f $(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null) && $(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | wc -l) = 1 ]] && cp -r "$(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null)" "$Backup_folder/nmsl.apk"
|
||||
fi
|
||||
else
|
||||
rm -rf "$Backup_folder"
|
||||
fi
|
||||
if [[ $Skip != 1 ]]; then
|
||||
#備份apk
|
||||
echoRgb "$1"
|
||||
echo "$apk_path" | sed -e '/^$/d' | while read; do
|
||||
echoRgb "${REPLY##*/} $(size "$REPLY")"
|
||||
done
|
||||
(
|
||||
cd "$apk_path2"
|
||||
case $Compression_method in
|
||||
tar | TAR | Tar) tar --checkpoint-action="ttyout=%T\r" -cf "$Backup_folder/apk.tar" *.apk ;;
|
||||
zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" -cf - *.apk | zstd --ultra -3 -T0 -q --priority=rt >"$Backup_folder/apk.tar.zst" ;;
|
||||
esac
|
||||
)
|
||||
echo_log "備份$apk_number個Apk"
|
||||
if [[ $result = 0 ]]; then
|
||||
Validation_file "$Backup_folder/apk.tar"*
|
||||
if [[ $result = 0 ]]; then
|
||||
[[ $(sed -e '/^$/d' "$txt2" 2>/dev/null | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2"
|
||||
[[ $apk_version != "" ]] && {
|
||||
echoRgb "覆蓋app_details"
|
||||
jq --arg apk_version "$apk_version2" --arg software "$name1" '.[$software].apk_version = $apk_version' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
} || {
|
||||
echoRgb "新增app_details"
|
||||
extra_content="{
|
||||
\"$name1\": {
|
||||
\"PackageName\": \"$name2\",
|
||||
\"apk_version\": \"$apk_version2\"
|
||||
}
|
||||
}"
|
||||
jq --argjson new_content "$extra_content" '. += $new_content' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
}
|
||||
else
|
||||
rm -rf "$Backup_folder"
|
||||
fi
|
||||
if [[ $name2 = com.android.chrome ]]; then
|
||||
#刪除所有舊apk ,保留一個最新apk進行備份
|
||||
ReservedNum=1
|
||||
FileNum="$(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | wc -l)"
|
||||
while [[ $FileNum -gt $ReservedNum ]]; do
|
||||
OldFile="$(ls -rt /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | head -1)"
|
||||
rm -rf "${OldFile%/*/*}" && echoRgb "刪除文件:${OldFile%/*/*}"
|
||||
let "FileNum--"
|
||||
done
|
||||
[[ -f $(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null) && $(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null | wc -l) = 1 ]] && cp -r "$(ls /data/app/*/com.google.android.trichromelibrary_*/base.apk 2>/dev/null)" "$Backup_folder/nmsl.apk"
|
||||
fi
|
||||
else
|
||||
rm -rf "$Backup_folder"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
let osj++
|
||||
rm -rf "$Backup_folder"
|
||||
@@ -1130,7 +1144,7 @@ Backup_apk() {
|
||||
Backup_ssaid() {
|
||||
Ssaid="$(jq -r '.[] | select(.Ssaid != null).Ssaid' "$app_details")"
|
||||
ssaid="$(get_ssaid "$name2")"
|
||||
echoRgb "SSAID:$ssaid"
|
||||
[[ $ssaid != null ]] && echoRgb "SSAID:$ssaid"
|
||||
if [[ $ssaid != null && $ssaid != $Ssaid ]]; then
|
||||
echoRgb "$Ssaid>$ssaid"
|
||||
SSAID_apk="$(echo "$name1 \"$name2\"")"
|
||||
@@ -1164,7 +1178,7 @@ Backup_data() {
|
||||
data|obb) ;;
|
||||
*)
|
||||
data_path="$2"
|
||||
if [[ $1 != storage-isolation && $1 != thanox ]]; then
|
||||
if [[ $1 != storage-isolation && $1 != thanox && $1 != NoActive ]]; then
|
||||
Compression_method1="$Compression_method"
|
||||
Compression_method=tar
|
||||
fi
|
||||
@@ -1179,6 +1193,12 @@ Backup_data() {
|
||||
if [[ $Size != $Filesize ]]; then
|
||||
case $1 in
|
||||
user)
|
||||
if [[ $(su "$(get_uid "$name2" 2>/dev/null)" -c keystore_cli_v2 list | wc -l) -ge 2 ]]; then
|
||||
echoRgb "$name1包含keystore 恢復可能閃退" "0"
|
||||
jq --arg entry "$name1" '.[$entry].keystore |= "true"' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
else
|
||||
jq --arg entry "$name1" '.[$entry].keystore |= "false"' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
fi
|
||||
Backup_ssaid
|
||||
Backup_Permissions ;;
|
||||
esac
|
||||
@@ -1188,71 +1208,79 @@ Backup_data() {
|
||||
esac
|
||||
rm -rf "$Backup_folder/$1.tar"*
|
||||
partition_info "$Backup" "$1"
|
||||
echoRgb "備份$1數據"
|
||||
# 判斷是否超過指定大小
|
||||
if [[ $Filesize2 != *"bytes"* ]]; then
|
||||
if [[ $Filesize2 = *"KB"* ]]; then
|
||||
if [[ $(echo "${Filesize2% KB}" | bc) > 1 ]]; then
|
||||
Start_backup="true"
|
||||
if [[ $Skip != 1 ]]; then
|
||||
echoRgb "備份$1數據"
|
||||
# 判斷是否超過指定大小
|
||||
if [[ $Filesize2 != *"bytes"* ]]; then
|
||||
if [[ $Filesize2 = *"KB"* ]]; then
|
||||
if [[ $(echo "${Filesize2% KB}" | bc) > 1 ]]; then
|
||||
Start_backup="true"
|
||||
else
|
||||
Start_backup="false"
|
||||
fi
|
||||
else
|
||||
Start_backup="false"
|
||||
Start_backup="true"
|
||||
fi
|
||||
else
|
||||
Start_backup="true"
|
||||
Start_backup="false"
|
||||
fi
|
||||
else
|
||||
Start_backup="false"
|
||||
fi
|
||||
[[ $Start_backup = true ]] && {
|
||||
case $1 in
|
||||
user|user_de)
|
||||
case $Compression_method in
|
||||
tar | Tar | TAR) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" 2>/dev/null ;;
|
||||
zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | zstd --ultra -3 -T0 -q --priority=rt >"$Backup_folder/$1.tar.zst" 2>/dev/null ;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
case $Compression_method in
|
||||
tar | Tar | TAR) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/QQS" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" ;;
|
||||
zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/QQS" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | zstd --ultra -3 -T0 -q --priority=rt >"$Backup_folder/$1.tar.zst" ;;
|
||||
[[ $Start_backup = true ]] && {
|
||||
case $1 in
|
||||
user|user_de)
|
||||
case $Compression_method in
|
||||
tar | Tar | TAR) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" 2>/dev/null ;;
|
||||
zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" --exclude="${data_path##*/}/code_cache" --exclude="${data_path##*/}/no_backup" --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | zstd --ultra -3 -T0 -q --priority=rt >"$Backup_folder/$1.tar.zst" 2>/dev/null ;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
case $Compression_method in
|
||||
tar | Tar | TAR) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/QQ" --exclude="${data_path##*/}/Telegram" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" ;;
|
||||
zstd | Zstd | ZSTD) tar --checkpoint-action="ttyout=%T\r" --exclude="Backup_"* --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/QQ" --exclude="${data_path##*/}/Telegram" --exclude="${data_path##*/}"/.* --warning=no-file-changed -cpf - -C "${data_path%/*}" "${data_path##*/}" | zstd --ultra -3 -T0 -q --priority=rt >"$Backup_folder/$1.tar.zst" ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
echo_log "備份$1數據"
|
||||
} || {
|
||||
echoRgb "$1數據 $Filesize2太小" "0" && result=1
|
||||
}
|
||||
if [[ $result = 0 ]]; then
|
||||
Validation_file "$Backup_folder/$1.tar"*
|
||||
if [[ $result = 0 ]]; then
|
||||
if [[ ! $Filesize -eq 0 ]]; then
|
||||
size2="$(stat -c %s "$Backup_folder/$1.tar"*)"
|
||||
rate="$(echo "scale=2; (1 - ($size2 / $Filesize)) * 100" | bc)"
|
||||
echoRgb "壓縮率${rate}% 大小$(size "$size2")"
|
||||
fi
|
||||
[[ ${Backup_folder##*/} = Media ]] && [[ $(sed -e '/^$/d' "$mediatxt" | grep -w "${REPLY##*/}.tar$" | head -1) = "" ]] && echo "$FILE_NAME" >> "$mediatxt"
|
||||
if [[ $zsize != "" ]]; then
|
||||
extra_content="{
|
||||
\"$1\": {
|
||||
\"path\": \"$2\",
|
||||
\"Size\": \"$Filesize\"
|
||||
}
|
||||
}"
|
||||
jq --argjson new_content "$extra_content" '. += $new_content' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
else
|
||||
extra_content="{
|
||||
\"$1\": {
|
||||
\"Size\": \"$Filesize\"
|
||||
}
|
||||
}"
|
||||
jq --argjson new_content "$extra_content" '. += $new_content' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
fi
|
||||
else
|
||||
rm -rf "$Backup_folder/$1".tar.*
|
||||
fi
|
||||
fi
|
||||
[[ $Compression_method1 != "" ]] && Compression_method="$Compression_method1"
|
||||
unset Compression_method1
|
||||
echo_log "備份$1數據"
|
||||
} || {
|
||||
echoRgb "$1數據 $Filesize2太小" "0" && result=1
|
||||
}
|
||||
if [[ $result = 0 ]]; then
|
||||
Validation_file "$Backup_folder/$1.tar"*
|
||||
if [[ $result = 0 ]]; then
|
||||
if [[ ! $Filesize -eq 0 ]]; then
|
||||
size2="$(stat -c %s "$Backup_folder/$1.tar"*)"
|
||||
rate="$(echo "scale=2; (1 - ($size2 / $Filesize)) * 100" | bc)"
|
||||
echoRgb "壓縮率${rate}% 大小$(size "$size2")"
|
||||
fi
|
||||
[[ ${Backup_folder##*/} = Media ]] && [[ $(sed -e '/^$/d' "$mediatxt" | grep -w "${REPLY##*/}.tar$" | head -1) = "" ]] && echo "$FILE_NAME" >> "$mediatxt"
|
||||
if [[ $zsize != "" ]]; then
|
||||
extra_content="{
|
||||
\"$1\": {
|
||||
\"path\": \"$2\",
|
||||
\"Size\": \"$Filesize\"
|
||||
},
|
||||
\"Backup time\": {
|
||||
\"date\": \"$(date "+%Y.%m.%d %H:%M:%S")\"
|
||||
}
|
||||
}"
|
||||
jq --argjson new_content "$extra_content" '. += $new_content' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
else
|
||||
extra_content="{
|
||||
\"$1\": {
|
||||
\"Size\": \"$Filesize\"
|
||||
},
|
||||
\"Backup time\": {
|
||||
\"date\": \"$(date "+%Y.%m.%d %H:%M:%S")\"
|
||||
}
|
||||
}"
|
||||
jq --argjson new_content "$extra_content" '. += $new_content' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
fi
|
||||
else
|
||||
rm -rf "$Backup_folder/$1".tar.*
|
||||
fi
|
||||
fi
|
||||
[[ $Compression_method1 != "" ]] && Compression_method="$Compression_method1"
|
||||
unset Compression_method1
|
||||
fi
|
||||
else
|
||||
[[ $Size != "" ]] && echoRgb "$1數據無發生變化 跳過備份" "2"
|
||||
fi
|
||||
@@ -1275,6 +1303,7 @@ Release_data() {
|
||||
case $FILE_NAME2 in
|
||||
user)
|
||||
if [[ -d $X ]]; then
|
||||
[[ $(jq -r '.[] | select(.Ssaid != null).keystore' "$app_details") = true ]] && echoRgb "$name1存在keystore 恢復可能閃退" "0"
|
||||
FILE_PATH="$path2"
|
||||
Selinux_state="$(LS "$X" | awk 'NF>1{print $1}' | sed -e "s/system_data_file/app_data_file/g" 2>/dev/null)"
|
||||
else
|
||||
@@ -1290,7 +1319,8 @@ Release_data() {
|
||||
fi ;;
|
||||
data) FILE_PATH="$path/data" Selinux_state="$(LS "$FILE_PATH" | awk 'NF>1{print $1}' | sed -e "s/system_data_file/app_data_file/g" 2>/dev/null)" ;;
|
||||
obb) FILE_PATH="$path/obb" Selinux_state="$(LS "$FILE_PATH" | awk 'NF>1{print $1}' | sed -e "s/system_data_file/app_data_file/g" 2>/dev/null)";;
|
||||
thanox) FILE_PATH="/data/system" && find "/data/system" -name "thanos*" -maxdepth 1 -type d -exec rm -rf {} \; 2>/dev/null ;;
|
||||
thanox) FILE_PATH="/data/system" && find "/data/system" -name "thanos"* -maxdepth 1 -type d -exec rm -rf {} \; 2>/dev/null ;;
|
||||
NoActive) FILE_PATH="/data/system" && find "/data/system" -name "NoActive_"* -maxdepth 1 -type d -exec rm -rf {} \; 2>/dev/null ;;
|
||||
storage-isolation) FILE_PATH="/data/adb" ;;
|
||||
*)
|
||||
if [[ $A != "" ]]; then
|
||||
@@ -1322,13 +1352,10 @@ Release_data() {
|
||||
if [[ $result = 0 ]]; then
|
||||
case $FILE_NAME2 in
|
||||
user|data|obb|user_de)
|
||||
if [[ $G = "" ]]; then
|
||||
if [[ $(get_uid "$name2" 2>/dev/null) != "" ]]; then
|
||||
G="$(get_uid "$name2" 2>/dev/null)"
|
||||
else
|
||||
G="$(dumpsys package "$name2" 2>/dev/null | awk -F'uid=' '{print $2}' | egrep -o '[0-9]+' | head -n 1)"
|
||||
[[ $(echo "$G" | egrep -o '[0-9]+') = "" ]] && G="$(pm list packages -U --user "$user" | egrep -w "$name2" | awk -F'uid:' '{print $2}' | awk '{print $1}' | head -n 1)"
|
||||
fi
|
||||
G="$(get_uid "$name2" 2>/dev/null)"
|
||||
if [[ $G != "" ]]; then
|
||||
G="$(dumpsys package "$name2" 2>/dev/null | awk -F'uid=' '{print $2}' | egrep -o '[0-9]+' | head -n 1)"
|
||||
[[ $(echo "$G" | egrep -o '[0-9]+') = "" ]] && G="$(pm list packages -U --user "$user" | egrep -w "$name2" | awk -F'uid:' '{print $2}' | awk '{print $1}' | head -n 1)"
|
||||
fi
|
||||
G="$(echo "$G" | egrep -o '[0-9]+')"
|
||||
if [[ $G != "" ]]; then
|
||||
@@ -1351,7 +1378,7 @@ Release_data() {
|
||||
esac
|
||||
if [[ $Validation_settings = true ]]; then
|
||||
chown -hR "$uid" "$X/"
|
||||
echo_log "設置用戶組"
|
||||
echo_log "設置用戶組$uid"
|
||||
chcon -hR "$Selinux_state" "$X/" 2>/dev/null
|
||||
echo_log "selinux上下文設置"
|
||||
else
|
||||
@@ -1369,9 +1396,13 @@ Release_data() {
|
||||
fi
|
||||
;;
|
||||
thanox)
|
||||
restorecon -RF "$(find "/data/system" -name "thanos*" -maxdepth 1 -type d 2>/dev/null)/" 2>/dev/null
|
||||
restorecon -RF "$(find "/data/system" -name "thanos"* -maxdepth 1 -type d 2>/dev/null)/" 2>/dev/null
|
||||
echo_log "selinux上下文設置" && echoRgb "警告 thanox配置恢復後務必重啟\n -否則不生效" "0"
|
||||
;;
|
||||
NoActive)
|
||||
restorecon -RF "$(find "/data/system" -name "NoActive_"* -maxdepth 1 -type d 2>/dev/null)/" 2>/dev/null
|
||||
echo_log "selinux上下文設置"
|
||||
;;
|
||||
storage-isolation)
|
||||
restorecon -RF "/data/adb/storage-isolation/" 2>/dev/null
|
||||
echo_log "selinux上下文設置"
|
||||
@@ -1442,6 +1473,27 @@ disable_verify() {
|
||||
settings put global upload_apk_enable 0 2>/dev/null
|
||||
echoRgb "PLAY安全驗證為開啟狀態已被腳本關閉防止apk安裝失敗" "3"
|
||||
fi
|
||||
# 設定檔案路徑
|
||||
FILE="/data/data/com.android.vending/shared_prefs/finsky.xml"
|
||||
if [[ -f $FILE ]]; then
|
||||
# 提取當前的 auto_update_enabled 值
|
||||
CURRENT_VALUE="$(sed -n '/<boolean name="auto_update_enabled" /s/.*value="\([^"]*\)".*/\1/p' "$FILE")"
|
||||
if [[ $CURRENT_VALUE = true ]]; then
|
||||
sed -i '/<boolean name="auto_update_enabled" /s/value="true"/value="false"/' "$FILE"
|
||||
[[ $(sed -n '/<boolean name="auto_update_enabled" /s/.*value="\([^"]*\)".*/\1/p' "$FILE") = false ]] && echoRgb "play自動更新已關閉" "3"
|
||||
echoRgb "殺死 Google Play 商店..."
|
||||
am force-stop com.android.vending
|
||||
else
|
||||
if [[ $CURRENT_VALUE = "" ]]; then
|
||||
sed -i '/<\/map>/i \ <boolean name="auto_update_enabled" value="false" />' "$FILE"
|
||||
[[ $(sed -n '/<boolean name="auto_update_enabled" /s/.*value="\([^"]*\)".*/\1/p' "$FILE") = false ]] && echoRgb "auto_update_enabled已插入false,play自動更新已關閉" "3"
|
||||
echoRgb "殺死 Google Play 商店..."
|
||||
am force-stop com.android.vending
|
||||
else
|
||||
[[ $CURRENT_VALUE != false ]] && echoRgb "無法識別play auto_update_enabled當前$CURRENT_VALUE值" "0"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
get_name(){
|
||||
txt="$MODDIR/appList.txt"
|
||||
@@ -1647,11 +1699,20 @@ Set_screen_pause_seconds () {
|
||||
settings put system screen_off_timeout 1800000
|
||||
echo_log "設置無操作息屏時間30分鐘"
|
||||
fi
|
||||
[[ $setDisplayPowerMode = true ]] && {
|
||||
setDisplay 0
|
||||
echo_log "設置螢幕狀態false"
|
||||
}
|
||||
elif [[ $1 = off ]]; then
|
||||
if [[ $Get_dark_screen_seconds != "" ]]; then
|
||||
settings put system screen_off_timeout "$Get_dark_screen_seconds"
|
||||
echo_log "設置無操作息屏時間為$Get_dark_screen_seconds"
|
||||
input keyevent 224
|
||||
fi
|
||||
[[ $setDisplayPowerMode = true ]] && {
|
||||
setDisplay 2
|
||||
echo_log "設置螢幕狀態true"
|
||||
}
|
||||
fi
|
||||
}
|
||||
restore_permissions () {
|
||||
@@ -1743,6 +1804,10 @@ backup)
|
||||
echoRgb "全部應用備份結束後是否備份自定義目錄\n -音量上備份,音量下不備份" "2"
|
||||
get_version "備份" "不備份" && backup_media="$branch"
|
||||
}
|
||||
[[ $setDisplayPowerMode != "" ]] && isBoolean "$setDisplayPowerMode" "setDisplayPowerMode" && setDisplayPowerMode="$nsx" || {
|
||||
echoRgb "應用備份開始後關閉螢幕\n -音量上關閉,音量下不關閉" "2"
|
||||
get_version "關閉" "不關閉" && setDisplayPowerMode="$branch"
|
||||
}
|
||||
[[ $Background_apps_ignore != "" ]] && isBoolean "$Background_apps_ignore" "Background_apps_ignore" && Background_apps_ignore="$nsx" || {
|
||||
echoRgb "存在進程忽略備份\n -音量上忽略,音量下備份" "2"
|
||||
get_version "忽略" "備份" && Background_apps_ignore="$branch"
|
||||
@@ -1772,10 +1837,15 @@ backup)
|
||||
echoRgb "全部應用備份結束後是否備份自定義目錄\n -音量上備份,音量下不備份" "2"
|
||||
get_version "備份" "不備份" && backup_media="$branch"
|
||||
} || isBoolean "$backup_media" "backup_media" && backup_media="$nsx"
|
||||
[[ $setDisplayPowerMode = "" ]] && {
|
||||
echoRgb "應用備份開始後關閉螢幕\n -音量上關閉,音量下不關閉" "2"
|
||||
get_version "關閉" "不關閉" && setDisplayPowerMode="$branch"
|
||||
} || isBoolean "$setDisplayPowerMode" "setDisplayPowerMode" && setDisplayPowerMode="$nsx"
|
||||
[[ $Background_apps_ignore = "" ]] && {
|
||||
echoRgb "存在進程忽略備份\n -音量上忽略,音量下備份" "2"
|
||||
get_version "忽略" "備份" && Background_apps_ignore="$branch"
|
||||
} ;;
|
||||
} || isBoolean "$Background_apps_ignore" "Background_apps_ignore" && Background_apps_ignore="$nsx"
|
||||
;;
|
||||
2)
|
||||
[[ $Backup_Mode = "" ]] && {
|
||||
Enter_options "輸入1備份應用+數據,輸入0僅應用不包含數據" "應用+數據" "僅應用" && isBoolean "$parameter" "Backup_Mode" && Backup_Mode="$nsx"
|
||||
@@ -1806,6 +1876,11 @@ backup)
|
||||
} || {
|
||||
isBoolean "$backup_media" "backup_media" && backup_media="$nsx"
|
||||
}
|
||||
[[ $setDisplayPowerMode = "" ]] && {
|
||||
Enter_options "應用備份開始後關閉螢幕\n -輸入1關閉,0不關閉" "關閉" "不關閉" && isBoolean "$parameter" "setDisplayPowerMode" && setDisplayPowerMode="$nsx"
|
||||
} || {
|
||||
isBoolean "$setDisplayPowerMode" "setDisplayPowerMode" && setDisplayPowerMode="$nsx"
|
||||
}
|
||||
[[ $Background_apps_ignore = "" ]] && {
|
||||
Enter_options "存在進程忽略備份\n -輸入1不備份,0備份" "忽略" "備份" && isBoolean "$parameter" "Background_apps_ignore" && Background_apps_ignore="$nsx"
|
||||
} || {
|
||||
@@ -1837,7 +1912,7 @@ backup)
|
||||
hx="本地"
|
||||
echoRgb "腳本受到內核機制影響 息屏後IO性能嚴重影響\n -請勿關閉終端或是息屏備份 如需終止腳本\n -請執行終止腳本.sh即可停止" "3"
|
||||
backup_path
|
||||
echoRgb "配置詳細:\n -壓縮方式:$Compression_method\n -音量鍵確認:$Lo\n -更新:$update\n -備份模式:$Backup_Mode\n -備份外部數據:$Backup_obb_data\n -備份user數據:$Backup_user_data\n -自定義目錄備份:$backup_media\n -存在進程忽略備份:$Background_apps_ignore"
|
||||
echoRgb "配置詳細:\n -壓縮方式:$Compression_method\n -音量鍵確認:$Lo\n -更新:$update\n -備份模式:$Backup_Mode\n -備份外部數據:$Backup_obb_data\n -備份user數據:$Backup_user_data\n -自定義目錄備份:$backup_media\n -存在進程忽略備份:$Background_apps_ignore\n -關閉螢幕:$setDisplayPowerMode"
|
||||
D="1"
|
||||
Apk_info="$(pm list packages -u --user "$user" | cut -f2 -d ':' | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)"
|
||||
if [[ $Apk_info != "" ]]; then
|
||||
@@ -1931,6 +2006,7 @@ backup)
|
||||
{
|
||||
starttime1="$(date -u "+%s")"
|
||||
TIME="$starttime1"
|
||||
notification "101" "開始備份"
|
||||
while [[ $i -le $r ]]; do
|
||||
[[ $en -ge 229 ]] && en=118
|
||||
unset name1 name2 apk_path apk_path2
|
||||
@@ -1950,6 +2026,8 @@ backup)
|
||||
if [[ -d $apk_path2 ]]; then
|
||||
echoRgb "備份第$i/$r個應用 剩下$((r - i))個" "3"
|
||||
echoRgb "備份 $name1 \"$name2\"" "2"
|
||||
notification "101" "備份第$i/$r個應用 剩下$((r - i))個
|
||||
備份 $name1 \"$name2\""
|
||||
unset Backup_folder ChineseName PackageName nobackup No_backupdata result apk_version apk_version2 zsize zmediapath Size data_path Ssaid ssaid Permissions
|
||||
nobackup="false"
|
||||
Background_application_list
|
||||
@@ -1974,11 +2052,7 @@ backup)
|
||||
app_details="$Backup_folder/app_details.json"
|
||||
if [[ -f $app_details ]]; then
|
||||
PackageName="$(jq -r '.[] | select(.PackageName != null).PackageName' "$app_details")"
|
||||
if [[ $PackageName != $name2 ]]; then
|
||||
unset Backup_folder ChineseName PackageName nobackup No_backupdata result apk_version apk_version2 zsize zmediapath Size data_path Ssaid ssaid Permissions
|
||||
Backup_folder="$Backup/${name1}[${name2}]"
|
||||
app_details="$Backup_folder/app_details.json"
|
||||
fi
|
||||
[[ $PackageName != $name2 ]] && jq --arg name2 "$name2" 'walk(if type == "object" and .PackageName then .PackageName = $name2 else . end)' "$app_details" > temp.json && cp temp.json "$app_details" && rm -rf temp.json
|
||||
fi
|
||||
[[ $hx = USB && $PT = "" ]] && echoRgb "隨身碟意外斷開 請檢查穩定性" "0" && exit 1
|
||||
starttime2="$(date -u "+%s")"
|
||||
@@ -2010,7 +2084,8 @@ backup)
|
||||
Backup_data "user_de"
|
||||
}
|
||||
}
|
||||
[[ $name2 = github.tornaco.android.thanos ]] && Backup_data "thanox" "$(find "/data/system" -name "thanos*" -maxdepth 1 -type d 2>/dev/null)"
|
||||
[[ $name2 = github.tornaco.android.thanos ]] && Backup_data "thanox" "$(find "/data/system" -name "thanos"* -maxdepth 1 -type d 2>/dev/null)"
|
||||
[[ $name2 = cn.myflv.noactive ]] && Backup_data "NoActive" "$(find "/data/system" -name "NoActive_"* -maxdepth 1 -type d 2>/dev/null)"
|
||||
[[ $name2 = moe.shizuku.redirectstorage ]] && Backup_data "storage-isolation" "/data/adb/storage-isolation"
|
||||
fi
|
||||
fi
|
||||
@@ -2049,6 +2124,7 @@ backup)
|
||||
update_apk2="${update_apk2:="暫無更新"}"
|
||||
add_app2="${add_app2:="暫無更新"}"
|
||||
echoRgb "\n -已更新的apk=\"$osn\"\n -已新增的備份=\"$osk\"\n -apk版本號無變化=\"$osj\"\n -下列為版本號已變更的應用\n$update_apk2\n -新增的備份....\n$add_app2\n -包含SSAID的應用\n$SSAID_apk2" "3"
|
||||
notification "101" "app備份完成 $(endtime 1 "應用備份" "3")"
|
||||
echo "$(sort "$txt2" | sed -e '/^$/d')" >"$txt2"
|
||||
[[ -e ${txt%/*}/txt2 ]] && cat "${txt%/*}/txt2">"$txt" && rm -rf "${txt%/*}/txt2"
|
||||
if [[ $backup_media = true && $backup_mode = "" ]]; then
|
||||
@@ -2056,6 +2132,7 @@ backup)
|
||||
B="$(echo "$Custom_path" | egrep -v '#|#' | awk 'NF != 0 { count++ } END { print count }')"
|
||||
if [[ $B != "" ]]; then
|
||||
echoRgb "備份結束,備份多媒體" "1"
|
||||
notification "102" "Media備份開始"
|
||||
starttime1="$(date -u "+%s")"
|
||||
Backup_folder="$Backup/Media"
|
||||
[[ ! -f $Backup/恢復自定義資料夾.sh ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh"
|
||||
@@ -2066,6 +2143,7 @@ backup)
|
||||
[[ ! -f $mediatxt ]] && echo "#不需要恢復的資料夾請在開頭使用#注釋 比如:#Download" > "$mediatxt"
|
||||
echo "$Custom_path" | sed -e '/^#/d; /^$/d; s/\/$//' | while read; do
|
||||
echoRgb "備份第$A/$B個資料夾 剩下$((B - A))個" "3"
|
||||
notification "102" "備份第$A/$B個資料夾 剩下$((B - A))個"
|
||||
starttime2="$(date -u "+%s")"
|
||||
if [[ ${REPLY##*/} = adb ]]; then
|
||||
if [[ $ksu != ksu ]]; then
|
||||
@@ -2086,6 +2164,7 @@ backup)
|
||||
rgb_a="$rgb_d" && let A++
|
||||
done
|
||||
echoRgb "目錄↓↓↓\n -$Backup_folder"
|
||||
notification "102" "Media備份完成 $(endtime 1 "自定義備份")"
|
||||
endtime 1 "自定義備份"
|
||||
else
|
||||
echoRgb "自定義路徑為空 無法備份" "0"
|
||||
@@ -2095,12 +2174,14 @@ backup)
|
||||
let i++ en++ nskg++
|
||||
done
|
||||
Set_screen_pause_seconds off
|
||||
[[ $user != 0 ]] && am stop-user "$user"
|
||||
rm -rf "$TMPDIR/scriptTMP"
|
||||
Calculate_size "$Backup"
|
||||
echoRgb "批量備份完成"
|
||||
echoRgb "備份結束時間$(date +"%Y-%m-%d %H:%M:%S")"
|
||||
starttime1="$TIME"
|
||||
endtime 1 "批量備份開始到結束"
|
||||
notification "105" "備份完成 $(endtime 1 "批量備份開始到結束")"
|
||||
} &
|
||||
wait && exit
|
||||
;;
|
||||
@@ -2136,6 +2217,10 @@ Restore|Restore2)
|
||||
echoRgb "選擇應用恢復模式\n -音量上僅恢復未安裝,下全恢復"
|
||||
get_version "恢復未安裝" "全恢復" && recovery_mode="$branch"
|
||||
}
|
||||
[[ $setDisplayPowerMode != "" ]] && isBoolean "$setDisplayPowerMode" "setDisplayPowerMode" && setDisplayPowerMode="$nsx" || {
|
||||
echoRgb "應用恢復時關閉螢幕\n -音量上關閉,下不關閉"
|
||||
get_version "關閉" "不關閉" && setDisplayPowerMode="$branch"
|
||||
}
|
||||
Get_user="$(echo "$MODDIR" | rev | cut -d '/' -f1 | cut -d '_' -f1 | rev | egrep -o '[0-9]+')"
|
||||
if [[ $Get_user != $user ]]; then
|
||||
echoRgb "檢測當前用戶$user與恢復資料夾用戶:$Get_user不同,音量上繼續恢復,下不恢復並離開腳本"
|
||||
@@ -2160,6 +2245,8 @@ Restore|Restore2)
|
||||
1)
|
||||
echoRgb "選擇應用恢復模式\n -音量上僅恢復未安裝,下全恢復"
|
||||
get_version "恢復未安裝" "全恢復" && recovery_mode="$branch"
|
||||
echoRgb "應用恢復時關閉螢幕\n -音量上關閉,下不關閉"
|
||||
get_version "關閉" "不關閉" && setDisplayPowerMode="$branch"
|
||||
Get_user="$(echo "$MODDIR" | rev | cut -d '/' -f1 | cut -d '_' -f1 | rev | egrep -o '[0-9]+')"
|
||||
if [[ $Get_user != $user ]]; then
|
||||
echoRgb "檢測當前用戶$user與恢復資料夾用戶:$Get_user不同,音量上繼續恢復,下不恢復並離開腳本"
|
||||
@@ -2177,6 +2264,11 @@ Restore|Restore2)
|
||||
} || {
|
||||
isBoolean "$recovery_mode" "recovery_mode" && recovery_mode="$nsx"
|
||||
}
|
||||
[[ $setDisplayPowerMode = "" ]] && {
|
||||
Enter_options "應用恢復時關閉螢幕\n -輸入1關閉,0不關閉" "關閉" "不關閉" && isBoolean "$parameter" "setDisplayPowerMode" && setDisplayPowerMode="$nsx"
|
||||
} || {
|
||||
isBoolean "$recovery_mode" "recovery_mode" && recovery_mode="$nsx"
|
||||
}
|
||||
Get_user="$(echo "$MODDIR" | rev | cut -d '/' -f1 | cut -d '_' -f1 | rev | egrep -o '[0-9]+')"
|
||||
[[ $Get_user != $user ]] && {
|
||||
[[ $recovery_mode2 = "" ]] && {
|
||||
@@ -2267,11 +2359,14 @@ Restore|Restore2)
|
||||
Set_screen_pause_seconds on
|
||||
en=118
|
||||
echo "$script">"$TMPDIR/scriptTMP"
|
||||
notification "105" "開始恢復app"
|
||||
{
|
||||
while [[ $i -le $r ]]; do
|
||||
[[ $en -ge 229 ]] && en=118
|
||||
if [[ $operate = Restore ]]; then
|
||||
echoRgb "恢復第$i/$r個應用 剩下$((r - i))個" "3"
|
||||
notification "105" "恢復第$i/$r個應用 剩下$((r - i))個
|
||||
恢復 $name1 \"$name2\""
|
||||
if [[ ! -f $txt ]]; then
|
||||
[[ $(echo "$txt") != "" ]] && {
|
||||
name1="$(echo "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
|
||||
@@ -2319,18 +2414,8 @@ Restore|Restore2)
|
||||
restore_permissions
|
||||
Ssaid="$(jq -r '.[] | select(.Ssaid != null).Ssaid' "$app_details")"
|
||||
if [[ $Ssaid != "" ]]; then
|
||||
if [[ $(get_ssaid "$name2") != $Ssaid ]]; then
|
||||
set_ssaid "$name2" "$Ssaid"
|
||||
if [[ $(get_ssaid "$name2") = $Ssaid ]]; then
|
||||
echoRgb "SSAID恢復成功" "1"
|
||||
SSAID_Package="$(echo "$name1 \"$name2\"")"
|
||||
SSAID_Package2="$(echo "$SSAID_Package\n$SSAID_Package2")"
|
||||
else
|
||||
echoRgb "SSAID恢復失敗" "0"
|
||||
SSAID_Package1="$(echo "$name1 \"$name2\"")"
|
||||
SSAID_Package3="$(echo "$SSAID_Package1\n$SSAID_Package3")"
|
||||
fi
|
||||
fi
|
||||
SSAID_Package="$(echo "$name1 $name2 $Ssaid")"
|
||||
SSAID_Package2="$(echo "$SSAID_Package\n$SSAID_Package2")"
|
||||
unset Ssaid
|
||||
fi
|
||||
}
|
||||
@@ -2349,7 +2434,28 @@ Restore|Restore2)
|
||||
fi
|
||||
if [[ $i = $r && $operate != Restore2 ]]; then
|
||||
endtime 1 "應用恢復" "2"
|
||||
echoRgb "\n -下列為已設置SSAID應用,請勿打開需要重啟後才能使用,否則ssaid設置失敗\n$SSAID_Package2\n -下列為設置SSAID失敗應用....\n$SSAID_Package3" "3"
|
||||
[[ $SSAID_Package2 != "" ]] && {
|
||||
echoRgb "開始恢復saaid" "0"
|
||||
echo "$SSAID_Package2" | while read; do
|
||||
Ssaid="$(echo "$REPLY" | awk '{print $3}')"
|
||||
name1="$(echo "$REPLY" | awk '{print $1}')"
|
||||
name2="$(echo "$REPLY" | awk '{print $2}')"
|
||||
set_ssaid "$name2" "$Ssaid"
|
||||
if [[ $(get_ssaid "$name2") = $Ssaid ]]; then
|
||||
echoRgb "$name1 SSAID恢復成功" "1"
|
||||
SSAID_Package0="$(echo "$name1 \"$name2\"")"
|
||||
SSAID_Package1="$(echo "$SSAID_Package0\n$SSAID_Package1")"
|
||||
else
|
||||
echoRgb "$name1 SSAID恢復失敗" "0"
|
||||
SSAID_Package3="$(echo "$name1 \"$name2\"")"
|
||||
SSAID_Package4="$(echo "$SSAID_Package3\n$SSAID_Package4")"
|
||||
fi
|
||||
unset Ssaid
|
||||
done
|
||||
echoRgb "SSAID恢復後必須重新開機套用,否則應用閃退,如果沒有應用恢復ssaid則無須重啟" "0"
|
||||
notification "107" "SSAID恢復後必須重新開機套用,否則應用閃退,如果沒有應用恢復ssaid則無須重啟"
|
||||
}
|
||||
notification "105" "app恢復完成 $(endtime 1 "應用恢復" "2")"
|
||||
if [[ $media_recovery = true ]]; then
|
||||
starttime1="$(date -u "+%s")"
|
||||
app_details="$Backup_folder2/app_details.json"
|
||||
@@ -2358,6 +2464,7 @@ Restore|Restore2)
|
||||
A=1
|
||||
B="$(egrep -v '#|#' "$txt" 2>/dev/null | awk 'NF != 0 { count++ } END { print count }')"
|
||||
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && B=0
|
||||
notification "106" "Media恢復開始"
|
||||
while [[ $A -le $B ]]; do
|
||||
name1="$(egrep -v '#|#' "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')"
|
||||
starttime2="$(date -u "+%s")"
|
||||
@@ -2366,11 +2473,13 @@ Restore|Restore2)
|
||||
endtime 2 "$FILE_NAME2恢復" "2" && echoRgb "完成$((A * 100 / B))%" "3" && echoRgb "____________________________________" && let A++
|
||||
done
|
||||
endtime 1 "自定義恢復" "2"
|
||||
notification "106" "Media恢復完成 $(endtime 1 "Media恢復" "2")"
|
||||
fi
|
||||
if [[ $modules_recovery = true ]]; then
|
||||
A=1
|
||||
B="$(find "$Backup_folder3" -maxdepth 1 -name "*.zip*" -type f 2>/dev/null | wc -l)"
|
||||
starttime1="$(date -u "+%s")"
|
||||
notification "108" "Module恢復開始"
|
||||
find "$Backup_folder3" -maxdepth 1 -name "*.zip*" -type f 2>/dev/null | while read; do
|
||||
starttime2="$(date -u "+%s")"
|
||||
echoRgb "刷入第$A/$B個模塊 剩下$((B - A))個" "3"
|
||||
@@ -2379,13 +2488,17 @@ Restore|Restore2)
|
||||
endtime 2 "${REPLY##*/}刷入" "2" && echoRgb "完成$((A * 100 / B))%" "3" && echoRgb "____________________________________" && let A++
|
||||
done
|
||||
endtime 1 "刷入模塊" "2"
|
||||
notification "108" "Module恢復完成 $(endtime 1 "Module恢復" "2")"
|
||||
|
||||
fi
|
||||
fi
|
||||
let i++ en++ nskg++
|
||||
done
|
||||
Set_screen_pause_seconds off
|
||||
[[ $user != 0 ]] && am stop-user "$user"
|
||||
starttime1="$TIME"
|
||||
echoRgb "$DX完成" && endtime 1 "$DX開始到結束" && [[ $SSAID_Package2 != "" ]] && echoRgb "SSAID恢復後必須重啟套用,如發現應用閃退請重新開機" "0"
|
||||
echoRgb "$DX完成" && endtime 1 "$DX開始到結束"
|
||||
notification "109" "恢復完成 $(endtime 1 "$DX開始到結束")"
|
||||
rm -rf "$TMPDIR"/*
|
||||
} &
|
||||
wait && exit
|
||||
@@ -2420,9 +2533,10 @@ Restore3)
|
||||
starttime1="$(date -u "+%s")"
|
||||
A=1
|
||||
B="$(egrep -v '#|#' "$txt" 2>/dev/null | awk 'NF != 0 { count++ } END { print count }')"
|
||||
Set_screen_pause_seconds off
|
||||
Set_screen_pause_seconds on
|
||||
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && exit 1
|
||||
echo "$script">"$TMPDIR/scriptTMP"
|
||||
notification "108" "Media恢復開始"
|
||||
{
|
||||
while [[ $A -le $B ]]; do
|
||||
name1="$(egrep -v '#|#' "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')"
|
||||
@@ -2433,6 +2547,7 @@ Restore3)
|
||||
done
|
||||
Set_screen_pause_seconds off
|
||||
endtime 1 "恢復結束"
|
||||
notification "108" "Media恢復完成 $(endtime 1 "Media恢復")"
|
||||
rm -rf "$TMPDIR/scriptTMP"
|
||||
} &
|
||||
;;
|
||||
@@ -2491,7 +2606,7 @@ Getlist)
|
||||
Apk_info="$(echo "$(echo "$Apk_info" | awk '$3 != "system" {print $1, $2}')\n$Pre_installed_apps")"
|
||||
[[ $Apk_info = "" ]] && {
|
||||
echoRgb "appinfo輸出失敗,請截圖畫面回報作者" "0"
|
||||
exit 2 ; } || Apk_info="$(echo "$Apk_info" | sed 's/Xposed: //g')" && Apk_info2="$(echo "$Apk_info" | awk '{print $2}')"
|
||||
exit 2 ; } || Apk_info2="$(echo "$Apk_info" | awk '{print $2}')"
|
||||
Apk_Quantity="$(echo "$Apk_info" | wc -l)"
|
||||
LR="1"
|
||||
echoRgb "列出第三方應用......." "2"
|
||||
@@ -2656,6 +2771,7 @@ backup_media)
|
||||
[[ ! -f $mediatxt ]] && echo "#不需要恢復的資料夾請在開頭使用#注釋 比如:#Download" > "$mediatxt"
|
||||
echo "$script">"$TMPDIR/scriptTMP"
|
||||
Set_screen_pause_seconds on
|
||||
notification "109" "Media備份開始"
|
||||
{
|
||||
echo "$Custom_path" | sed -e '/^#/d; /^$/d; s/\/$//' | while read; do
|
||||
echoRgb "備份第$A/$B個資料夾 剩下$((B - A))個" "3"
|
||||
@@ -2679,6 +2795,7 @@ backup_media)
|
||||
Calculate_size "$Backup_folder"
|
||||
Set_screen_pause_seconds off
|
||||
endtime 1 "自定義備份"
|
||||
notification "109" "Media備份完成 $(endtime 1 "自定義備份")"
|
||||
rm -rf "$TMPDIR/scriptTMP"
|
||||
else
|
||||
echoRgb "自定義路徑為空 無法備份" "0"
|
||||
@@ -2721,8 +2838,11 @@ Device_List)
|
||||
down "$Brand_URL" | grep -oE '`[^`]+`:[^`]*' | sed -E 's/: /:/g' | sed -E 's/`([^`]+)`:(.*)/"\1" "\2"/' | while read ; do
|
||||
unset model
|
||||
model="$(echo "$REPLY" | awk -F'"' '{print $2}')"
|
||||
echo "$(egrep -w "$model" "$tools_path/Device_List" | awk -F'"' '{print $2}') != $model"
|
||||
[[ $(egrep -w "$model" "$tools_path/Device_List" | awk -F'"' '{print $2}') != $model ]] && echo "$REPLY">>"$tools_path/Device_List"
|
||||
if [[ $(egrep -w "$model" "$tools_path/Device_List" | awk -F'"' '{print $2}') != $model ]]; then
|
||||
echo "$REPLY">>"$tools_path/Device_List"
|
||||
else
|
||||
echo "$(egrep -w "$model" "$tools_path/Device_List" | awk -F'"' '{print $2}') = $model"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
BIN
tools/zstd
BIN
tools/zstd
Binary file not shown.
Reference in New Issue
Block a user