7 Commits

Author SHA1 Message Date
Yawasau
6248e2262e bugfix 2025-01-19 20:33:20 +08:00
Yawasau
979b828cd9 bugfix 2025-01-11 22:21:10 +08:00
Yawasau
a8c26d334c bugfix 2024-12-28 22:57:47 +08:00
Yawasau
e979cf54d2 bugfix 2024-12-08 18:16:57 +08:00
Yawasau
b5de2d1725 bugfix 2024-12-01 13:46:32 +08:00
YAWAsau
1aa4e0f440 Update README.md 2024-11-30 11:44:29 +08:00
YAWAsau
8896743c06 Update README.md 2024-11-30 11:43:22 +08:00
7 changed files with 361 additions and 185 deletions

View File

@@ -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`

View File

@@ -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"

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -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

Binary file not shown.