@@ -23,6 +23,7 @@ echo "$(sed 's/true/1/g ; s/false/0/g' "$conf_path")">"$conf_path"
[ [ $user = "" ] ] && user = 0
path = " /data/media/ $user /Android "
path2 = " /data/user/ $user "
path3 = " /data/user_de/ $user "
zipFile = " $( ls -t /storage/emulated/0/Download/*.zip 2>/dev/null | head -1) "
[ [ $( unzip -l " $zipFile " 2>/dev/null | awk '{print $4}' | egrep -wo " ^backup_settings.conf $" ) != "" ] ] && update_script
if [ [ $( getprop ro.build.version.sdk) -lt 30 ] ] ; then
@@ -316,12 +317,12 @@ Backup_apk() {
if [ [ $apk_version = "" ] ] ; then
echo " apk_version=\" $apk_version2 \" " >>" $app_details "
else
echo " $( cat " $app_details " & >/dev/null | sed " s/ ${ apk_version } / ${ apk_version2 } /g " ) " >" $app_details "
echo " $( cat " $app_details " | sed " s/ ${ apk_version } / ${ apk_version2 } /g " ) " >" $app_details "
fi
if [ [ $versionName = "" ] ] ; then
echo " versionName=\" $apk_version3 \" " >>" $app_details "
else
echo " $( cat " $app_details " & >/dev/null | sed " s/ ${ versionName } / ${ apk_version3 } /g " ) " >" $app_details "
echo " $( cat " $app_details " | sed " s/ ${ versionName } / ${ apk_version3 } /g " ) " >" $app_details "
fi
[ [ $PackageName = "" ] ] && echo " PackageName=\" $name2 \" " >>" $app_details "
[ [ $ChineseName = "" ] ] && echo " ChineseName=\" $name1 \" " >>" $app_details "
@@ -355,10 +356,11 @@ Backup_data() {
unset zsize Size data_path && data_path = " $path / $1 / $name2 "
case $1 in
user) Size = " $userSize " && data_path = " $path2 / $name2 " ; ;
user_de) Size = " $user_deSize " && data_path = " $path3 / $name2 " ; ;
data) Size = " $dataSize " ; ;
obb) Size = " $obbSize " ; ;
*)
[ [ -f $app_details ] ] && Size = " $( cat " $app_details " & >/dev/null | awk " / $1 Size/ " '{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g' ) "
[ [ -f $app_details ] ] && Size = " $( cat " $app_details " | awk " / $1 Size/ " '{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g' ) "
data_path = " $2 "
if [ [ $1 != storage-isolation && $1 != thanox ] ] ; then
Compression_method1 = " $Compression_method "
@@ -374,7 +376,7 @@ Backup_data() {
[ [ $name2 != $Open_apps2 ] ] && am force-stop " $name2 "
echoRgb " 備份 $1 數據 "
case $1 in
user)
user| user_de)
case $Compression_method in
tar | Tar | TAR) tar --exclude= " ${ data_path ##*/ } /.ota " --exclude= " ${ data_path ##*/ } /cache " --exclude= " ${ data_path ##*/ } /lib " --exclude= " ${ data_path ##*/ } /code_cache " --exclude= " ${ data_path ##*/ } /no_backup " -cpf - -C " ${ data_path %/* } " " ${ data_path ##*/ } " 2>/dev/null | pv >" $Backup_folder / $1 .tar " ; ;
zstd | Zstd | ZSTD) tar --exclude= " ${ data_path ##*/ } /.ota " --exclude= " ${ data_path ##*/ } /cache " --exclude= " ${ data_path ##*/ } /lib " --exclude= " ${ data_path ##*/ } /code_cache " --exclude= " ${ data_path ##*/ } /no_backup " -cpf - -C " ${ data_path %/* } " " ${ data_path ##*/ } " 2>/dev/null | pv | zstd -r -T0 --ultra -1 -q --priority= rt >" $Backup_folder / $1 .tar.zst " ; ;
@@ -400,13 +402,13 @@ Backup_data() {
if [ [ $zsize != "" ] ] ; then
rm -rf " $2 /PATH "
if [ [ $Size != "" ] ] ; then
echo " $( cat " $app_details " & >/dev/null | sed " s/ $Size / $( du -ks " $data_path " | awk '{print $1}' ) /g " ) " >" $app_details "
echo " $( cat " $app_details " | sed " s/ $Size / $( du -ks " $data_path " | awk '{print $1}' ) /g " ) " >" $app_details "
else
echo " # $1 Size=\" $( du -ks " $data_path " | awk '{print $1}' ) \" " >>" $app_details "
fi
else
if [ [ $Size != "" ] ] ; then
echo " $( cat " $app_details " & >/dev/null | sed " s/ $Size / $( du -ks " $data_path " | awk '{print $1}' ) /g " ) " >" $app_details "
echo " $( cat " $app_details " | sed " s/ $Size / $( du -ks " $data_path " | awk '{print $1}' ) /g " ) " >" $app_details "
else
echo " $1 Size=\" $( du -ks " $data_path " | awk '{print $1}' ) \" " >>" $app_details "
fi
@@ -575,7 +577,10 @@ get_name(){
txt = " $MODDIR /appList.txt "
txt2 = " $MODDIR /mediaList.txt "
txt = " ${ txt / '/storage/emulated/' / '/data/media/' } "
[ [ $1 = Apkname ] ] && rm -rf *.txt && echoRgb "列出全部資料夾內應用名與自定義目錄壓縮包名稱" "3"
if [ [ $1 = Apkname ] ] ; then
rm -rf " $txt " " $txt2 "
echoRgb "列出全部資料夾內應用名與自定義目錄壓縮包名稱" "3"
fi
rgb_a = 118
find " $MODDIR " -maxdepth 2 -name "app_details" -type f 2>/dev/null | sort | while read; do
REPLY = " ${ REPLY %/* } "
@@ -640,6 +645,11 @@ get_name(){
[ [ $1 = Apkname ] ] && sort -u " $txt " -o " $txt " 2>/dev/null && echoRgb " $txt重新生成 " "1"
exit 0
}
self_test( ) {
if [ [ $( dumpsys deviceidle get charging) = false && $( dumpsys battery | awk '/level/{print $2}' | egrep -o '[0-9]+' ) -le 20 ] ] ; then
echoRgb " 電量 $( dumpsys battery | awk '/level/{print $2}' | egrep -o '[0-9]+' ) %太低且未充電\n -為防止備份檔案或是恢復因低電量強制關機導致檔案損毀\n -請連接充電器後備份 " "0" && exit 2
fi
}
Validation_file( ) {
MODDIR_NAME = " ${ 1 %/* } "
MODDIR_NAME = " ${ MODDIR_NAME ##*/ } "
@@ -676,6 +686,7 @@ Check_archive() {
case $operate in
backup)
kill_Serve
self_test
[ [ ! -d $script_path ] ] && echo " $script_path腳本目錄遺失 " && exit 2
case $MODDIR in
/storage/emulated/0/Android/* | /data/media/0/Android/* | /sdcard/Android/*) echoRgb " 請勿在 $MODDIR內備份 " "0" && exit 2 ; ;
@@ -715,10 +726,9 @@ backup)
sort -u " $txt " -o " $txt " 2>/dev/null
data = " $MODDIR "
hx = "本地"
echoRgb " 壓縮方式: $Compression_method "
echoRgb "提示 腳本支持後台壓縮 可以直接離開腳本\n -或是關閉終端也能備份 如需終止腳本\n -請執行終止腳本.sh即可停止\n -備份結束將發送toast提示語" "3"
backup_path
echoRgb " 配置詳細:\n -音量鍵確認: $Lo \n -Toast: $toast_info \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 "
echoRgb " 配置詳細:\n -壓縮方式: $Compression_method \n -音量鍵確認: $Lo \n -Toast: $toast_info \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 "
D = "1"
C = " $( cat " $txt " | grep -v "#" | sed -e '/^$/d' | sed -n '$=' ) "
if [ [ $delete_folder = true ] ] ; then
@@ -797,13 +807,12 @@ backup)
starttime1 = " $( date -u "+%s" ) "
TIME = " $starttime1 "
en = 118
{
echo " $script " >" $TMPDIR /scriptTMP " && echo " $script " >" $TMPDIR /scriptTMP "
osn = 0; osj = 0; osk = 0
#獲取已經開啟的無障礙
var = " $( settings get secure enabled_accessibility_services) "
var = " $( settings get secure enabled_accessibility_services 2>/dev/null ) "
#獲取預設鍵盤
keyboard = " $( settings get secure default_input_method) "
keyboard = " $( settings get secure default_input_method 2>/dev/null ) "
[ [ $( cat " $txt " | grep -v "#" | sed -e '/^$/d' | awk '{print $2}' | grep -w " ^ ${ keyboard %/* } $" ) != ${ keyboard %/* } ] ] && unset keyboard
while [ [ $i -le $r ] ] ; do
[ [ $en -ge 229 ] ] && en = 118
@@ -822,7 +831,7 @@ backup)
if [ [ -d $apk_path2 ] ] ; then
echoRgb " 備份第 $i / $r個應用 剩下 $(( r - i)) 個 " "3"
echoRgb " 備份 $name1 \" $name2 \" " "2"
unset Backup_folder ChineseName PackageName nobackup No_backupdata result apk_version versionName apk_version2 apk_version3 userSize dataSize obbSize
unset Backup_folder ChineseName PackageName nobackup No_backupdata result apk_version versionName apk_version2 apk_version3
if [ [ $name1 = !* || $name1 = ! * ] ] ; then
name1 = " $( echo " $name1 " | sed 's/!//g ; s/! //g' ) "
echoRgb "跳過備份所有數據" "0"
@@ -837,7 +846,7 @@ backup)
if [ [ -f $app_details ] ] ; then
. " $app_details " & >/dev/null
if [ [ $PackageName != $name2 ] ] ; then
unset Backup_folder userSize ChineseName PackageName apk_version versionName apk_version2 apk_version3 result userSize dataSize obbSize
unset Backup_folder ChineseName PackageName apk_version versionName apk_version2 apk_version3 result
Backup_folder = " $Backup / ${ name1 } [ ${ name2 } ] "
app_details = " $Backup_folder /app_details "
[ [ -f $app_details ] ] && . " $app_details " & >/dev/null
@@ -861,7 +870,10 @@ backup)
Backup_data "obb"
fi
#備份user數據
[ [ $Backup_user_data = true ] ] && Backup_data "user"
[ [ $Backup_user_data = true ] ] && {
Backup_data "user"
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 = moe.shizuku.redirectstorage ] ] && Backup_data "storage-isolation" "/data/adb/storage-isolation"
fi
@@ -953,7 +965,6 @@ backup)
let i++
done
exit 0
} &
wait && exit
; ;
dumpname)
@@ -967,6 +978,7 @@ check_file)
; ;
Restore)
kill_Serve
self_test
echoRgb " 假設反悔了要終止腳本請儘速離開此腳本點擊 $MODDIR_NAME /終止腳本.sh\n -否則腳本將繼續執行直到結束 " "0"
echoRgb " 如果大量提示找不到資料夾請執行 $MODDIR_NAME /轉換資料夾名稱.sh "
disable_verify
@@ -1012,7 +1024,6 @@ Restore)
starttime1 = " $( date -u "+%s" ) "
TIME = " $starttime1 "
en = 118
{
echo " $script " >" $TMPDIR /scriptTMP "
while [ [ $i -le $r ] ] ; do
[ [ $en -ge 229 ] ] && en = 118
@@ -1086,17 +1097,16 @@ Restore)
echoRgb "批量恢複完成" && endtime 1 "批量恢複開始到結束" && echoRgb "如發現應用閃退請重新開機"
longToast "批量恢復完成"
Print " 批量恢復完成 執行過程請查看 $Status_log " && rm -rf " $TMPDIR " /*
} &
wait && exit
; ;
Restore2)
kill_Serve
self_test
disable_verify
[ [ ! -d $path2 ] ] && echoRgb "設備不存在user目錄" "0" && exit 1
[ [ $( which restorecon) = "" ] ] && echoRgb "restorecon命令不存在" "0" && exit 1
#記錄開始時間
starttime1 = " $( date -u "+%s" ) "
{
echo " $script " >" $TMPDIR /scriptTMP "
Backup_folder = " $MODDIR "
if [ [ ! -f $Backup_folder /app_details ] ] ; then
@@ -1135,11 +1145,11 @@ Restore2)
fi
endtime 1 "恢複開始到結束" && echoRgb "如發現應用閃退請重新開機" && rm -rf " $TMPDIR " /*
rm -rf " $TMPDIR /scriptTMP "
} &
wait && exit
; ;
Restore3)
kill_Serve
self_test
echoRgb "點錯了?這是恢復自定義資料夾腳本 如果你是要恢復應用那你就點錯了\n -音量上繼續恢復自定義資料夾,音量下離開腳本" "2"
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊終止腳本.sh,否則腳本將繼續執行直到結束" "0"
get_version "恢復自定義資料夾" "離開腳本" && [ [ " $branch " = false ] ] && exit 0
@@ -1262,6 +1272,7 @@ Getlist)
; ;
backup_media)
kill_Serve
self_test
backup_path
echoRgb "假設反悔了要終止腳本請儘速離開此腳本點擊終止腳本.sh,否則腳本將繼續執行直到結束" "0"
A = 1