This commit is contained in:
Yawasau
2024-02-10 18:18:27 +08:00
parent 40259da412
commit 1ea21d821f
5 changed files with 289 additions and 815 deletions

View File

@@ -11,10 +11,10 @@ default_behavior=0
#自定義位置支持相對位置
#自定義備份目錄輸出位置 (忽略為空將默認腳本路徑中)
Output_path=
Output_path="/sdcard"
#自定義applist.txt位置
list_location=
list_location=""
#自動更新腳本
update=1
@@ -23,13 +23,13 @@ update=1
USBdefault=0
#使用者(為空預設0)
user=
user=0
#是否備份使用者數據 (1備份0不備份)
Backup_user_data=1
#是否備份外部數據 即比如原神的數據包(1備份0不備份)
Backup_obb_data=0
Backup_obb_data=1
#是否在應用數據備份好後備份自定義目錄
backup_media=0
@@ -37,7 +37,7 @@ backup_media=0
#假設你遇到列表輸出異常問題請將此設為1
debug_list=0
#添加自定義備份路徑 請勿刪除" "
#添加自定義備份路徑 請勿刪除
Custom_path="
/storage/emulated/0/Pictures/
/storage/emulated/0/Download/
@@ -53,8 +53,10 @@ blacklist_mode=0
blacklist="
#com.esunbank
#com.chailease.tw.app.android.ccfappcust"
#位於data的預裝應用白名單
whitelist="com.xiaomi.xmsf
whitelist="
com.xiaomi.xmsf
com.xiaomi.xiaoailite
com.xiaomi.hm.health
com.duokan.phone.remotecontroller
@@ -70,6 +72,7 @@ com.miui.notes
com.xiaomi.router
com.xiaomi.mico
dev.miuiicons.pedroz"
#可被備份的系統應用白名單
system="
com.google.android.calendar
@@ -84,13 +87,15 @@ com.facebook.orca
sh.siava.AOSPMods
com.facebook.katana
com.android.chrome"
#備份完成後啟動應用
am_start="
com.digibites.accubattery
com.dede.nativetools
"
#壓縮算法(可用zstd tar tar為僅打包 有什麼好用的壓縮算法請聯繫我
#tar壓縮最快但是壓縮率略差 zstd擁有良好的壓縮率與速度
#zstd擁有良好的壓縮率與速度
Compression_method=zstd
#主色
@@ -98,3 +103,4 @@ rgb_a=226
#輔色
rgb_b=123
rgb_c=177

View File

@@ -127,6 +127,8 @@
"23127PN0CG" "Xiaomi 14 國際版"
"23116PN5BC" "Xiaomi 14 Pro 全網通版"
"23116PN5BG" "Xiaomi 14 Pro 國際版"
"24030PN60C" "Xiaomi 14 Ultra 全網通版"
"24030PN60G" "Xiaomi 14 Ultra 國際版"
"2014616" "小米 Note 雙網通版"
"2014619" "小米 Note 全網通版"
"2014618" "小米 Note 移動合約版"
@@ -490,8 +492,9 @@
"23129RA5FL" "Redmi Note 13 拉美版"
"23124RA7EO" "Redmi Note 13 國際版 (NFC)"
"2312DRAABC" "Redmi Note 13 5G 全網通版"
"2312DRAABG" "Redmi Note 13 5G 國際版"
"2312DRAABI" "Redmi Note 13 5G 印度版"
"2312DRAABG" "Redmi Note 13 5G 國際版"
"23117RA68G" "Redmi Note 13 Pro 國際版"
"2312CRAD3C" "Redmi Note 13 Pro 全網通版"
"2312DRA50G" "Redmi Note 13 Pro 5G 國際版"
"2312DRA50I" "Redmi Note 13 Pro 5G 印度版"
@@ -609,6 +612,7 @@
"22071219CI" "POCO M5 印度版"
"2207117BPG" "POCO M5s 國際版"
"23128PC33I" "POCO M6 5G 印度版"
"2312FPCA6G" "POCO M6 Pro 國際版"
"23076PC4BI" "POCO M6 Pro 5G 印度版"
"M2006C3MI" "POCO C3 印度版"
"211033MI" "POCO C31 印度版"
@@ -681,13 +685,16 @@
"SM-G9960" "Galaxy S21+ 5G"
"SM-G9980" "Galaxy S21 Ultra 5G"
"SM-G9900" "Galaxy S21 FE 5G"
"SM-S9010" "Galaxy S22 5G"
"SM-S9060" "Galaxy S22+ 5G"
"SM-S9080" "Galaxy S22 Ultra 5G"
"SM-S9110" "Galaxy S23 5G"
"SM-S9160" "Galaxy S23+ 5G"
"SM-S9180" "Galaxy S23 Ultra 5G"
"SM-S7110" "Galaxy S23 FE 5G"
"SM-S9010" "Galaxy S22"
"SM-S9060" "Galaxy S22+"
"SM-S9080" "Galaxy S22 Ultra"
"SM-S9110" "Galaxy S23"
"SM-S9160" "Galaxy S23+"
"SM-S9180" "Galaxy S23 Ultra"
"SM-S7110" "Galaxy S23 FE"
"SM-S9210" "Galaxy S24"
"SM-S9260" "Galaxy S24+"
"SM-S9280" "Galaxy S24 Ultra"
"GT-I9220" "Galaxy Note 公開版"
"GT-I9228" "Galaxy Note 移動定制版"
"SCH-I889" "Galaxy Note 電信定制版"
@@ -723,13 +730,13 @@
"SM-N9860" "Galaxy Note20 Ultra 5G"
"SM-F9000" "Galaxy Fold"
"SM-F9160" "Galaxy Z Fold2 5G"
"SM-F9360" "Galaxy Z Fold4 5G"
"SM-F9460" "Galaxy Z Fold5 5G"
"SM-F9360" "Galaxy Z Fold4"
"SM-F9460" "Galaxy Z Fold5"
"SM-F7000" "Galaxy Z Flip"
"SM-F7070" "Galaxy Z Flip 5G"
"SM-F7110" "Galaxy Z Flip3 5G"
"SM-F7210" "Galaxy Z Flip4 5G"
"SM-F7310" "Galaxy Z Flip5 5G"
"SM-F7210" "Galaxy Z Flip4"
"SM-F7310" "Galaxy Z Flip5"
"SM-A3000" "Galaxy A3 公開版"
"SM-A3009" "Galaxy A3 電信定制版"
"SM-A5000" "Galaxy A5 公開版"
@@ -764,6 +771,7 @@
"SM-A5260" "Galaxy A52 5G"
"SM-A5360" "Galaxy A53 5G"
"SM-A5460" "Galaxy A54 5G"
"SM-A5560" "Galaxy A55 5G"
"SM-E5260" "Galaxy F52 5G"
"SM-M3070" "Galaxy M30s"
"SM-C5000" "Galaxy C5"
@@ -808,10 +816,10 @@
"SM-W2020" "三星 W20 5G"
"SM-W2021" "三星 W21 5G"
"SM-W2022" "三星 W22 5G"
"SM-W9023" "三星 W23 5G"
"SM-W7023" "三星 W23 Flip 5G"
"SM-W9024" "三星 W24 5G"
"SM-W7024" "三星 W24 Flip 5G"
"SM-W9023" "三星 W23"
"SM-W7023" "三星 W23 Flip"
"SM-W9024" "三星 W24"
"SM-W7024" "三星 W24 Flip"
"SM-G1600" "Galaxy Folder"
"SM-G1650" "Galaxy Folder 2"
"SM-G8508S" "Galaxy Alpha"
@@ -919,6 +927,7 @@
"ASUS_AI2203_B" "騰訊 ROG 遊戲手機 6 天璣至尊版"
"ASUS_AI2205_A" "騰訊 ROG 遊戲手機 7"
"ASUS_AI2205_B" "騰訊 ROG 遊戲手機 7 Pro"
"ASUS_AI2401_A" "ROG 遊戲手機 8 / ROG 遊戲手機 8 Pro"
"ASUS_I007D" "Smartphone for Snapdragon Insiders"
"SKR-A0" "黑鯊遊戲手機 全網通版"
"SKR-H0" "黑鯊遊戲手機 國際版"
@@ -1517,17 +1526,23 @@
"PHK110" "OnePlus Ace 2 全網通版"
"CPH2487" "OnePlus 11R 印度版"
"PHP110" "OnePlus Ace 2V 全網通版"
"CPH2491" "OnePlus Nord 3 印度版"
"CPH2493" "OnePlus Nord 3 歐洲版"
"PJA110" "OnePlus Ace 2 Pro 全網通版"
"PJD110" "OnePlus 12 全網通版"
"CPH2573" "OnePlus 12 印度版"
"CPH2581" "OnePlus 12 歐洲版/國際版"
"CPH2583" "OnePlus 12 北美版"
"PJE110" "OnePlus Ace 3 全網通版"
"CPH2585" "OnePlus 12R 印度版"
"CPH2609" "OnePlus 12R 歐洲版/國際版"
"CPH2611" "OnePlus 12R 北美版"
"AC2001" "OnePlus Nord 印度版"
"AC2003" "OnePlus Nord 歐洲版/國際版"
"DN2101" "OnePlus Nord 2 印度版"
"DN2103" "OnePlus Nord 2 歐洲版"
"CPH2399" "OnePlus Nord 2T 國際版"
"CPH2401" "OnePlus Nord 2T 印度版"
"CPH2491" "OnePlus Nord 3 印度版"
"CPH2493" "OnePlus Nord 3 歐洲版"
"EB2101" "OnePlus Nord CE 印度版"
"EB2103" "OnePlus Nord CE 歐洲版/國際版"
"IV2201" "OnePlus Nord CE 2 印度版"
@@ -1546,7 +1561,8 @@
"BE2015" "OnePlus Nord N100 Metro 版"
"CPH2459" "OnePlus Nord N20"
"CPH2469" "OnePlus Nord 20 SE"
"CPH2515" "OnePlus Nord N30"
"CPH2513" "OnePlus Nord N30 北美版"
"CPH2515" "OnePlus Nord N30 T-Mobile 版"
"CPH2605" "OnePlus Nord N30 SE 歐洲版"
"DE2117" "OnePlus Nord N200 北美版"
"DE2118" "OnePlus Nord N200 T-Mobile 版"

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -5,6 +5,119 @@ MODDIR_NAME="${MODDIR##*/}"
tools_path="$MODDIR/tools"
Compression_rate=3
script="${0##*/}"
update_backup_settings_conf() {
echo "#1開啟0關閉
#是否在每次執行備份腳本使用音量鍵詢問如下備份需求
#如果是那下面三項設置就被忽略,改為音量鍵選擇
Lo="${Lo:-0}"
#備份時檢查資料夾是否存在已經卸載應用
delete_folder="${delete_folder:-1}"
#存在已卸載應用操作(1刪除0移動)
default_behavior="${default_behavior:-0}"
#自定義位置支持相對位置
#自定義備份目錄輸出位置 (忽略為空將默認腳本路徑中)
Output_path=\""$Output_path"\"
#自定義applist.txt位置
list_location=\""$list_location"\"
#自動更新腳本
update="${update:-1}"
#假設如果存在usb隨身碟是否默認使用隨身碟(1不詢問默認使用 0每次都進行詢問)
USBdefault="${USBdefault:-0}"
#使用者(為空預設0)
user="$user"
#是否備份使用者數據 (1備份0不備份)
Backup_user_data="${Backup_user_data:-1}"
#是否備份外部數據 即比如原神的數據包(1備份0不備份)
Backup_obb_data="${Backup_obb_data:-1}"
#是否在應用數據備份好後備份自定義目錄
backup_media="${backup_media:-0}"
#假設你遇到列表輸出異常問題請將此設為1
debug_list="${debug_list:-0}"
#添加自定義備份路徑 請勿刪除" "
Custom_path=\""${Custom_path:-
/storage/emulated/0/Pictures/
/storage/emulated/0/Download/
/storage/emulated/0/Music
/storage/emulated/0/DCIM/
/data/adb
}"\"
#黑名單模式(1直接忽略備份0僅備份安裝檔)
blacklist_mode="${blacklist_mode:-0}"
#備份黑名單 備份apk不備份任何數據
blacklist=\""${blacklist:-
#com.esunbank
#com.chailease.tw.app.android.ccfappcust}"\"
#位於data的預裝應用白名單
whitelist=\""${whitelist:-
com.xiaomi.xmsf
com.xiaomi.xiaoailite
com.xiaomi.hm.health
com.duokan.phone.remotecontroller
com.miui.weather2
com.milink.service
com.android.soundrecorder
com.miui.virtualsim
com.xiaomi.vipaccount
com.miui.fm
com.xiaomi.shop
com.xiaomi.smarthome
com.miui.notes
com.xiaomi.router
com.xiaomi.mico
dev.miuiicons.pedroz}"\"
#可被備份的系統應用白名單
system=\""${system:-
com.google.android.calendar
com.google.android.gm
com.google.android.googlequicksearchbox
com.google.android.tts
com.google.android.apps.maps
com.google.android.apps.messaging
com.google.android.inputmethod.latin
com.instagram.android
com.facebook.orca
sh.siava.AOSPMods
com.facebook.katana
com.android.chrome}"\"
#備份完成後啟動應用
am_start=\""${am_start:-
com.digibites.accubattery
com.dede.nativetools
}"\"
#壓縮算法(可用zstd tar tar為僅打包 有什麼好用的壓縮算法請聯繫我
#zstd擁有良好的壓縮率與速度
Compression_method=${Compression_method:-zstd}
#主色
rgb_a="${rgb_a:-226}"
#輔色
rgb_b="${rgb_b:-123}"
rgb_c="${rgb_c:-177}"
" | sed '
/^Custom_path/ s/ /\n/g;
/^blacklist/ s/ /\n/g;
/^whitelist/ s/ /\n/g;
/^system/ s/ /\n/g;
/^am_start/ s/ /\n/g'
}
if [[ ! -d $tools_path ]]; then
tools_path="${MODDIR%/*}/tools"
[[ ! -d $tools_path ]] && echo "$tools_path二進制目錄遺失" && EXIT="true"
@@ -13,7 +126,14 @@ fi
[[ ! -f $tools_path/tar ]] && echo "$tools_path/tar遺失"
[[ ! -f $tools_path/classes.dex ]] && echo "$tools_path/classes.dex遺失"
[[ $conf_path != "" ]] && conf_path="$conf_path" || conf_path="$MODDIR/backup_settings.conf"
[[ ! -f $conf_path ]] && echo "$conf_path配置遺失" && exit 1
if [[ ! -f $conf_path ]]; then
if [[ $conf_path != *Backup_* ]]; then
update_backup_settings_conf>"$conf_path"
echo "因腳本找不到$conf_path故重新生成默認列表\n請重新配置後重新執行腳本" && exit 0
else
echo "$conf_path配置遺失" && exit 1
fi
fi
echo "$(sed 's/true/1/g ; s/false/0/g' "$conf_path")">"$conf_path"
. "$conf_path" &>/dev/null
echoRgb() {
@@ -58,14 +178,14 @@ id=
if [[ $id != "" && -d /data/user/0/com.tencent.mobileqq/files/aladdin_configs/$id ]]; then
exit 2
fi
PATH="/sbin/.magisk/busybox:/system_ext/bin:/system/bin:/system/xbin:/vendor/bin:/vendor/xbin:/data/data/com.omarea.vtools/files/toolkit:/data/user/0/com.termux/files/usr/bin:/data/data/Han.GJK/files/usr/busybox"
PATH="/sbin/.magisk/busybox:/sbin/.magisk:/sbin:/data/adb/ksu/bin:/system_ext/bin:/system/bin:/system/xbin:/vendor/bin:/vendor/xbin:/data/data/com.omarea.vtools/files/toolkit:/data/user/0/com.termux/files/usr/bin:/data/data/Han.GJK/files/usr/busybox"
if [[ -d $(magisk --path 2>/dev/null) ]]; then
PATH="$(magisk --path 2>/dev/null)/.magisk/busybox:$PATH"
else
echo "Magisk busybox Path does not exist"
[[ $(ksud -V 2>/dev/null) = "" ]] && echo "Magisk busybox Path does not exist"
fi
export PATH="$PATH"
backup_version="V15.8.5"
backup_version="V15.8.6"
#tools_path="${tools_path/'/storage/emulated/'/'/data/media/'}"
filepath="/data/backup_tools"
busybox="$filepath/busybox"
@@ -125,7 +245,7 @@ export TZ=Asia/Taipei
export CLASSPATH="$tools_path/classes.dex:$tools_path/Control.dex"
zstd_sha256sum="55cc57a3d079dd90e74d972c705c4f9389dd00a7175de148e21000eab01f7ed9"
tar_sha256sum="3c605b1e9eb8283555225dcad4a3bf1777ae39c5f19a2c8b8943140fd7555814"
classesdex_sha256sum="c4f5e6155c6b927d5f002dbb21a975a716655bc5011ae7cf450563fb1ae0ca4f"
classesdex_sha256sum="09d0058763157b97d6ea2bf74bd7ec53089a9ddb496f089a159ea0027007bb94"
[[ $(sha256sum "$tools_path/zstd" | cut -d" " -f1) != $zstd_sha256sum ]] && echoRgb "zstd效驗失敗" "0" && exit 2
[[ $(sha256sum "$tools_path/tar" | cut -d" " -f1) != $tar_sha256sum ]] && echoRgb "tar效驗失敗" "0" && exit 2
[[ $(sha256sum "$tools_path/classes.dex" | cut -d" " -f1) != $classesdex_sha256sum ]] && echoRgb "classes.dex效驗失敗" "0" && exit 2
@@ -246,31 +366,56 @@ else
UFS_MODEL="unknown"
fi
fi
[[ $(cat "$tools_path/Device_List" 2>/dev/null | egrep -w "$(getprop ro.product.model 2>/dev/null)" | awk -F'"' '{print $4}') != "" ]] && Device_name="$(cat "$tools_path/Device_List" | egrep -w "$(getprop ro.product.model 2>/dev/null)" | awk -F'"' '{print $4}')" || Device_name="$(getprop ro.product.model 2>/dev/null)"
Manager_version="$(su -v || echo 'null')"
DEVICE_NAME="$(getprop ro.soc.model)"
if [[ $DEVICE_NAME != "" ]]; then
if [[ -f $tools_path/soc.json ]]; then
cat "$tools_path/soc.json" | jq -r --arg device "$DEVICE_NAME" '.[$device] | "處理器:\(.VENDOR) \(.NAME) [\(.FAB)]"' &>/dev/null
if [[ $? = 0 ]]; then
DEVICE_NAME="$(cat "$tools_path/soc.json" | jq -r --arg device "$DEVICE_NAME" '.[$device] | "處理器:\(.VENDOR) \(.NAME) [\(.FAB)]"' 2>/dev/null)"
[[ $(egrep -w "$(getprop ro.product.model 2>/dev/null)" "$tools_path/Device_List" | awk -F'"' '{print $4}') != "" ]] && Device_name="$(egrep -w "$(getprop ro.product.model 2>/dev/null)" "$tools_path/Device_List" | awk -F'"' '{print $4}')" || Device_name="$(getprop ro.product.model 2>/dev/null)"
if [[ $(su -v 2>/dev/null) != "" ]]; then
Manager_version="$(su -v 2>/dev/null)"
else
if [[ -d /data/adb/ksu ]]; then
echo "KernelSU"
else
DEVICE_NAME="處理器:null"
echo "null"
fi
fi
Socname="$(getprop ro.soc.model)"
if [[ $Socname != "" ]]; then
if [[ -f $tools_path/soc.json ]]; then
cat "$tools_path/soc.json" | jq -r --arg device "$Socname" '.[$device] | "處理器:\(.VENDOR) \(.NAME)"' &>/dev/null
if [[ $? = 0 ]]; then
DEVICE_NAME="$(cat "$tools_path/soc.json" | jq -r --arg device "$Socname" '.[$device] | "處理器:\(.VENDOR) \(.NAME)"' 2>/dev/null)"
cat "$tools_path/soc.json" | jq -r --arg device "$Socname" '.[$device] | "RAM:\(.MEMORY) \(.CHANNELS)"' &>/dev/null
if [[ $? = 0 ]]; then
RAMINFO="$(cat "$tools_path/soc.json" | jq -r --arg device "$Socname" '.[$device] | "RAM:\(.MEMORY) \(.CHANNELS)"' 2>/dev/null)"
else
RAMINFO="RAM:null"
fi
else
DEVICE_NAME="處理器:null"
RAMINFO="RAM:null"
fi
else
DEVICE_NAME="處理器:null"
RAMINFO="RAM:null"
fi
else
DEVICE_NAME="處理器:null"
RAMINFO="RAM:null"
fi
echoRgb "---------------------SpeedBackup---------------------"
echoRgb "腳本路徑:$MODDIR\n -已開機:$(Show_boottime)\n -busybox路徑:$(which busybox)\n -busybox版本:$(busybox | head -1 | awk '{print $2}')\n -appinfo版本:$(appinfo --version)\n -腳本版本:$backup_version\n -管理器:$Manager_version\n -設備架構:$abi\n -品牌:$(getprop ro.product.brand 2>/dev/null)\n -型號:$Device_name($(getprop ro.product.device 2>/dev/null))\n -閃存顆粒:$UFS_MODEL($ROM_TYPE)\n -$DEVICE_NAME\n -Android版本:$(getprop ro.build.version.release 2>/dev/null) SDK:$(getprop ro.build.version.sdk 2>/dev/null)\n -By@YAWAsau\n -Support: https://jq.qq.com/?_wv=1027&k=f5clPNC3"
echoRgb "腳本路徑:$MODDIR\n -已開機:$(Show_boottime)\n -busybox路徑:$(which busybox)\n -busybox版本:$(busybox | head -1 | awk '{print $2}')\n -appinfo版本:$(appinfo --version)\n -腳本版本:$backup_version\n -管理器:$Manager_version\n -品牌:$(getprop ro.product.brand 2>/dev/null)\n -型號:$Device_name($(getprop ro.product.device 2>/dev/null))\n -閃存顆粒:$UFS_MODEL($ROM_TYPE)\n -$DEVICE_NAME\n -$RAMINFO\n -Android版本:$(getprop ro.build.version.release 2>/dev/null) SDK:$(getprop ro.build.version.sdk 2>/dev/null)\n -By@YAWAsau\n -Support: https://jq.qq.com/?_wv=1027&k=f5clPNC3"
case $MODDIR in
*Backup_*)
if [[ -f $MODDIR/app_details ]]; then
if [[ -d ${MODDIR%/*/*}/tools ]]; then
path_hierarchy="${MODDIR%/*/*}"
else
[[ -d ${MODDIR%/*}/tools ]] && path_hierarchy="${MODDIR%/*}"
path_hierarchy="${MODDIR%/*}"
fi
else
if [[ -d ${MODDIR%/*}/tools ]]; then
path_hierarchy="${MODDIR%/*}"
else
[[ -d $MODDIR/tools ]] && path_hierarchy="$MODDIR"
fi
fi ;;
*) [[ -d $MODDIR/tools ]] && path_hierarchy="$MODDIR" ;;
esac
@@ -282,7 +427,45 @@ case $LANG in
echoRgb "系統語系:簡體中文"
Script_target_language="zh-CN" ;;
esac
case $operate in
backup|Restore|Restore2|Getlist|backup_media)
if [[ $user = "" ]]; then
user_id="$(appinfo -listUsers)"
if [[ $user_id != "" && $(appinfo -listUsers | wc -l) -gt 1 ]]; then
echo "$user_id" | while read ; do
[[ $REPLY = 0 ]] && echoRgb "主用戶:$REPLY" "2" || echoRgb "分身用戶:$REPLY" "2"
done
echoRgb "設備存在多用戶,選擇操作目標用戶"
if [[ $(echo "$user_id" | wc -l) = 2 ]]; then
user1="$(echo "$user_id" | sed -n '1p')"
user2="$(echo "$user_id" | sed -n '2p')"
echoRgb "音量上選擇用戶:$user1,音量下選擇用戶:$user2" "2"
Select_user="true"
get_version "$user1" "$user2" && user="$branch"
unset Select_user
else
while true ;do
if [[ $option != "" ]]; then
user="$option"
break
else
echoRgb "請輸入需要操作目標分區" "1"
read option
fi
done
fi
echoRgb "當前操作為用戶$user"
else
user="0"
fi
fi
path="/data/media/$user/Android"
path2="/data/user/$user"
[[ ! -d $path2 ]] && echoRgb "$user分區不存在請將上方提示的用戶id按照需求填入\n -$MODDIR_NAME/backup_settings.conf配置項user=,一次只能填寫一個" "0" && exit 2
export USER_ID="$user" ;;
esac
find_tools_path="$(find "$path_hierarchy"/* -maxdepth 1 -name "tools" -type d ! -path "$path_hierarchy/tools")"
find_conf_path="$(find "$path_hierarchy"/* -maxdepth 1 -name "backup_settings.conf" -type f ! -path "*Backup_*")"
Rename_script () {
[[ $HT = "" ]] && HT=0
find "$path_hierarchy" -maxdepth 3 -name "*.sh" -type f -not -name "tools.sh" | sort | while read ; do
@@ -339,7 +522,6 @@ touch_shell () {
esac
[[ $4 != "" ]] && echo "if [ -f \"$MODDIR_Path/tools/tools.sh\" ]; then\n MODDIR=\"$MODDIR_Path\"\n . \"\${0%/*}/app_details\" &>/dev/null\n operate=\"$1\"\n $4\n conf_path=\"$conf_path\"\n . \"$MODDIR_Path/tools/tools.sh\" | tee \"\$MODDIR/log.txt\"\nelse\n echo \"$MODDIR_Path/tools/tools.sh遺失\"\nfi" >"$2" ||echo "if [ -f \"$MODDIR_Path/tools/tools.sh\" ]; then\n MODDIR=\"\${0%/*}\"\n operate=\"$1\"\n conf_path=\"$conf_path\"\n . \"$MODDIR_Path/tools/tools.sh\" | tee \"\$MODDIR/log.txt\"\nelse\n echo \"$MODDIR_Path/tools/tools.sh遺失\"\nfi" >"$2"
}
update_script() {
[[ $zipFile = "" ]] && zipFile="$(find "$MODDIR" -maxdepth 1 -name "*.zip" -type f 2>/dev/null)"
if [[ $zipFile != "" ]]; then
@@ -367,6 +549,7 @@ update_script() {
unzip -o "$zipFile" tools/* -d "$path_hierarchy" | sed 's/inflating/釋放/g ; s/creating/創建/g ; s/Archive/解壓縮/g'
echo_log "解壓縮${zipFile##*/}"
if [[ $result = 0 ]]; then
[[ $find_conf_path != "" ]] && update_backup_settings_conf>"$find_conf_path"
if [[ $shell_language != $Script_target_language ]]; then
echoRgb "腳本語系為$shell_language....轉換為$Script_target_language中,請稍後等待轉換...."
ts -f "$path_hierarchy/backup_settings.conf" -o "$path_hierarchy/backup_settings.conf"
@@ -377,13 +560,24 @@ update_script() {
echo_log "$path_hierarchy/tools/tools.sh翻譯"
HT=1
fi
if [[ $find_tools_path != $path_hierarchy/tools ]]; then
if [[ -d $find_tools_path && $find_tools_path != $path_hierarchy/tools ]]; then
rm -rf "$find_tools_path"
cp -r "$path_hierarchy/tools" "${find_tools_path%/*}"
ts -f "${find_tools_path%/*}/backup_settings.conf" -o "${find_tools_path%/*}/backup_settings.conf"
echo_log "${find_tools_path%/*}/backup_settings.conf翻譯"
fi
Rename_script
if [[ $Output_path != "" ]]; then
[[ ${Output_path: -1} = / ]] && Output_path="${Output_path%?}"
if [[ ${Output_path:0:1} != / ]]; then
update_path="$MODDIR/$Output_path/Backup_${Compression_method}_$user"
else
update_path="$Output_path/Backup_${Compression_method}_$user"
fi
rm -rf "$update_path/tools"
cp -r "$path_hierarchy/tools" "$update_path"
echoRgb "$update_path/tools已經更新完成"
fi
else
cp -r "$TMPDIR/tools" "$MODDIR"
fi
@@ -421,43 +615,6 @@ else
zipFile="$(ls -t /storage/emulated/0/Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/*.zip 2>/dev/null | head -1)"
[[ $(unzip -l "$zipFile" 2>/dev/null | awk '{print $4}' | egrep -wo "^backup_settings.conf$") != "" ]] && update_script
fi
case $operate in
backup|Restore|Restore2|Getlist|backup_media)
if [[ $user = "" ]]; then
user_id="$(appinfo -listUsers)"
if [[ $user_id != "" && $(appinfo -listUsers | wc -l) -gt 1 ]]; then
echo "$user_id" | while read ; do
[[ $REPLY = 0 ]] && echoRgb "主用戶:$REPLY" "2" || echoRgb "分身用戶:$REPLY" "2"
done
echoRgb "設備存在多用戶,選擇操作目標用戶"
if [[ $(echo "$user_id" | wc -l) = 2 ]]; then
user1="$(echo "$user_id" | sed -n '1p')"
user2="$(echo "$user_id" | sed -n '2p')"
echoRgb "音量上選擇用戶:$user1,音量下選擇用戶:$user2" "2"
Select_user="true"
get_version "$user1" "$user2" && user="$branch"
unset Select_user
else
while true ;do
if [[ $option != "" ]]; then
user="$option"
break
else
echoRgb "請輸入需要操作目標分區" "1"
read option
fi
done
fi
echoRgb "當前操作為用戶$user"
else
user="0"
fi
fi
path="/data/media/$user/Android"
path2="/data/user/$user"
[[ ! -d $path2 ]] && echoRgb "$user分區不存在請將上方提示的用戶id按照需求填入\n -$MODDIR_NAME/backup_settings.conf配置項user=,一次只能填寫一個" "0" && exit 2
export USER_ID="$user" ;;
esac
if [[ $(getprop ro.build.version.sdk) -lt 30 ]]; then
alias INSTALL="pm install --user $user -r -t &>/dev/null"
alias create="pm install-create --user $user -t 2>/dev/null"
@@ -480,16 +637,16 @@ Language="https://api.github.com/repos/YAWAsau/backup_script/releases/latest"
if [[ $path_hierarchy != "" && $Script_target_language != "" ]]; then
K=1
J="$(find "$path_hierarchy" -maxdepth 3 -name "tools.sh" -type f | wc -l)"
for REPLY in $(find "$path_hierarchy" -maxdepth 3 -name "tools.sh" -type f); do
find "$path_hierarchy" -maxdepth 3 -name "tools.sh" -type f | while read ; do
unset shell_language
shell_language="$(grep -o 'shell_language="[^"]*"' "$REPLY" 2>/dev/null | awk -F'=' '{print $2}' | tr -d '"' | head -1)"
shell_language="$(grep -o 'shell_language="[^"]*"' "$REPLY" | awk -F'=' '{print $2}' | tr -d '"' | head -1)"
case $shell_language in
zh-CN|zh-TW)
if [[ $Script_target_language != $shell_language ]]; then
[[ $K = 1 ]] && echoRgb "腳本語系為$shell_language....轉換為$Script_target_language中,請稍後等待轉換...."
ts -f "$REPLY" -o "$REPLY"
if [[ $? = 0 ]]; then
CBW="1"
touch "$TMPDIR/0"
echo_log "$REPLY翻譯"
sed -i "s/shell_language=\"$shell_language\"/shell_language=\"$Script_target_language\"/g" "$REPLY"
ts -f "${REPLY%/*}/Device_List" -o "${REPLY%/*}/Device_List"
@@ -497,7 +654,7 @@ if [[ $path_hierarchy != "" && $Script_target_language != "" ]]; then
if [[ $K = 1 ]]; then
Rename_script
if [[ -d $path_hierarchy/tools ]]; then
if [[ $find_tools_path != $path_hierarchy/tools ]]; then
if [[ -d $find_tools_path && $find_tools_path != $path_hierarchy/tools ]]; then
ts -f "${find_tools_path%/*}/backup_settings.conf" -o "${find_tools_path%/*}/backup_settings.conf"
echo_log "${find_tools_path%/*}/backup_settings.conf翻譯"
fi
@@ -512,7 +669,7 @@ if [[ $path_hierarchy != "" && $Script_target_language != "" ]]; then
fi ;;
esac
done
[[ $CBW = 1 ]] && echoRgb "轉換腳本完成,退出腳本重新執行即可使用" && exit 2
[[ -e $TMPDIR/0 ]] && rm -rf "$TMPDIR/0" && echoRgb "轉換腳本完成,退出腳本重新執行即可使用" && exit 2
fi
#效驗選填是否正確
Lo="$(echo "$Lo" | sed 's/true/1/g ; s/false/0/g')"
@@ -582,7 +739,6 @@ backup_path() {
[[ -d $Backup ]] && outshow="使用上層路徑作為備份目錄" || echoRgb "$Backup目錄不存在" "0"
fi
fi
[[ ! -d $Backup ]] && mkdir -p "$Backup"
PU="$(mount | egrep -v "rannki|0000-1" | grep -w "/mnt/media_rw" | awk '{print $3,$5}')"
OTGPATH="$(echo "$PU" | awk '{print $1}')"
OTGFormat="$(echo "$PU" | awk '{print $2}')"
@@ -597,17 +753,14 @@ backup_path() {
[[ $hx = true ]] && Backup="$OTGPATH/Backup_${Compression_method}_$user"
fi
if [[ $hx = true ]]; then
case $OTGFormat in
texfat | sdfat | fuseblk | exfat | NTFS | ext4 | f2fs)
outshow="於隨身碟備份" && hx=usb
;;
*)
if [[ $OTGFormat = vfat ]]; then
echoRgb "隨身碟檔案系統$OTGFormat不支持超過單檔4GB\n -請格式化為exfat" "0"
exit 1
;;
esac
exit
fi
outshow="於隨身碟備份" && hx=usb
fi
fi
[[ ! -d $Backup ]] && mkdir -p "$Backup"
#分區詳細
if [[ $(echo "$Backup" | egrep -o "^/storage/emulated") != "" ]]; then
Backup_path="/data"
@@ -740,7 +893,7 @@ Backup_apk() {
if [[ $result = 0 ]]; then
Validation_file "$Backup_folder/apk.tar"*
if [[ $result = 0 ]]; then
[[ $(sed -e '/^$/d' "$txt2" | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2"
[[ $(sed -e '/^$/d' "$txt2" 2>/dev/null | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2"
if [[ $apk_version = "" ]]; then
echo "apk_version=\"$apk_version2\"" >>"$app_details"
else
@@ -1200,14 +1353,14 @@ backup)
txt) ;;
*) echoRgb "$txt不是腳本讀取格式" "0" && exit 2 ;;
esac
sort -u "$txt" -o "$txt" 2>/dev/null
sort -u "$txt" -o "$txt" &>/dev/null
data="$MODDIR"
hx="本地"
echoRgb "腳本受到內核機制影響 息屏後io性能嚴重影響\n -請勿關閉終端或是息屏備份 如需終止腳本\n -請執行終止腳本.sh即可停止" "3"
backup_path
echoRgb "配置詳細:\n -壓縮方式:$Compression_method\n -音量鍵確認:$Lo\n -更新:$update\n -已卸載應用檢查:$delete_folder\n -卸載應用默認操作(true刪除false移動):$default_behavior\n -默認使用usb:$USBdefault\n -備份外部數據:$Backup_obb_data\n -備份user數據:$Backup_user_data\n -自定義目錄備份:$backup_media\n -黑名單模式:$blacklist_mode"
D="1"
C="$(sed -e '/^$/d' "$txt" | sed -n '$=')"
C="$(sed -e '/^$/d' "$txt" 2>/dev/null | sed -n '$=')"
[[ $user = 0 ]] && Apk_info="$(appinfo -sort-i -o pn -pn $system -3 | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)" || Apk_info="$(appinfo -sort-i -o pn -pn $system $(pm list packages -3 --user "$user" | cut -f2 -d ':') | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)"
[[ $Apk_info = "" ]] && echoRgb "appinfo輸出失敗" "0" && exit 2
if [[ -d $Backup ]]; then
@@ -1246,8 +1399,8 @@ backup)
fi
echoRgb "檢查備份列表中是否存在已經卸載應用" "3"
while [[ $D -le $C ]]; do
name1="$(sed -e '/^$/d' "$txt" | sed -n "${D}p" | awk '{print $1}')"
name2="$(sed -e '/^$/d' "$txt" | sed -n "${D}p" | awk '{print $2}')"
name1="$(sed -e '/^$/d' "$txt" 2>/dev/null | sed -n "${D}p" | awk '{print $1}')"
name2="$(sed -e '/^$/d' "$txt" 2>/dev/null | sed -n "${D}p" | awk '{print $2}')"
if [[ $name1 != "" && $name2 != "" ]]; then
if [[ $(echo "$Apk_info" | egrep -w "^$name2$") != "" ]]; then
[[ $Tmplist = "" ]] && Tmplist='#不需要備份的應用請在開頭注釋# 比如#酷安 xxxxxxxx\n#不需要備份數據比如!酷安 xxxxxxxx應用名前方方加一個驚嘆號即可 注意是應用名不是包名'
@@ -1256,7 +1409,7 @@ backup)
case $name1 in
*不需要*) ;;
*)
echo "$(sed -e "s/$name1 $name2//g ; /^$/d" "$txt")" >"$txt"
echo "$(sed -e "s/$name1 $name2//g ; /^$/d" "$txt" 2>/dev/null)" >"$txt"
echoRgb "$name1 $name2不存在系統,從列表中刪除" "0" ;;
esac
fi
@@ -1264,7 +1417,7 @@ backup)
fi
done
[[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$txt"
r="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')"
r="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n '$=')"
[[ $backup_mode != "" ]] && r=1
[[ $r = "" ]] && echoRgb "$MODDIR_NAME/appList.txt是空的或是包名被注釋備份個鬼\n -檢查是否注釋亦或者執行$MODDIR_NAME/生成應用列表.sh" "0" && exit 1
[[ $Backup_user_data = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -Backup_user_data=0將不備份user數據" "0"
@@ -1303,14 +1456,14 @@ backup)
Set_screen_pause_seconds on
#假裝息屏
#Operation_screen off
[[ $(grep -v "#" "$txt" | sed -e '/^$/d' | awk '{print $2}' | grep -w "^${keyboard%/*}$") != ${keyboard%/*} ]] && unset keyboard
[[ $(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | awk '{print $2}' | grep -w "^${keyboard%/*}$") != ${keyboard%/*} ]] && unset keyboard
{
while [[ $i -le $r ]]; do
[[ $en -ge 229 ]] && en=118
unset name1 name2 apk_path apk_path2
if [[ $backup_mode = "" ]]; then
name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
name1="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
else
name1="$ChineseName"
name2="$PackageName"
@@ -1441,8 +1594,8 @@ backup)
am_start="$(echo "$am_start" | xargs | sed 's/ /\n/g')"
while [[ $i -le $r ]]; do
unset pkg name1
pkg="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
pkg="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
name1="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
if [[ $(echo "$am_start" | egrep -wo "$pkg") = $pkg ]]; then
am start -n "$(appinfo -o sa -pn "$pkg" 2>/dev/null)" &>/dev/null
echo_log "啟動$name1"
@@ -1481,7 +1634,7 @@ Restore|Restore2)
[[ ! -f $txt ]] && echoRgb "請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 2
sort -u "$txt" -o "$txt" 2>/dev/null
i=1
r="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')"
r="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n '$=')"
[[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 1
Backup_folder2="$MODDIR/Media"
Backup_folder3="$MODDIR/modules"
@@ -1511,8 +1664,8 @@ Restore|Restore2)
echoRgb "獲取未安裝應用中"
TXT="$MODDIR/TEMP.txt"
while [[ $i -le $r ]]; do
name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
name1="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
if [[ $(pm list packages --user "$user" "$name2" 2>/dev/null | cut -f2 -d ':') = "" ]]; then
echo "$name1 $name2">>"$TXT"
fi
@@ -1558,8 +1711,8 @@ Restore|Restore2)
[[ $en -ge 229 ]] && en=118
if [[ $operate = Restore ]]; then
echoRgb "恢復第$i/$r個應用 剩下$((r - i))" "3"
name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
name1="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
unset No_backupdata apk_version
if [[ $name1 = *! || $name1 = * ]]; then
name1="$(echo "$name1" | sed 's/!//g ; s///g')"
@@ -1617,7 +1770,7 @@ Restore|Restore2)
B="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n '$=')"
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && B=0
while [[ $A -le $B ]]; do
name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')"
name1="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')"
starttime2="$(date -u "+%s")"
echoRgb "恢復第$A/$B個壓縮包 剩下$((B - A))" "3"
Release_data "$Backup_folder2/$name1"
@@ -1674,13 +1827,13 @@ Restore3)
}
starttime1="$(date -u "+%s")"
A=1
B="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n '$=')"
B="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n '$=')"
Set_screen_pause_seconds off
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && exit 1
echo "$script">"$TMPDIR/scriptTMP"
{
while [[ $A -le $B ]]; do
name1="$(grep -v "#" "$txt" | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')"
name1="$(grep -v "#" "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')"
starttime2="$(date -u "+%s")"
echoRgb "恢復第$A/$B個壓縮包 剩下$((B - A))" "3"
Release_data "$mediaDir/$name1"