This commit is contained in:
Yawasau
2025-07-06 17:35:19 +08:00
parent 6fb9d0314b
commit bf58f2f7b2
12 changed files with 613 additions and 569 deletions

View File

@@ -59,7 +59,7 @@ user="$user"
#此外設置0時將同時忽略appList.txt的!與任何黑名單設置(包括黑名單列表)
Backup_Mode="${Backup_Mode:-1}"
#執行生成應用列表.sh時輸出用於recovery救援的卡刷包
#執行start.sh時輸出用於recovery救援的卡刷包
#1輸出 0不輸出
recovery_flash="${recovery_flash:-0}"
@@ -76,9 +76,6 @@ backup_media="${backup_media:-0}"
#存在進程忽略備份(1忽略0備份)
Background_apps_ignore="${Background_apps_ignore:-0}"
#假設你遇到列表輸出異常問題請將此設為1
debug_list="${debug_list:-0}"
#添加自定義備份路徑 例Download DCIM等文件夾 請使用絕對路徑,請勿刪除\"\"
Custom_path=\""${Custom_path:-
/storage/emulated/0/Pictures/
@@ -202,35 +199,29 @@ if [[ ! -d $tools_path ]]; then
[[ ! -d $tools_path ]] && echo "$tools_path二進制目錄遺失" && EXIT="true"
fi
if [[ ! -f $conf_path ]]; then
case $operate in
backup_media|backup|Getlist|Restore|Restore2|check_file|convert|Restore3|dumpname)
if [[ $conf_path != *restore_settings.conf && $conf_path = *backup_settings.conf ]]; then
update_backup_settings_conf>"$conf_path"
echo "因腳本找不到\n$conf_path\n故重新生成默認列表\n請重新配置後重新執行腳本" && exit 0
else
if [[ $conf_path = *restore_settings.conf && $conf_path != *backup_settings.conf ]]; then
update_Restore_settings_conf>"$conf_path"
echo "因腳本找不到\n$conf_path\n故重新生成默認列表\n請重新配置後重新執行腳本" && exit 0
else
echo "$conf_path配置遺失" && exit 1
fi
fi ;;
esac
fi
[[ ! -f $conf_path ]] && echo "$conf_path遺失" && exit 2
. "$conf_path" &>/dev/null
case $operate in
backup_media|backup|Getlist|Restore|Restore2|check_file|convert|Restore3|dumpname)
if [[ $conf_path != *restore_settings.conf && $conf_path = *backup_settings.conf ]]; then
update_backup_settings_conf>"$conf_path"
echo "因腳本找不到\n$conf_path\n故重新生成默認列表\n請重新配置後重新執行腳本" && exit 0
else
if [[ $conf_path = *restore_settings.conf && $conf_path != *backup_settings.conf ]]; then
update_Restore_settings_conf>"$conf_path"
echo "因腳本找不到\n$conf_path\n故重新生成默認列表\n請重新配置後重新執行腳本" && exit 0
else
echo "$conf_path配置遺失" && exit 1
fi
fi ;;
esac
fi
fi
[[ ! -f $conf_path ]] && echo "$conf_path遺失" && exit 2
. "$conf_path" &>/dev/null
if [[ $conf_path != *restore_settings.conf && $conf_path = *backup_settings.conf ]]; then
update_backup_settings_conf>"$conf_path"
else
if [[ $conf_path = *restore_settings.conf && $conf_path != *backup_settings.conf ]]; then
update_Restore_settings_conf>"$conf_path"
else
echo "$conf_path配置遺失" && exit 1
fi
fi
LANG="${LANG:="$(getprop "persist.sys.locale")"}"
echoRgb() {
#轉換echo顏色提高可讀性
@@ -274,7 +265,6 @@ else
[[ $(ksud -V 2>/dev/null) = "" ]] && echo "Magisk busybox Path does not exist"
fi
export PATH="$PATH"
#tools_path="${tools_path/'/storage/emulated/'/'/data/media/'}"
filepath="/data/backup_tools"
busybox="$filepath/busybox"
busybox2="$tools_path/busybox"
@@ -344,14 +334,15 @@ while read -r file expected_hash; do
break
fi
done <<< "$(cat <<EOF
zstd 2388211eb3960070c6b4528f68f7129a9ef5d165a0fef0113ac59e723006f4ca
zstd ab32aecb389c3ba5c1f7ab05d5eb6a861bad80261fd14ef9a8f4c283ac48c22c
tar 3c605b1e9eb8283555225dcad4a3bf1777ae39c5f19a2c8b8943140fd7555814
classes.dex ee8f70babbf30162a1ddae86930cc69d443eda0ecea177e36a9e1ae4681a4811
classes.dex 3d9372ac4a922808974bed039ca152d5741215976bedb20653e6e65e4bdcb37f
bc b15d730591f6fb52af59284b87d939c5bea204f944405a3518224d8df788dc15
busybox 4d60ab3f5a59ebb2ca863f2f514e6924401b581e9b64f602665c008177626651
find 7fa812e58aafa29679cf8b50fc617ecf9fec2cfb2e06ea491e0a2d6bf79b903b
jq 4dd2d8a0661df0b22f1bb9a1f9830f06b6f3b8f7d91211a1ef5d7c4f06a8b4a5
keycheck 50645ee0e0d2a7d64fb4a1286446df7a4445f3d11aefd49eeeb88515b314c363
cmd 08da8ac23b6e99788fd3ce6c19c7b5a083b2ad48be35963a48d01d6ee7f3bb6d
zip d9015b3c5d3376a4f9f2d204afd2aeaa4a86fd0174da1be090e41622e73be0ec
EOF)"
if [[ $background_execution = 1 || $setDisplayPowerMode = 1 ]]; then
@@ -422,7 +413,7 @@ get_version() {
continue
;;
esac
sleep 0.5
sleep 0.3
break
done
}
@@ -512,23 +503,6 @@ else
DEVICE_NAME="處理器:null"
RAMINFO="RAM:null"
fi
security_patch="$(getprop ro.build.version.security_patch 2>/dev/null)"
if [[ $security_patch != "" ]]; then
patch_date="$(date -d "$security_patch" +%s 2>/dev/null)"
if [[ -n $patch_date ]]; then
current_sec="$(date +%s)"
patch_age="$(( (current_sec - patch_date) / 86400 ))"
if (( patch_age > 90 )); then
echo "[!] 安全补丁日期: $security_patch (已过期${patch_age}天)"
else
echo "[√] 安全补丁日期: $security_patch (${patch_age}天前)"
fi
else
echo "[!] 无法解析安全补丁日期: $security_patch"
fi
else
echo "[!] 无法获取安全补丁日期"
fi
echoRgb "---------------------SpeedBackup---------------------"
echoRgb "腳本路徑:$MODDIR\n -已開機:$(Show_boottime)\n -執行時間:$(date +"%Y-%m-%d %H:%M:%S")\n -busybox路徑:$(which busybox)\n -busybox版本:$(busybox | head -1 | awk '{print $2}')\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 -內核:$(uname -r)\n -Selinux狀態:$([[ $(getenforce) = Permissive ]] && echo "寬容" || echo "嚴格")\n -By@YAWAsau\n -Support: https://jq.qq.com/?_wv=1027&k=f5clPNC3"
case $MODDIR in
@@ -594,70 +568,68 @@ add_entry() {
fi
REPLY="$app_name $package_name"
}
case $operate in
backup|Restore|Restore2|Getlist|backup_media)
if [[ $backup_mode = "" ]]; then
if [[ $user = "" ]]; then
user_id="$(ls /data/user | tr ' ' '\n')"
if [[ $user_id != "" && $(ls /data/user | tr ' ' '\n' | 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')"
case $Lo in
0|1)
echoRgb "音量上選擇用戶:$user1,音量下選擇用戶:$user2" "2"
Select_user="true"
get_version "$user1" "$user2" && user="$branch"
unset Select_user ;;
2)
Enter_options "輸入1選擇用戶:$user1 0用戶:$user2" "$user1" "$user2"
case $parameter in
0) user="$user2" ;;
1) user="$user1" ;;
esac ;;
esac
else
while true ;do
if [[ $option != "" ]]; then
user="$option"
break
else
echoRgb "請輸入需要操作目標分區" "1"
read option
fi
done
fi
else
user="0"
if [[ ! -f ${0%/*}/app_details.json ]]; then
if [[ $user = "" ]]; then
user_id="$(ls /data/user | tr ' ' '\n')"
if [[ $user_id != "" && $(ls /data/user | tr ' ' '\n' | 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')"
case $Lo in
0|1)
echoRgb "音量上選擇用戶:$user1,音量下選擇用戶:$user2" "2"
Select_user="true"
get_version "$user1" "$user2" && user="$branch"
unset Select_user ;;
2)
Enter_options "輸入1選擇用戶:$user1 0用戶:$user2" "$user1" "$user2"
case $parameter in
0) user="$user2" ;;
1) user="$user1" ;;
esac ;;
esac
else
while true ;do
if [[ $option != "" ]]; then
user="$option"
break
else
echoRgb "請輸入需要操作目標分區" "1"
read option
fi
done
fi
else
user_id="$(ls /data/user | tr ' ' '\n')"
if [[ $user_id != "" && $(ls /data/user | tr ' ' '\n' | wc -l) -gt 1 ]]; then
echo "$user_id" | while read ; do
[[ $REPLY = 0 ]] && echoRgb "主用戶:$REPLY" "2" || echoRgb "分身用戶:$REPLY" "2"
done
else
echoRgb "主用戶:$user_id" "2"
fi
fi
user="0"
fi
else
case $Compression_method in
tar | TAR | Tar) user="$(echo "${0%}" | sed 's/.*\/Backup_tar_\([0-9]*\).*/\1/')" ;;
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"
[[ ! -d $path2 ]] && echoRgb "$user分區不存在請將上方提示的用戶id按照需求填入\n -$conf_path配置項user=,一次只能填寫一個" "0" && exit 2
echoRgb "當前操作為用戶$user"
export USER_ID="$user" ;;
esac
user_id="$(ls /data/user | tr ' ' '\n')"
if [[ $user_id != "" && $(ls /data/user | tr ' ' '\n' | wc -l) -gt 1 ]]; then
echo "$user_id" | while read ; do
[[ $REPLY = 0 ]] && echoRgb "主用戶:$REPLY" "2" || echoRgb "分身用戶:$REPLY" "2"
done
else
echoRgb "主用戶:$user_id" "2"
fi
fi
else
case $(echo "${0%}") in
*zstd*) user="$(echo "${0%}" | sed 's/.*\/Backup_zstd_\([0-9]*\).*/\1/')" ;;
*tar*) user="$(echo "${0%}" | sed 's/.*\/Backup_tar_\([0-9]*\).*/\1/')" ;;
*) echoRgb "請勿修改備份資料夾名稱保持原本的Backup_壓縮算法名稱_使用者id" "0" && exit 2 ;;
esac
fi
[[ $user != 0 ]] && am start-user "$user"
path="/data/media/$user/Android"
path2="/data/user/$user"
path3="/data/user_de/$user"
[[ ! -d $path2 ]] && echoRgb "$user分區不存在請將上方提示的用戶id按照需求填入\n -$conf_path配置項user=,一次只能填寫一個" "0" && exit 2
echoRgb "當前操作為用戶$user"
export USER_ID="$user"
unset LD_LIBRARY_PATH
#因接收USER_ID環境變量問題故將函數放在此處
alias appinfo="app_process /system/bin com.xayah.dex.HiddenApiUtil getInstalledPackagesAsUser $USER_ID $@"
@@ -675,97 +647,50 @@ find_tools_path="$(find "$path_hierarchy"/* -maxdepth 1 -name "tools" -type d !
Rename_script () {
HT="${HT:=0}"
find "$path_hierarchy" -maxdepth 3 -name "*.sh" -type f -not -name "tools.sh" | sort | while read ; do
Script_type="$(grep -o 'operate="[^"]*"' "$REPLY" 2>/dev/null | awk -F'=' '{print $2}' | tr -d '"' | head -1)"
MODDIR_NAME="${REPLY%/*}"
FILE_NAME="${REPLY##*/}"
case $Script_type in
backup|Getlist|backup_media|Restore|dumpname|check_file|convert|Restore3|Restore2)
if [[ -f ${REPLY%/*}/app_details.json || -f ${REPLY%/*}/app_details ]]; then
if [[ $FILE_NAME = backup.sh ]]; then
touch_shell "$Script_type" "$REPLY" "backup_mode" "backup_mode=\"1\""
else
touch_shell "$Script_type" "$REPLY"
fi
if [[ -f ${REPLY%/*}/app_details.json || -f ${REPLY%/*}/app_details ]]; then
if [[ $FILE_NAME = backup.sh ]]; then
touch_shell "1" "$REPLY"
else
if [[ -d ${REPLY%/*}/tools ]]; then
touch_shell "$Script_type" "$REPLY"
if [[ $Script_target_language != $shell_language ]]; then
[[ $HT = 0 && $K = "" ]] && echoRgb "腳本語言為$shell_language....轉換為$Script_target_language中,請稍後等待轉換...."
ts <"$REPLY">temp && cp temp "$REPLY" && rm temp
echo_log "$(echo "$REPLY" | sed "s|^$path_hierarchy/||")翻譯"
mv "$REPLY" "$MODDIR_NAME/$(ts "$FILE_NAME")"
fi
fi
let HT++
fi ;;
kill_script)
if [[ $Script_target_language != $shell_language ]]; then
[[ $HT = 0 && $K = "" ]] && echoRgb "腳本語言為$shell_language....轉換為$Script_target_language中,請稍後等待轉換...."
ts <"$REPLY">temp && cp temp "$REPLY" && rm temp
echo_log "$(echo "$REPLY" | sed "s|^$path_hierarchy/||")翻譯"
mv "$REPLY" "$MODDIR_NAME/$(ts "$FILE_NAME")"
let HT++
fi ;;
esac
touch_shell "3" "$REPLY"
fi
else
[[ -d ${REPLY%/*}/tools ]] && touch_shell "0" "$REPLY"
let HT++
fi
done
unset HT
}
touch_shell () {
unset conf_path MODDIR_Path Update_backup
MODDIR_Path='${0%/*}'
MODDIR_NAME2="${2%/*}"
MODDIR_NAME2="${MODDIR_NAME2##*/}"
conf_path='${0%/*}/backup_settings.conf'
unset conf_path MODDIR_Path
case $1 in
Restore2)
0)
MODDIR_Path='${0%/*}'
MODDIR_Path1="$MODDIR_Path"
conf_path='${0%/*}/backup_settings.conf' ;;
1)
MODDIR_Path='${0%/*/*/*}'
MODDIR_Path1="$MODDIR_Path"
conf_path='${0%/*/*/*}/backup_settings.conf' ;;
2)
MODDIR_Path='${0%/*}'
MODDIR_Path1="$MODDIR_Path"
conf_path='${0%/*}/restore_settings.conf' ;;
3)
MODDIR_Path='${0%/*/*}'
conf_path='${0%/*/*}/restore_settings.conf' ;;
backup)
if [[ $3 = backup_mode ]]; then
MODDIR_Path='${0%/*/*/*}'
conf_path='${0%/*/*/*}/backup_settings.conf'
else
[[ $(basename "$2" | awk '{print length($0)}') -gt 15 ]] && Update_backup=1
fi ;;
Restore|convert|dumpname|Restore3|check_file) conf_path='${0%/*}/restore_settings.conf' ;;
MODDIR_Path1='${0%/*}'
conf_path='${0%/*/*}/restore_settings.conf' ;;
esac
if [[ $4 != "" ]]; then
[[ $Output_path = "" ]] && echo "if [ -f \"$MODDIR_Path/tools/tools.sh\" ]; then
MODDIR=\"$MODDIR_Path\"
operate=\"$1\"
$4
conf_path=\"$conf_path\"
case \$(grep -o 'background_execution=.*' \"\$conf_path\" | awk -F '=' '{print \$2}') in
0)
. \"$MODDIR_Path/tools/tools.sh\" | tee \"\${0%/*}/log.txt\" ;;
1)
{
. \"$MODDIR_Path/tools/tools.sh\" | tee \"\${0%/*}/log.txt\"
} & ;;
esac
else
echo \"$MODDIR_Path/tools/tools.sh遺失\"
fi" >"$2"
else
echo "[ \"\$(echo \"\${0%/*}\" | grep -o 'bin.mt.plus/temp')\" != \"\" ] && echo \"你媽沒告訴你腳本要解壓縮嗎?傻逼玩兒\" && exit 2
[[ $Output_path = "" ]] && echo "#!/system/bin/sh
if [ -f \"$MODDIR_Path/tools/tools.sh\" ]; then
MODDIR=\"\${0%/*}\"
operate=\"$1\"
MODDIR=\"$MODDIR_Path1\"
conf_path=\"$conf_path\"
Update_backup=\"$Update_backup\"
[ ! -f \"$conf_path\" ] && . \"\${0%/*}/tools/tools.sh\"
case \$(grep -o 'background_execution=.*' \"\$conf_path\" | awk -F '=' '{print \$2}') in
0)
. \"$MODDIR_Path/tools/tools.sh\" | tee \"\${0%/*}/log.txt\" ;;
1)
{
. \"$MODDIR_Path/tools/tools.sh\" | tee \"\${0%/*}/log.txt\"
} & ;;
esac
[ ! -f \"$conf_path\" ] && . \"$MODDIR_Path/tools/tools.sh\"
else
echo \"$MODDIR_Path/tools/tools.sh遺失\"
fi" >"$2"
fi
fi
. \"$MODDIR_Path/tools/tools.sh\" | tee \"\${0%/*}/log.txt\""> "$2"
}
update_script() {
[[ $zipFile = "" ]] && zipFile="$(find "$MODDIR" -maxdepth 1 -name "*.zip" -type f 2>/dev/null)"
@@ -986,7 +911,7 @@ backup_path() {
outshow="使用自定義目錄($Directory_type)"
else
Backup="$MODDIR/Backup_${Compression_method}_$user"
if [[ $backup_mode = "" ]]; then
if [[ ! -f ${0%/*}/app_details.json ]]; then
outshow="使用當前路徑作為備份目錄"
else
[[ -d $Backup ]] && outshow="使用上層路徑作為備份目錄" || echoRgb "$Backup目錄不存在" "0"
@@ -1482,10 +1407,11 @@ installapk() {
INSTALL "$TMPDIR/nmsl.apk"
echo_log "nmsl.apk安裝"
fi
find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | grep -v 'nmsl.apk' | while read; do
pm install-write "$b" "${REPLY##*/}" "$REPLY" &>/dev/null
echo_log "${REPLY##*/}安裝"
done
apks=($(find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f | grep -v 'nmsl.apk'))
for apk in "${apks[@]}"; do
pm install-write "$b" "${apk##*/}" "$apk" &>/dev/null
echo_log "${apk##*/}安裝"
done
pm install-commit "$b" &>/dev/null
echo_log "split Apk安裝"
;;
@@ -1529,9 +1455,9 @@ disable_verify() {
}
get_name(){
txt="$MODDIR/appList.txt"
txt="${txt/'/storage/emulated/'/'/data/media/'}"
txt2="$MODDIR/mediaList.txt"
txt3="$MODDIR/temp.txt"
txt="${txt/'/storage/emulated/'/'/data/media/'}"
if [[ $1 = Apkname ]]; then
rm -rf "$txt" "$txt2"
echoRgb "列出全部資料夾內應用名與自定義目錄壓縮包名稱" "3"
@@ -1547,6 +1473,7 @@ get_name(){
fi
[[ $Apk_info = "" ]] && echoRgb "Apk_info變量為空" "0" && exit
starttime1="$(date -u "+%s")"
i=1
find "$MODDIR" -maxdepth 2 -name "apk.*" -type f 2>/dev/null | sort | while read; do
Folder="${REPLY%/*}"
[[ $rgb_a -ge 229 ]] && rgb_a=118
@@ -1617,9 +1544,10 @@ get_name(){
case $1 in
Apkname)
[[ -f $Folder/${PackageName}.sh ]] && rm -rf "$Folder/${PackageName}.sh"
[[ ! -f $Folder/recover.sh ]] && touch_shell "Restore2" "$Folder/recover.sh"
[[ ! -f $Folder/backup.sh ]] && touch_shell "backup" "$Folder/backup.sh" "backup_mode" "backup_mode=\"1\""
echoRgb "$ChineseName $PackageName" && echo "$ChineseName $PackageName" >>"$txt" ;;
[[ ! -f $Folder/recover.sh ]] && touch_shell "3" "$Folder/recover.sh"
[[ ! -f $Folder/backup.sh ]] && touch_shell "1" "$Folder/backup.sh"
echoRgb "$i:$ChineseName $PackageName" && echo "$ChineseName $PackageName" >>"$txt"
let i++ ;;
convert)
if [[ ${Folder##*/} = $PackageName ]]; then
DIR_NAME="${Folder%/*}/$ChineseName"
@@ -1791,8 +1719,7 @@ Background_application_list() {
}
fi
}
case $operate in
backup)
backup() {
kill_Serve
self_test
case $MODDIR in
@@ -1927,13 +1854,12 @@ backup)
txt="$list_location"
else
txt="$MODDIR/$list_location"
echoRgb "$txt"
fi
else
txt="$MODDIR/appList.txt"
fi
#txt="${txt/'/storage/emulated/'/'/data/media/'}"
[[ ! -f $txt ]] && echoRgb "請執行\"生成應用列表.sh\"獲取應用列表再來備份" "0" && exit 1
txt="${txt/'/storage/emulated/'/'/data/media/'}"
[[ ! -f $txt ]] && echoRgb "請執行start.sh獲取應用列表再來備份" "0" && exit 1
TXT_NAME="${txt##*/}"
case ${TXT_NAME##*.} in
txt) ;;
@@ -1942,7 +1868,7 @@ backup)
sort -u "$txt" -o "$txt" &>/dev/null
data="$MODDIR"
hx="本地"
echoRgb "腳本受到內核機制影響 息屏後IO性能嚴重影響\n -請勿關閉終端或是息屏備份 如需終止腳本\n -請執行終止腳本.sh即可停止" "3"
echoRgb "腳本受到內核機制影響 息屏後IO性能嚴重影響\n -請勿關閉終端或是息屏備份 如需終止腳本\n -請執行start.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\n -關閉螢幕:$setDisplayPowerMode"
D="1"
@@ -1953,9 +1879,10 @@ backup)
Apk_info="$(appinfo "user|system" "pkgName" 2>/dev/null | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)"
fi
[[ $Apk_info = "" ]] && echoRgb "Apk_info變量為空" "0" && exit
[[ $backup_mode = "" ]] && {
[[ ! -f ${0%/*}/app_details.json ]] && {
echoRgb "檢查備份列表中是否存在已經卸載應用" "3"
echoRgb "檢查備份列表中已經更新應用" "3"
i1=1
r1="$(cat "$txt" 2>/dev/null | awk 'NF != 0 { count++ } END { print count }')"
while read -r ; do
if [[ $(echo "$REPLY" | sed -E 's/^[ \t]*//; /^[ \t]*[#!]/d') != "" ]]; then
app=($REPLY $REPLY)
@@ -1963,17 +1890,6 @@ backup)
if [[ $(echo "$Apk_info" | egrep -o "${app[1]}") != "" ]]; then
[[ $Tmplist = "" ]] && Tmplist='#不需要備份的應用請在開頭使用#注釋 比如:#酷安 com.coolapk.market忽略安裝包和數據\n#不需要備份數據的應用請在開頭使用!注釋 比如:!酷安 com.coolapk.market僅忽略數據'
Tmplist="$Tmplist\n$REPLY"
if [[ $Update_backup != "" ]]; then
Backup_folder="$Backup/${app[2]}"
app_details="$Backup_folder/app_details.json"
if [[ -d $Backup_folder ]]; then
apk_version="$(jq -r '.[] | select(.apk_version != null).apk_version' "$app_details")"
apk_version2="$(pm list packages --show-versioncode --user "$user" "${app[1]}" 2>/dev/null | cut -f3 -d ':' | head -n 1)"
[[ $apk_version != $apk_version2 ]] && {
[[ $Tmplist2 = "" ]] && Tmplist2="$REPLY" || Tmplist2="$Tmplist2\n$REPLY"
}
fi
fi
else
echoRgb "$REPLY不存在系統,從列表中刪除" "0"
fi
@@ -1983,7 +1899,22 @@ backup)
fi
done < "$txt"
}
[[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$txt"
apks=($(cat "$txt" | grep -Ev '^[#!]' | awk '{print $1 ":" $2}'))
[[ $Update_backup = true ]] && {
echoRgb "檢查備份列表中已經更新應用" "3"
for apk in "${apks[@]}"; do
Backup_folder="$Backup/$(echo "$apk" | cut -d':' -f1)"
app_details="$Backup_folder/app_details.json"
if [[ -d $Backup_folder ]]; then
apk_version="$(jq -r '.[] | select(.apk_version != null).apk_version' "$app_details")"
apk_version2="$(pm list packages --show-versioncode --user "$user" "$(echo "$apk" | cut -d':' -f2)" 2>/dev/null | cut -f3 -d ':' | head -n 1)"
[[ $apk_version != $apk_version2 ]] && {
[[ $Tmplist2 = "" ]] && Tmplist2="${apk/:/ }" || Tmplist2="$Tmplist2\n${apk/:/ }"
}
fi
done
}
[[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$txt"
if [[ $Tmplist2 != "" ]]; then
if [[ $Update_backup != "" ]]; then
cat "$txt">"${txt%/*}/txt2"
@@ -1993,23 +1924,19 @@ backup)
[[ $Update_backup != "" ]] && echoRgb "應用目前無更新" "0" && exit 0
fi
r="$(egrep -v '#|' "$txt" 2>/dev/null | awk 'NF != 0 { count++ } END { print count }')"
[[ $backup_mode != "" ]] && r=1
[[ $r = "" && $backup_mode = "" ]] && echoRgb "$MODDIR_NAME/appList.txt是空的或是包名被注釋備份個鬼\n -檢查是否注釋亦或者執行$MODDIR_NAME/生成應用列表.sh" "0" && exit 1
[[ -f ${0%/*}/app_details.json ]] && r=1
[[ $r = "" && ! -f ${0%/*}/app_details.json ]] && echoRgb "$MODDIR_NAME/appList.txt是空的或是包名被注釋備份個鬼\n -檢查是否注釋亦或者執行$MODDIR_NAME/start.sh" "0" && exit 1
if [[ $Backup_Mode = true ]]; then
[[ $Backup_user_data = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -Backup_user_data=0將不備份user數據" "0"
[[ $Backup_obb_data = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -Backup_obb_data=0將不備份外部數據" "0"
fi
[[ $backup_media = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -backup_media=0將不備份自定義資料夾" "0"
txt2="$Backup/appList.txt"
txt2="${txt2/'/storage/emulated/'/'/data/media/'}"
[[ ! -f $txt2 ]] && echo "#不需要恢復還原的應用請在開頭使用#注釋 比如:#酷安 com.coolapk.market">"$txt2"
[[ ! -d $Backup/tools ]] && cp -r "$tools_path" "$Backup"
[[ ! -f $Backup/恢復備份.sh ]] && touch_shell "Restore" "$Backup/恢復備份.sh"
[[ ! -f $Backup/終止腳本.sh ]] && cp -r "$MODDIR/終止腳本.sh" "$Backup/終止腳本.sh"
[[ ! -f $Backup/重新生成應用列表.sh ]] && touch_shell "dumpname" "$Backup/重新生成應用列表.sh"
[[ ! -f $Backup/轉換資料夾名稱.sh ]] && touch_shell "convert" "$Backup/轉換資料夾名稱.sh"
[[ ! -f $Backup/壓縮檔完整性檢查.sh ]] && touch_shell "check_file" "$Backup/壓縮檔完整性檢查.sh"
[[ ! -f $Backup/start.sh ]] && touch_shell "2" "$Backup/start.sh"
[[ ! -d $Backup/modules ]] && mkdir -p "$Backup/modules" && echoRgb "$Backup/modules已創建成功\n -請按需要自行放置需要恢復時刷入的模塊在內將自動批量刷入" "1"
[[ -d $Backup/Media ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh"
[[ ! -f $Backup/restore_settings.conf ]] && update_Restore_settings_conf>"$Backup/restore_settings.conf"
if [[ -d $Backup/tools ]]; then
find "$Backup/tools" -maxdepth 1 -type f | while read; do
@@ -2042,7 +1969,7 @@ backup)
while [[ $i -le $r ]]; do
[[ $en -ge 229 ]] && en=118
unset name1 name2 apk_path apk_path2
if [[ $backup_mode = "" ]]; then
if [[ ! -f ${0%/*}/app_details.json ]]; then
name1="$(egrep -v '#|' "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
name2="$(egrep -v '#|' "$txt" 2>/dev/null | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
else
@@ -2101,7 +2028,7 @@ backup)
if [[ $result = 0 && $No_backupdata = "" ]]; then
if [[ $Backup_Mode = true ]]; then
if [[ $Backup_obb_data = true ]]; then
if [[ $name2 != *mt* ]]; then
if [[ $name2 != bin.mt.plus ]]; then
#備份data數據
Backup_data "data"
#備份obb數據
@@ -2111,7 +2038,7 @@ backup)
fi
fi
#備份user數據
[[ $name2 != *mt* ]] && {
[[ $name2 != bin.mt.plus ]] && {
[[ $Backup_user_data = true ]] && {
Backup_data "user"
Backup_data "user_de"
@@ -2123,8 +2050,8 @@ backup)
fi
fi
[[ -f $Backup_folder/${name2}.sh ]] && rm -rf "$Backup_folder/${name2}.sh"
[[ ! -f $Backup_folder/recover.sh ]] && touch_shell "Restore2" "$Backup_folder/recover.sh"
[[ ! -f $Backup_folder/backup.sh ]] && touch_shell "backup" "$Backup_folder/backup.sh" "backup_mode" "backup_mode=\"1\""
[[ ! -f $Backup_folder/recover.sh ]] && touch_shell "3" "$Backup_folder/recover.sh"
[[ ! -f $Backup_folder/backup.sh ]] && touch_shell "1" "$Backup_folder/backup.sh"
fi
endtime 2 "$name1 備份" "3"
lxj="$(echo "$Occupation_status" | awk '{print $3}' | sed 's/%//g')"
@@ -2158,9 +2085,9 @@ backup)
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"
sort "$txt2" | sed '/^$/d' >"${txt2}.tmp" && mv "${txt2}.tmp" "$txt2"
[[ -e ${txt%/*}/txt2 ]] && cat "${txt%/*}/txt2">"$txt" && rm -rf "${txt%/*}/txt2"
if [[ $backup_media = true && $backup_mode = "" ]]; then
if [[ $backup_media = true && ! -f ${0%/*}/app_details.json ]]; then
A=1
B="$(echo "$Custom_path" | egrep -v '#|' | awk 'NF != 0 { count++ } END { print count }')"
if [[ $B != "" ]]; then
@@ -2168,7 +2095,7 @@ backup)
notification "102" "Media備份開始"
starttime1="$(date -u "+%s")"
Backup_folder="$Backup/Media"
[[ ! -f $Backup/恢復自定義資料夾.sh ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh"
[[ ! -f $Backup/start.sh ]] && touch_shell "2" "$Backup/start.sh"
[[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder"
app_details="$Backup_folder/app_details.json"
[[ ! -f $app_details ]] && echo "{\n}">"$app_details"
@@ -2215,32 +2142,38 @@ backup)
starttime1="$TIME"
endtime 1 "批量備份開始到結束"
notification "105" "備份完成 $(endtime 1 "批量備份開始到結束")"
chown "$(stat -c '%u:%g' '/data/media/0/Download')" "$txt"
chown "$(stat -c '%u:%g' '/data/media/0/Download')" "$txt2"
} &
wait && exit
;;
dumpname)
}
backup_update_apk() {
Update_backup='true'
backup
}
dumpname() {
get_name "Apkname"
;;
convert)
}
convert() {
get_name "convert"
;;
check_file)
}
check_file() {
Check_archive "$MODDIR"
;;
Restore|Restore2)
}
Restore() {
kill_Serve
self_test
disable_verify
[[ ! -d $path2 ]] && echoRgb "設備不存在user目錄" "0" && exit 1
if [[ $operate = Restore ]]; then
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊$MODDIR_NAME/終止腳本.sh\n -否則腳本將繼續執行直到結束" "0"
echoRgb "如果大量提示找不到資料夾請執行$MODDIR_NAME/轉換資料夾名稱.sh"
if [[ ! -f ${0%/*}/app_details.json ]]; then
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊$MODDIR_NAME/start.sh選擇終止腳本\n -否則腳本將繼續執行直到結束" "0"
echoRgb "如果大量提示找不到資料夾請執行$MODDIR_NAME/start.sh選擇轉換資料夾名稱"
txt="$MODDIR/appList.txt"
[[ ! -f $txt ]] && echoRgb "請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 2
[[ ! -f $txt ]] && echoRgb "請執行start.sh獲取應用列表再來恢復" "0" && exit 2
sort -u "$txt" -o "$txt" 2>/dev/null
i=1
r="$(egrep -v '#|' "$txt" 2>/dev/null | awk 'NF != 0 { count++ } END { print count }')"
[[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 1
[[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了\n -請執行start.sh獲取應用列表再來恢復" "0" && exit 1
Backup_folder2="$MODDIR/Media"
Backup_folder3="$MODDIR/modules"
#校驗選填是否正確
@@ -2396,7 +2329,7 @@ Restore|Restore2)
{
while [[ $i -le $r ]]; do
[[ $en -ge 229 ]] && en=118
if [[ $operate = Restore ]]; then
if [[ ! -f ${0%/*}/app_details.json ]]; then
echoRgb "恢復第$i/$r個應用 剩下$((r - i))" "3"
notification "105" "恢復第$i/$r個應用 剩下$((r - i))
恢復 $name1"
@@ -2489,7 +2422,7 @@ Restore|Restore2)
notification "107" "SSAID恢復後必須重新開機套用,否則應用閃退,如果沒有應用恢復ssaid則無須重啟"
}
notification "105" "app恢復完成 $(endtime 1 "應用恢復" "2")"
[[ $operate != Restore2 ]] && {
[[ ! -f ${0%/*}/app_details.json ]] && {
if [[ $media_recovery = true ]]; then
starttime1="$(date -u "+%s")"
app_details="$Backup_folder2/app_details.json"
@@ -2497,7 +2430,7 @@ Restore|Restore2)
sort -u "$txt" -o "$txt" 2>/dev/null
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
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行start.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}')"
@@ -2536,14 +2469,14 @@ Restore|Restore2)
rm -rf "$TMPDIR"/*
} &
wait && exit
;;
Restore3)
}
Restore3() {
kill_Serve
self_test
case $Lo in
0|1)
echoRgb "點錯了?這是恢復自定義資料夾腳本 如果你是要恢復應用那你就點錯了\n -音量上繼續恢復自定義資料夾,音量下離開腳本" "2"
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊終止腳本.sh,否則腳本將繼續執行直到結束" "0"
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊start.sh選擇終止腳本,否則腳本將繼續執行直到結束" "0"
get_version "恢復自定義資料夾" "離開腳本" && [[ $branch = false ]] && exit 0 ;;
2)
Enter_options "點錯了?這是恢復自定義資料夾腳本 如果你是要恢復應用那你就點錯了\n -輸入1繼續恢復自定義資料夾輸入0離開腳本" "恢復" "退出腳本" && isBoolean "$parameter" "branch" && branch="$nsx" && [[ $branch = false ]] && exit 0 ;;
@@ -2553,7 +2486,7 @@ Restore3)
Backup_folder2="$mediaDir"
[[ ! -d $mediaDir ]] && echoRgb "媒體資料夾不存在" "0" && exit 2
txt="$MODDIR/mediaList.txt"
[[ ! -f $txt ]] && echoRgb "請執行\"重新生成應用列表.sh\"獲取媒體列表再來恢復" "0" && exit 2
[[ ! -f $txt ]] && echoRgb "請執行start.sh獲取媒體列表再來恢復" "0" && exit 2
sort -u "$txt" -o "$txt" 2>/dev/null
#記錄開始時間
starttime1="$(date -u "+%s")"
@@ -2568,7 +2501,7 @@ Restore3)
A=1
B="$(egrep -v '#|' "$txt" 2>/dev/null | awk 'NF != 0 { count++ } END { print count }')"
Set_screen_pause_seconds on
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取列表再來恢復" "0" && exit 1
[[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行start.sh獲取列表再來恢復" "0" && exit 1
echo "$script">"$TMPDIR/scriptTMP"
notification "108" "Media恢復開始"
{
@@ -2584,13 +2517,12 @@ Restore3)
notification "108" "Media恢復完成 $(endtime 1 "Media恢復")"
rm -rf "$TMPDIR/scriptTMP"
} &
;;
Getlist)
}
Getlist() {
case $MODDIR in
/storage/emulated/0/Android/* | /data/media/0/Android/* | /sdcard/Android/*) echoRgb "請勿在$MODDIR內生成列表" "0" && exit 2 ;;
esac
#校驗選填是否正確
isBoolean "$debug_list" "debug_list" && debug_list="$nsx"
case $Lo in
0)
[[ $blacklist_mode != "" ]] && isBoolean "$blacklist_mode" "blacklist_mode" && blacklist_mode="$nsx" || {
@@ -2625,10 +2557,9 @@ Getlist)
} ;;
*) echoRgb "$conf_path Lo=$Lo填寫錯誤正確值0 1 2" "0" && exit 2 ;;
esac
txtpath="$MODDIR"
[[ $debug_list = true ]] && txtpath="${txtpath/'/storage/emulated/'/'/data/media/'}"
nametxt="$txtpath/appList.txt"
[[ ! -f $nametxt ]] && echo '#不需要備份的應用請在開頭使用#注釋 比如:#酷安 com.coolapk.market忽略安裝包和數據\n#不需要備份數據的應用請在開頭使用!注釋 比如:!酷安 com.coolapk.market僅忽略數據' >"$nametxt"
txt="$MODDIR/appList.txt"
txt="${txt/'/storage/emulated/'/'/data/media/'}"
[[ ! -f $txt ]] && echo '#不需要備份的應用請在開頭使用#注釋 比如:#酷安 com.coolapk.market忽略安裝包和數據\n#不需要備份數據的應用請在開頭使用!注釋 比如:!酷安 com.coolapk.market僅忽略數據' >"$txt"
echoRgb "請勿關閉腳本,等待提示結束"
rgb_a=118
starttime1="$(date -u "+%s")"
@@ -2650,12 +2581,12 @@ Getlist)
Q="0"
rb="0"
Output_list() {
if [[ $(cat "$nametxt" | cut -f2 -d ' ' | egrep -w "^${app_1[1]}$") != ${app_1[1]} ]]; then
[[ $REPLY2 = "" ]] && add_entry "${app_1[2]}" "${app_1[1]}" "$(cat "$nametxt" | grep -w "${app_1[2]}")" || add_entry "${app_1[2]}" "${app_1[1]}" "$REPLY2"
if [[ $(cat "$txt" | cut -f2 -d ' ' | egrep -w "^${app_1[1]}$") != ${app_1[1]} ]]; then
[[ $REPLY2 = "" ]] && add_entry "${app_1[2]}" "${app_1[1]}" "$(cat "$txt" | grep -w "${app_1[2]}")" || add_entry "${app_1[2]}" "${app_1[1]}" "$REPLY2"
case ${app_1[1]} in
*oneplus*|*miui*|*xiaomi*|*oppo*|*flyme*|*meizu*|com.android.soundrecorder|com.mfashiongallery.emag|com.mi.health|*coloros*|com.android.soundrecorder|com.duokan.phone.remotecontroller|com.android.calendar|com.android.deskclock|com.android.calendar|com.android.deskclock|com.google.android.safetycore|com.google.android.contactkeys)
*oneplus*|*miui*|*xiaomi*|*oppo*|*flyme*|*meizu*|com.android.soundrecorder|com.mfashiongallery.emag|com.mi.health|*coloros*|com.android.soundrecorder|com.duokan.phone.remotecontroller|com.android.calendar|com.android.deskclock|com.android.calendar|com.android.deskclock|com.google.android.safetycore|com.google.android.contactkeys|com.google.android.apps.messaging|com.google.android.calendar)
if [[ $(echo "$xposed_name" | egrep -w "${app_1[1]}$") = ${app_1[1]} ]]; then
echoRgb "$app_name為Xposed模塊 進行添加" "0"
echoRgb "$((i+1)):$app_name為Xposed模塊 進行添加" "0"
if [[ $REPLY2 = "" ]]; then
REPLY2="$REPLY" && [[ $tmp = "" ]] && tmp="1"
else
@@ -2669,7 +2600,7 @@ Getlist)
else
REPLY2="$REPLY2\n$REPLY" && [[ $tmp = "" ]] && tmp="1"
fi
echoRgb "$app_name ${app_1[1]}($rgb_a)"
echoRgb "$((i+1)):$app_name ${app_1[1]}($rgb_a)"
let i++
else
echoRgb "$app_name 預裝應用 忽略輸出" "0"
@@ -2689,10 +2620,10 @@ Getlist)
REPLY2="$REPLY2\n$REPLY" && [[ $tmp = "" ]] && tmp="1"
fi
if [[ $(echo "$xposed_name" | egrep -w "${app_1[1]}$") = ${app_1[1]} ]]; then
echoRgb "Xposed: $app_name ${app_1[1]}($rgb_a)"
echoRgb "$((i+1)):Xposed: $app_name ${app_1[1]}($rgb_a)"
let rd++
else
echoRgb "$app_name ${app_1[1]}($rgb_a)"
echoRgb "$((i+1)):$app_name ${app_1[1]}($rgb_a)"
fi
let i++
;;
@@ -2721,9 +2652,9 @@ Getlist)
Output_list
fi
if [[ $LR = $Apk_Quantity ]]; then
echo "$REPLY2">>"$nametxt"
if [[ $(cat "$nametxt" | wc -l | awk '{print $1-2}') -lt $i ]]; then
rm -rf "$nametxt"
echo "$REPLY2">>"$txt"
if [[ $(cat "$txt" | wc -l | awk '{print $1-2}') -lt $i ]]; then
rm -rf "$txt"
echoRgb "\n -輸出異常 請將$conf_path中的debug_list=\"0\"改為1或是重新執行本腳本" "0"
exit
fi
@@ -2732,7 +2663,7 @@ Getlist)
fi
let rgb_a++ LR++
done
if [[ -f $nametxt ]]; then
if [[ -f $txt ]]; then
rm -rf "$TMPDIR"/*
while read -r ; do
if [[ $(echo "$REPLY" | sed -E 's/^[ \t]*//; /^[ \t]*[#!]/d') != "" ]]; then
@@ -2754,18 +2685,13 @@ Getlist)
else
Tmplist="$Tmplist\n$REPLY"
fi
done < "$nametxt"
[[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$nametxt"
done < "$txt"
[[ $Tmplist != "" ]] && echo "$Tmplist" | sed -e '/^$/d' | sort>"$txt"
if [[ $recovery_flash = true ]]; then
if [[ -f $tools_path/update-binary && -f $TMPDIR/appList.txt ]]; then
echoRgb "輸出用於recovery的備份卡刷包" ; rm -rf "$MODDIR/recovery卡刷備份.zip"
touch_shell "Restore" "$TMPDIR/恢復備份.sh"
cp -r "$MODDIR/終止腳本.sh" "$TMPDIR/終止腳本.sh"
touch_shell "dumpname" "$TMPDIR/重新生成應用列表.sh"
touch_shell "convert" "$TMPDIR/轉換資料夾名稱.sh"
touch_shell "check_file" "$TMPDIR/壓縮檔完整性檢查.sh"
touch_shell "Restore2" "$TMPDIR/recover.sh"
touch_shell "Restore3" "$TMPDIR/恢復自定義資料夾.sh"
touch_shell "2" "$TMPDIR/start.sh"
touch_shell "3" "$TMPDIR/recover.sh"
update_Restore_settings_conf>"$TMPDIR/restore_settings.conf"
mkdir -p "$TMPDIR/META-INF/com/google/android" && cp "$tools_path/update-binary" "$TMPDIR/META-INF/com/google/android"
tar -cpf - -C "${tools_path%/*}" "${tools_path##*/}" | tar --delete "tools/zip" | tar --recursive-unlink -xmpf - -C "$TMPDIR/"
@@ -2778,24 +2704,22 @@ Getlist)
fi
fi
wait
chown "$(stat -c '%u:%g' '/data/media/0/Download')" "$txt"
endtime 1
echoRgb "輸出包名結束 請查看$nametxt"
;;
backup_media)
echoRgb "輸出包名結束 請查看$txt"
}
backup_media() {
kill_Serve
self_test
backup_path
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊終止腳本.sh,否則腳本將繼續執行直到結束" "0"
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊start.sh選擇終止腳本,否則腳本將繼續執行直到結束" "0"
A=1
B="$(echo "$Custom_path" | egrep -v '#|' | awk 'NF != 0 { count++ } END { print count }')"
if [[ $B != "" ]]; then
starttime1="$(date -u "+%s")"
Backup_folder="$Backup/Media"
[[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder"
[[ ! -f $Backup/恢復自定義資料夾.sh ]] && touch_shell "Restore3" "$Backup/恢復自定義資料夾.sh"
[[ ! -f $Backup/重新生成應用列表.sh ]] && touch_shell "dumpname" "$Backup/重新生成應用列表.sh"
[[ ! -f $Backup/轉換資料夾名稱.sh ]] && touch_shell "convert" "$Backup/轉換資料夾名稱.sh"
[[ ! -f $Backup/壓縮檔完整性檢查.sh ]] && touch_shell "check_file" "$Backup/壓縮檔完整性檢查.sh"
[[ ! -f $Backup/start.sh ]] && touch_shell "2" "$Backup/start.sh"
[[ ! -d $Backup/tools ]] && cp -r "$tools_path" "$Backup"
[[ ! -f $Backup/restore_settings.conf ]] && update_Restore_settings_conf>"$Backup/restore_settings.conf"
app_details="$Backup_folder/app_details.json"
@@ -2831,8 +2755,8 @@ backup_media)
else
echoRgb "自定義路徑為空 無法備份" "0"
fi
;;
Device_List)
}
Device_List() {
URL="https://raw.githubusercontent.com/KHwang9883/MobileModels/refs/heads/master/brands"
rm -rf "$tools_path/Device_List"
for i in $(echo "xiaomi\nxiaomi_en\nsamsung\nsamsung_global\nasus\nBlack_Shark\nBlack_Shark_en\ngoogle\nLenovo\nMEIZU\nMEIZU_en\nMotorola\nNokia\nnothing\nnubia\nOnePlus\nOnePlus_en\nSony\nrealme\nrealme_en\nvivo\nvivo_en\noppo\noppo_en"); do
@@ -2886,5 +2810,81 @@ Device_List)
fi
else
echoRgb "下載機型失敗"
fi ;;
esac
fi
}
if [[ $0 = *backup.sh ]]; then
start=backup
else
[[ $0 = *recover.sh ]] && start=Restore
fi
if [[ $start != "" ]]; then
case $(grep -o 'background_execution=.*' "$conf_path" | awk -F '=' '{print $2}') in
0)
eval "$start" ;;
1)
{
eval "$start"
} & ;;
esac
else
if [[ -f $MODDIR/backup_settings.conf ]]; then
echoRgb "音量鍵上下選擇對應功能,上鍵選擇下鍵跳過"
steps=(
"生成應用列表"
"備份應用"
"備份已更新應用"
"備份自定義資料夾"
"殺死運行中腳本"
)
commands=(
"Getlist"
"backup"
"backup_update_apk"
"backup_media"
"echoRgb "等待腳本停止中,請稍後....." ; kill_Serve && echoRgb "腳本終止" ;exit"
)
else
if [[ -f $MODDIR/restore_settings.conf ]]; then
echoRgb "音量鍵上下選擇對應功能,上鍵選擇下鍵跳過"
steps=(
"恢復備份"
"恢復自定義資料夾"
"重新生成應用列表"
"壓縮檔完整性檢查"
"轉換文件夾名稱"
"殺死運行中腳本"
)
commands=(
"Restore"
"Restore3"
"dumpname"
"check_file"
"convert"
"echo "等待腳本停止中,請稍後....." ; kill_Serve && echoRgb "腳本終止" ;exit"
)
fi
fi
# 開始循環提示
for i in "${!steps[@]}"; do
while true; do
echoRgb "是否執行:${steps[$i]}"
get_version "執行${steps[$i]}" "略過${steps[$i]}" && Select_Result="$branch"
case $Select_Result in
true)
case $(grep -o 'background_execution=.*' "$conf_path" | awk -F '=' '{print $2}') in
0)
eval "${commands[$i]}" ;;
1)
{
eval "${commands[$i]}"
} & ;;
esac
exit 0
;;
false)
break
;;
esac
done
done
fi