diff --git a/backup_media.sh b/backup_media.sh new file mode 100644 index 0000000..a3cd53a --- /dev/null +++ b/backup_media.sh @@ -0,0 +1,7 @@ +if [ -f "${0%/*}/tools/bin/tools.sh" ]; then + MODDIR="${0%/*}" + operate="backup_media" + . "${0%/*}/tools/bin/tools.sh" +else + echo "${0%/*}/tools/bin/tools.sh遗失" +fi \ No newline at end of file diff --git a/backup_settings.conf b/backup_settings.conf index 63494e2..66520e3 100644 --- a/backup_settings.conf +++ b/backup_settings.conf @@ -6,6 +6,9 @@ Lo=0 #自定義備份目錄輸出位置 (忽略為空將默認腳本路徑中) Output_path= +#Getlist.sh列出系統應用 +system_name=1 + #假設如果存在usb隨身碟是否默認使用隨身碟?(1不詢問默認使用 0每次都進行詢問) USBdefault=0 diff --git a/tools/bin/bin.sh b/tools/bin/bin.sh index 21eba19..c8fddbc 100644 --- a/tools/bin/bin.sh +++ b/tools/bin/bin.sh @@ -119,9 +119,9 @@ echoRgb() { elif [[ $2 = 1 ]]; then echo -e "\e[38;5;121m -$1\e[0m" elif [[ $2 = 2 ]]; then - echo -e "\e[38;5;223m -$1\e[0m" + echo -e "\e[38;5;218m -$1\e[0m" elif [[ $2 = 3 ]]; then - echo -e "\e[38;5;220m -$1\e[0m" + echo -e "\e[38;5;183m -$1\e[0m" else echo -e "\e[38;5;${bn}m -$1\e[0m" fi @@ -194,7 +194,7 @@ fi #-閃存顆粒:$UFS_MODEL $Particles Open_apps="$(appinfo -d "(" -ed ")" -o ands,pn -ta c)" Open_apps2="$(echo "$Open_apps" | cut -f2 -d '(' | sed 's/)//g')" -bn=214 +bn=218 echoRgb "\n --------------###############--------------\n -當前腳本執行路徑:$MODDIR\n -busybox路徑:$(which busybox)\n -busybox版本:$(busybox | head -1 | awk '{print $2}')\n -appinfo版本:$(appinfo --version)\n -腳本版本:$backup_version\n -Magisk版本:$(cat "/data/adb/magisk/util_functions.sh" 2>/dev/null | grep "MAGISK_VER_CODE" | cut -f2 -d '=')\n -設備架構:$abi\n -品牌:$(getprop ro.product.brand 2>/dev/null)\n -設備代號:$(getprop ro.product.device 2>/dev/null)\n -型號:$(getprop ro.product.model 2>/dev/null)-$(getprop ro.serialno 2>/dev/null)\n -RAM:$(cat /proc/meminfo 2>/dev/null | head -n 1 | awk '{print $2/1000"MB"}' 2>/dev/null)\n -閃存類型:$ROM_TYPE\n -閃存顆粒:$UFS_MODEL $Particles\n -Android版本:$(getprop ro.build.version.release 2>/dev/null)\n -SDK:$(getprop ro.build.version.sdk 2>/dev/null)\n -終端:$Open_apps" bn=117 if [[ $(pm path ice.message) = "" ]]; then diff --git a/tools/bin/tools.sh b/tools/bin/tools.sh index a3571f5..03139fc 100644 --- a/tools/bin/tools.sh +++ b/tools/bin/tools.sh @@ -22,15 +22,15 @@ fi case $operate in backup) { - script="${0##*/}" - if [[ $script != "" ]]; then - pgrep -f "tar" | while read; do - kill -KILL " $REPLY" >/dev/null - done - #pgrep -f "$script" | while read; do + script="${0##*/}" + if [[ $script != "" ]]; then + pgrep -f "tar" | while read; do + kill -KILL " $REPLY" >/dev/null + done + #pgrep -f "$script" | while read; do #kill -KILL " $REPLY" >/dev/null - #done - fi + #done + fi } & [[ ! -d $script_path ]] && echo "$script_path腳本目錄遺失" && EXIT="true" [[ ! -f $MODDIR/backup_settings.conf ]] && echo "backup_settings.conf配置遺失" && EXIT="true" @@ -79,6 +79,13 @@ backup) fi done echo "$(cat "$txt" | sed -e '/^$/d')" >"$txt" + if [[ -f $MODDIR/systemList.txt ]]; then + cat "$txt" >"$TMPDIR/applist" && cat "$MODDIR/systemList.txt" >>"$TMPDIR/applist" + [[ -f $TMPDIR/applist ]] && txt="$TMPDIR/applist" + echoRgb "列表內包含系統應用 針對系統應用僅備份數據不備份apk" "2" + else + echoRgb "僅第三方應用" "2" + fi fi r="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" [[ $r = "" ]] && echoRgb "爬..appList.txt是空的或是包名被注釋了這樣備份個鬼" "0" && exit 1 @@ -161,58 +168,67 @@ backup) result=0 echoRgb "Apk版本無更新 跳過備份" "2" else - case $name2 in - com.google.android.youtube) - [[ -d /data/adb/Vanced ]] && nobackup="true" - ;; - com.google.android.apps.youtube.music) - [[ -d /data/adb/Music ]] && nobackup="true" - ;; - esac - if [[ $nobackup != true ]]; then - partition_info - [[ $lxj -ge 95 ]] && echoRgb "$hx空間不足,達到$lxj%" "0" && exit 2 - [[ $(cat "$txt2" | grep -v "#" | sed -e '/^$/d' | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2" >>"$txt2" - rm -rf "$Backup_folder"/*.apk - #備份apk - echoRgb "$1" - [[ $name2 != $Open_apps2 ]] && am force-stop "$name2" - echo "$apk_path" | sed -e '/^$/d' | while read; do - path="$REPLY" - b_size="$(ls -l "$path" | awk '{print $5}')" - k_size="$(awk 'BEGIN{printf "%.2f\n", "'$b_size'"/'1024'}')" - m_size="$(awk 'BEGIN{printf "%.2f\n", "'$k_size'"/'1024'}')" - echoRgb "${path##*/} ${m_size}MB(${k_size}KB)" - done - ( - cd "$apk_path2" - case $Compression_method in - tar | TAR | Tar) tar -cf "$Backup_folder/apk.tar" *.apk ;; - lz4 | LZ4 | Lz4) tar -cf - *.apk | lz4 -1 >"$Backup_folder/apk.tar.lz4" ;; - zstd | Zstd | ZSTD) tar -cf - *apk | zstd -r -T0 --ultra -6 -q >"$Backup_folder/apk.tar.zst" ;; - esac - ) - echo_log "備份$apk_number個Apk" - if [[ $result = 0 ]]; then - #pm list packages --show-versioncode "$name2" - echo "apk_version=\"$(dumpsys package "$name2" | awk '/versionName=/{print $1}' | cut -f2 -d '=' | head -1)\"" >>"$app_details" - [[ $PackageName = "" ]] && echo "PackageName=\"$name2\"" >>"$app_details" - [[ $ChineseName = "" ]] && echo "ChineseName=\"$name1\"" >>"$app_details" - [[ ! -f $Backup_folder/Restorebackup.sh ]] && cp -r "$script_path/restore2" "$Backup_folder/Restorebackup.sh" - 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--" + [[ $(cat "$txt2" | grep -v "#" | sed -e '/^$/d' | awk '{print $2}' | grep -w "^${name2}$" | head -1) = "" ]] && echo "${Backup_folder##*/} $name2 $name3" >>"$txt2" + if [[ $name3 != system ]]; then + case $name2 in + com.google.android.youtube) + [[ -d /data/adb/Vanced ]] && nobackup="true" + ;; + com.google.android.apps.youtube.music) + [[ -d /data/adb/Music ]] && nobackup="true" + ;; + esac + if [[ $nobackup != true ]]; then + partition_info + [[ $lxj -ge 95 ]] && echoRgb "$hx空間不足,達到$lxj%" "0" && exit 2 + rm -rf "$Backup_folder"/*.apk + #備份apk + echoRgb "$1" + [[ $name2 != $Open_apps2 ]] && am force-stop "$name2" + echo "$apk_path" | sed -e '/^$/d' | while read; do + path="$REPLY" + b_size="$(ls -l "$path" | awk '{print $5}')" + k_size="$(awk 'BEGIN{printf "%.2f\n", "'$b_size'"/'1024'}')" + m_size="$(awk 'BEGIN{printf "%.2f\n", "'$k_size'"/'1024'}')" + echoRgb "${path##*/} ${m_size}MB(${k_size}KB)" 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" + ( + cd "$apk_path2" + case $Compression_method in + tar | TAR | Tar) tar -cf "$Backup_folder/apk.tar" *.apk ;; + lz4 | LZ4 | Lz4) tar -cf - *.apk | lz4 -1 >"$Backup_folder/apk.tar.lz4" ;; + zstd | Zstd | ZSTD) tar -cf - *apk | zstd -r -T0 --ultra -6 -q >"$Backup_folder/apk.tar.zst" ;; + esac + ) + echo_log "備份$apk_number個Apk" + if [[ $result = 0 ]]; then + #pm list packages --show-versioncode "$name2" + echo "apk_version=\"$(dumpsys package "$name2" | awk '/versionName=/{print $1}' | cut -f2 -d '=' | head -1)\"" >>"$app_details" + [[ $PackageName = "" ]] && echo "PackageName=\"$name2\"" >>"$app_details" + [[ $ChineseName = "" ]] && echo "ChineseName=\"$name1\"" >>"$app_details" + [[ $type = "" ]] && echo "type=\"$name3\"" >>"$app_details" + [[ ! -f $Backup_folder/Restorebackup.sh ]] && cp -r "$script_path/restore2" "$Backup_folder/Restorebackup.sh" + 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 + echoRgb "$name不支持備份 需要使用vanced安裝" "0" && rm -rf "$Backup_folder" fi else - echoRgb "$name不支持備份 需要使用vanced安裝" "0" && rm -rf "$Backup_folder" + echoRgb "$name2為系統應用不備份apk" "3" && result="0" + [[ $PackageName = "" ]] && echo "PackageName=\"$name2\"" >>"$app_details" + [[ $ChineseName = "" ]] && echo "ChineseName=\"$name1\"" >>"$app_details" + [[ $type = "" ]] && echo "type=\"$name3\"" >>"$app_details" + [[ ! -f $Backup_folder/Restorebackup.sh ]] && cp -r "$script_path/restore2" "$Backup_folder/Restorebackup.sh" fi fi [[ $name2 = bin.mt.plus && ! -f $Backup/$name1.apk ]] && cp -r "$apk_path" "$Backup/$name1.apk" @@ -286,16 +302,17 @@ backup) { while [[ $i -le $r ]]; do [[ $en -ge 229 ]] && en=118 - unset name1 name2 apk_path apk_path2 + unset name1 name2 apk_path apk_path2 result name1="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" name2="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + name3="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $3}')" [[ $name2 = "" ]] && echoRgb "警告! appList.txt應用包名獲取失敗,可能修改有問題" "0" && exit 1 apk_path="$(pm path "$name2" | cut -f2 -d ':')" apk_path2="$(echo "$apk_path" | head -1)" apk_path2="${apk_path2%/*}" if [[ -d $apk_path2 ]]; then echoRgb "備份第$i/$r個應用 剩下$((r - i))個" "3" - unset ChineseName PackageName nobackup No_backupdata + unset ChineseName PackageName nobackup No_backupdata result type if [[ $name1 = *! || $name1 = *! ]]; then name1="$(echo "$name1" | sed 's/!//g ; s/!//g')" echoRgb "跳過備份$name1 所有數據" "0" @@ -306,7 +323,7 @@ backup) if [[ -f $app_details ]]; then . "$app_details" if [[ $PackageName != $name2 ]]; then - unset userSize ChineseName PackageName apk_version + unset userSize ChineseName PackageName apk_version type result Backup_folder="$Backup/${name1}[${name2}]" app_details="$Backup_folder/app_details" [[ -f $app_details ]] && . "$app_details" @@ -356,14 +373,16 @@ backup) echoRgb "備份結束,備份多媒體" "1" starttime1="$(date -u "+%s")" Backup_folder="$Backup/Media" + [[ ! -f $Backup/Restoremedia.sh ]] && cp -r "$script_path/restore3" "$Backup/Restoremedia.sh" [[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder" - [[ ! -f $Backup_folder/恢復多媒體數據.sh ]] && cp -r "$script_path/restore3" "$Backup_folder/恢復多媒體數據.sh" app_details="$Backup_folder/app_details" [[ -f $app_details ]] && . "$app_details" + [[ ! -f $Backup/mediaList.txt ]] && echo "#不需要恢復的資料夾請在開頭注釋# 比如#媒體" > "$Backup/mediaList.txt" echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | while read; do echoRgb "備份第$A/$B個資料夾 剩下$((B - A))個" "3" starttime2="$(date -u "+%s")" Backup_data "${REPLY##*/}" "$REPLY" + [[ $result = 0 ]] && echo "${REPLY##*/}.tar" >> "$Backup/mediaList.txt" endtime 2 "${REPLY##*/}備份" "1" echoRgb "完成$((A * 100 / B))% $hx$(echo "$Occupation_status" | awk 'END{print "剩餘:"$1"使用率:"$2}')" "2" && echoRgb "____________________________________" && let A++ done @@ -403,15 +422,23 @@ backup) ;; dumpname) txt="$MODDIR/appList.txt" + txt2="$MODDIR/mediaList.txt" txt="${txt/'/storage/emulated/'/'/data/media/'}" + echoRgb "列出全部資料夾內應用名與自定義目錄壓縮包名稱" "3" echo "#不需要恢復還原的應用請在開頭注釋# 比如#xxxxxxxx 酷安" >"$txt" + echo "#不需要恢復的資料夾請在開頭注釋# 比如#媒體" > "$txt2" find "$MODDIR" -maxdepth 1 -type d | sort | while read; do if [[ -f $REPLY/app_details ]]; then + if [[ ${REPLY##*/} = Media ]]; then + echoRgb "存在媒體資料夾" "2" + find "$REPLY" -maxdepth 1 -name "*.tar*" -type f | while read; do + echo "${REPLY##*/}" >> "$txt2" + done + echoRgb "$txt2重新生成" "1" + fi unset PackageName . "$REPLY/app_details" - if [[ $PackageName != "" ]]; then - echo "${REPLY##*/} $PackageName" >>"$txt" - fi + [[ $PackageName != "" ]] && echo "${REPLY##*/} $PackageName $type" >>"$txt" fi done echoRgb "$txt重新生成" "1" @@ -422,7 +449,7 @@ Restore) #禁用安裝包驗證 settings put global package_verifier_enable 0 #關閉play安全效驗 - if [[ $(settings get global package_verifier_user_consent) != "" && $(settings get global package_verifier_user_consent) != -1 ]]; then + if [[ $(settings get global package_verifier_user_consent) != "" && $(settings get global package_verifier_user_consent) != -1 ]]; then settings put global package_verifier_user_consent -1 settings put global upload_apk_enable 0 echoRgb "PLAY安全驗證為開啟狀態已被腳本關閉防止apk安裝失敗" "3" @@ -432,7 +459,7 @@ Restore) txt="$MODDIR/appList.txt" [[ ! -f $txt ]] && echoRgb "請執行\"DumpName.sh\"獲取應用列表再來恢復" "0" && exit 2 r="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" - [[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了" "0" && exit 1 + [[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了\n -請執行\"DumpName.sh\"獲取應用列表再來恢復" "0" && exit 1 [[ $(which restorecon) = "" ]] && echoRgb "restorecon命令不存在" "0" && exit 1 #顯示執行結果 Release_data() { @@ -532,6 +559,7 @@ Restore) echoRgb "恢複第$i/$r個應用 剩下$((r - i))個" "3" name1="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" name2="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + name3="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $3}')" unset No_backupdata if [[ $name1 = *! || $name1 = *! ]]; then name1="$(echo "$name1" | sed 's/!//g ; s/!//g')" @@ -544,51 +572,55 @@ Restore) if [[ -d $Backup_folder ]]; then echoRgb "恢複$name1 ($name2)" starttime2="$(date -u "+%s")" - if [[ $(pm path "$name2") = "" ]]; then - apkfile="$(find "$Backup_folder" -maxdepth 1 -name "apk.*" -type f 2>/dev/null)" - if [[ $apkfile != "" ]]; then - rm -rf "$TMPDIR"/* - case ${apkfile##*.} in - lz4) pv "$apkfile" | tar -I lz4 -xmpf - -C "$TMPDIR" ;; - zst) pv "$apkfile" | tar -I zstd -xmpf - -C "$TMPDIR" ;; - tar) pv "$apkfile" | tar -xmpf - -C "$TMPDIR" ;; - *) - echoRgb "${apkfile##*/} 壓縮包不支持解壓縮" "0" - Set_back - ;; - esac - echo_log "${apkfile##*/}解壓縮" && [[ -f $Backup_folder/nmsl.apk ]] && cp -r "$Backup_folder/nmsl.apk" "$TMPDIR" + if [[ $name3 != system ]]; then + if [[ $(pm path "$name2") = "" ]]; then + apkfile="$(find "$Backup_folder" -maxdepth 1 -name "apk.*" -type f 2>/dev/null)" + if [[ $apkfile != "" ]]; then + rm -rf "$TMPDIR"/* + case ${apkfile##*.} in + lz4) pv "$apkfile" | tar -I lz4 -xmpf - -C "$TMPDIR" ;; + zst) pv "$apkfile" | tar -I zstd -xmpf - -C "$TMPDIR" ;; + tar) pv "$apkfile" | tar -xmpf - -C "$TMPDIR" ;; + *) + echoRgb "${apkfile##*/} 壓縮包不支持解壓縮" "0" + Set_back + ;; + esac + echo_log "${apkfile##*/}解壓縮" && [[ -f $Backup_folder/nmsl.apk ]] && cp -r "$Backup_folder/nmsl.apk" "$TMPDIR" + else + echoRgb "你的Apk壓縮包離家出走了,可能備份後移動過程遺失了\n -解決辦法手動安裝Apk後再執行恢復腳本" "0" + fi + if [[ $result = 0 ]]; then + case $(find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | wc -l) in + 1) + echoRgb "恢復普通apk" "2" + pm install -i com.android.vending --user 0 -r "$TMPDIR"/*.apk >/dev/null 2>&1 + echo_log "Apk安裝" + ;; + 0) + echoRgb "$TMPDIR中沒有apk" "0" + ;; + *) + echoRgb "恢復split apk" "2" + b="$(pm install-create -i -i com.android.vending --user 0 | grep -E -o '[0-9]+')" + if [[ -f $TMPDIR/nmsl.apk ]]; then + pm install -i com.android.vending --user 0 -r "$TMPDIR/nmsl.apk" >/dev/null 2>&1 + echo_log "nmsl.apk安裝" + fi + find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f | grep -v 'nmsl.apk' | while read; do + pm install-write "$b" "${REPLY##*/}" "$REPLY" >/dev/null 2>&1 + echo_log "${REPLY##*/}安裝" + done + pm install-commit "$b" >/dev/null 2>&1 + echo_log "split Apk安裝" + ;; + esac + fi else - echoRgb "你的Apk壓縮包離家出走了,可能備份後移動過程遺失了\n -解決辦法手動安裝Apk後再執行恢復腳本" "0" - fi - if [[ $result = 0 ]]; then - case $(find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | wc -l) in - 1) - echoRgb "恢復普通apk" "2" - pm install -i com.android.vending --user 0 -r "$TMPDIR"/*.apk >/dev/null 2>&1 - echo_log "Apk安裝" - ;; - 0) - echoRgb "$TMPDIR中沒有apk" "0" - ;; - *) - echoRgb "恢復split apk" "2" - b="$(pm install-create -i -i com.android.vending --user 0 | grep -E -o '[0-9]+')" - if [[ -f $TMPDIR/nmsl.apk ]]; then - pm install -i com.android.vending --user 0 -r "$TMPDIR/nmsl.apk" >/dev/null 2>&1 - echo_log "nmsl.apk安裝" - fi - find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f | grep -v 'nmsl.apk' | while read; do - pm install-write "$b" "${REPLY##*/}" "$REPLY" >/dev/null 2>&1 - echo_log "${REPLY##*/}安裝" - done - pm install-commit "$b" >/dev/null 2>&1 - echo_log "split Apk安裝" - ;; - esac + echoRgb "存在當前系統中略過安裝Apk" "2" fi else - echoRgb "存在當前系統中略過安裝Apk" "2" + echoRgb "$name2是系統應用" "3" fi if [[ $No_backupdata = "" ]]; then if [[ $(pm path "$name2") != "" ]]; then @@ -641,7 +673,7 @@ Restore2) #禁用安裝包驗證 settings put global package_verifier_enable 0 #關閉play安全效驗 - if [[ $(settings get global package_verifier_user_consent) != "" && $(settings get global package_verifier_user_consent) != -1 ]]; then + if [[ $(settings get global package_verifier_user_consent) != "" && $(settings get global package_verifier_user_consent) != -1 ]]; then settings put global package_verifier_user_consent -1 settings put global upload_apk_enable 0 echoRgb "PLAY安全驗證為開啟狀態已被腳本關閉防止apk安裝失敗" "3" @@ -661,53 +693,59 @@ Restore2) [[ $name = "" ]] && echoRgb "包名獲取失敗" "0" && exit 2 name2="$ChineseName" [[ $name2 = "" ]] && echoRgb "應用名獲取失敗" "0" && exit 2 + name3="$type" + [[ $name3 = "" ]] && echoRgb "應用類型獲取失敗" "0" && exit 2 echoRgb "恢複$name2 ($name)" "3" starttime2="$(date -u "+%s")" - if [[ $(pm path "$name") = "" ]]; then - apkfile="$(find "$Backup_folder" -maxdepth 1 -name "apk.*" -type f 2>/dev/null)" - if [[ $apkfile != "" ]]; then - rm -rf "$TMPDIR"/* - case ${apkfile##*.} in - lz4) pv "$apkfile" | tar -I lz4 -xmpf - -C "$TMPDIR" ;; - zst) pv "$apkfile" | tar -I zstd -xmpf - -C "$TMPDIR" ;; - tar) pv "$apkfile" | tar -xmpf - -C "$TMPDIR" ;; - *) - echoRgb "${apkfile##*/} 壓縮包不支持解壓縮" "0" - Set_back - ;; - esac - echo_log "${apkfile##*/}解壓縮" && [[ -f $Backup_folder/nmsl.apk ]] && cp -r "$Backup_folder/nmsl.apk" "$TMPDIR" + if [[ $name3 != "" ]]; then + if [[ $(pm path "$name") = "" ]]; then + apkfile="$(find "$Backup_folder" -maxdepth 1 -name "apk.*" -type f 2>/dev/null)" + if [[ $apkfile != "" ]]; then + rm -rf "$TMPDIR"/* + case ${apkfile##*.} in + lz4) pv "$apkfile" | tar -I lz4 -xmpf - -C "$TMPDIR" ;; + zst) pv "$apkfile" | tar -I zstd -xmpf - -C "$TMPDIR" ;; + tar) pv "$apkfile" | tar -xmpf - -C "$TMPDIR" ;; + *) + echoRgb "${apkfile##*/} 壓縮包不支持解壓縮" "0" + Set_back + ;; + esac + echo_log "${apkfile##*/}解壓縮" && [[ -f $Backup_folder/nmsl.apk ]] && cp -r "$Backup_folder/nmsl.apk" "$TMPDIR" + else + echoRgb "你的Apk壓縮包離家出走了,可能備份後移動過程遺失了\n -解決辦法手動安裝Apk後再執行恢復腳本" "0" + fi + if [[ $result = 0 ]]; then + case $(find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | wc -l) in + 1) + echoRgb "恢復普通apk" "2" + pm install -i com.android.vending --user 0 -r "$TMPDIR"/*.apk >/dev/null 2>&1 + echo_log "Apk安裝" + ;; + 0) + echoRgb "$TMPDIR中沒有apk" "0" + ;; + *) + echoRgb "恢復split apk" "2" + b="$(pm install-create -i com.android.vending --user 0 | grep -Eo '[0-9]+')" + if [[ -f $TMPDIR/nmsl.apk ]]; then + pm install --user 0 -r "$TMPDIR/nmsl.apk" >/dev/null 2>&1 + echo_log "nmsl.apk安裝" + fi + find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f | grep -v 'nmsl.apk' | while read; do + pm install-write "$b" "${REPLY##*/}" "$REPLY" >/dev/null 2>&1 + echo_log "${REPLY##*/}安裝" + done + pm install-commit "$b" >/dev/null 2>&1 + echo_log "split Apk安裝" + ;; + esac + fi else - echoRgb "你的Apk壓縮包離家出走了,可能備份後移動過程遺失了\n -解決辦法手動安裝Apk後再執行恢復腳本" "0" - fi - if [[ $result = 0 ]]; then - case $(find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | wc -l) in - 1) - echoRgb "恢復普通apk" "2" - pm install -i com.android.vending --user 0 -r "$TMPDIR"/*.apk >/dev/null 2>&1 - echo_log "Apk安裝" - ;; - 0) - echoRgb "$TMPDIR中沒有apk" "0" - ;; - *) - echoRgb "恢復split apk" "2" - b="$(pm install-create -i com.android.vending --user 0 | grep -Eo '[0-9]+')" - if [[ -f $TMPDIR/nmsl.apk ]]; then - pm install --user 0 -r "$TMPDIR/nmsl.apk" >/dev/null 2>&1 - echo_log "nmsl.apk安裝" - fi - find "$TMPDIR" -maxdepth 1 -name "*.apk" -type f | grep -v 'nmsl.apk' | while read; do - pm install-write "$b" "${REPLY##*/}" "$REPLY" >/dev/null 2>&1 - echo_log "${REPLY##*/}安裝" - done - pm install-commit "$b" >/dev/null 2>&1 - echo_log "split Apk安裝" - ;; - esac + echoRgb "存在當前系統中略過安裝Apk" "2" fi else - echoRgb "存在當前系統中略過安裝Apk" "2" + echoRgb "$name2是系統應用" "3" fi if [[ $(pm path "$name") != "" ]]; then #停止應用 @@ -789,7 +827,12 @@ Restore2) wait && exit ;; Restore3) - app_details="$MODDIR/app_details" + echoRgb "點錯了?這是恢復自定義資料夾腳本 如果你是要恢復應用那你就點錯了\n -音量上繼續恢復自定義資料夾,音量下離開腳本" "2" + get_version "恢復自定義資料夾" "離開腳本" && [[ "$branch" = false ]] && exit 0 + mediaDir="$MODDIR/Media" + [[ ! -d $mediaDir ]] && echoRgb "媒體資料夾不存在" "0" && exit 2 + txt="$MODDIR/mediaList.txt" + [[ ! -f $txt ]] && echoRgb "請執行\"DumpName.sh\"獲取媒體列表再來恢復" "0" && exit 2 #記錄開始時間 starttime1="$(date -u "+%s")" echo_log() { @@ -801,31 +844,32 @@ Restore3) } Release_data() { tar_path="$1" - FILE_NAME="${tar_path##*/}" - FILE_NAME2="${FILE_NAME%%.*}" - echoRgb "恢復$FILE_NAME2數據" "3" && usertar="1" - case ${FILE_NAME##*.} in - lz4) - pv "$1" | tar -I lz4 -xPpf - - Set_back - ;; - zst) pv "$1" | tar -I zstd -xPpf - ;; - tar) pv "$1" | tar -xPpf - ;; - *) ( - echoRgb "$FILE_NAME 壓縮包不支持解壓縮" "0" - Set_back - ) ;; - esac - echo_log "$FILE_NAME 解壓縮($FILE_NAME2)" - [[ $result = 0 ]] && [[ -f $app_details ]] && echoRgb "解壓路徑↓\n -$(cat "$app_details" | awk "/${FILE_NAME2}path/"'{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g')" "2" + if [[ -f $tar_path ]]; then + FILE_NAME="${tar_path##*/}" + FILE_NAME2="${FILE_NAME%%.*}" + echoRgb "恢復$FILE_NAME2數據" "3" + if [[ ${FILE_NAME##*.} = tar ]]; then + pv "$1" | tar -xPpf - + else + echoRgb "$FILE_NAME 壓縮包不支持解壓縮" "0" + Set_back + fi + echo_log "$FILE_NAME 解壓縮($FILE_NAME2)" + app_details="$mediaDir/app_details" + [[ $result = 0 ]] && [[ -f $app_details ]] && echoRgb "解壓路徑↓\n -$(cat "$app_details" | awk "/${FILE_NAME2}path/"'{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g')" "2" + else + echoRgb "$tar_path壓縮包不存在" "0" + fi } starttime1="$(date -u "+%s")" A=1 - B="$(find "$MODDIR" -maxdepth 1 -name "*.tar*" -type f | wc -l)" - find "$MODDIR" -maxdepth 1 -name "*.tar*" -type f | while read; do + B="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" + [[ $B = "" ]] && echoRgb "mediaList.txt壓縮包名為空或是被注釋了\n -請執行\"DumpName.sh\"獲取列表再來恢復" "0" && exit 1 + while [[ $A -le $B ]]; do + name1="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${A}p" | awk '{print $1}')" starttime2="$(date -u "+%s")" echoRgb "恢復第$A/$B個壓縮包 剩下$((B - A))個" "3" - Release_data "$REPLY" + Release_data "$mediaDir/$name1" endtime 2 "$FILE_NAME2恢複" "2" && echoRgb "完成$((A * 100 / B))%" "3" && echoRgb "____________________________________" && let A++ done endtime 1 "恢複結束" @@ -850,16 +894,47 @@ com.android.chrome" nametxt="$txtpath/appList.txt" [[ ! -e $nametxt ]] && echo '#不需要備份的應用請在開頭注釋# 比如#酷安 xxxxxxxx\n#不需要備份數據比如酷安! xxxxxxxx應用名後方加一個驚嘆號即可 注意是應用名不是包名' >"$nametxt" echo >>"$nametxt" + isBoolean "$Lo" "LO" && Lo="$nsx" + if [[ $Lo = false ]]; then + isBoolean "$system_name" "system_name" && system_name="$nsx" + else + echoRgb "列出系統應用?\n -音量上列出,音量下不列出" "2" + get_version "列出" "不列出" && system_name="$branch" + fi echoRgb "請勿關閉腳本,等待提示結束" bn=118 rm -rf "$MODDIR/tmp" starttime1="$(date -u "+%s")" echoRgb "提示!因為系統自帶app(位於data分區或是可卸載預裝應用)備份恢復可能存在問題\n -所以不會輸出..但是檢測為Xposed類型包名將輸出\n -如果提示不是Xposed但他就是Xposed可能為此應用元數據不符合規範導致" "0" xposed_name="$(appinfo -o pn -xm)" - #appinfo -o pn -pn $system $launcher_app -3 | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u>>k Apk_info="$(appinfo -sort-i -d " " -o ands,pn -pn $system $launcher_app -3 2>/dev/null | egrep -v 'ice.message|com.topjohnwu.magisk' | sort -u)" Apk_Quantity="$(echo "$Apk_info" | wc -l)" LR="1" + if [[ $system_name = true ]]; then + echoRgb "第三方+系統應用\n -列出系統應用....." "2" + echoRgb "警告!系統應用將不備份apk僅備份數據\n -請勿跨系統恢復防止出現問題,原生系統則不受此限制\n -另外腳本會自動檢測系統應用是否存在,負責不進行數據恢復" "0" + nametxt2="$txtpath/systemList.txt" + Apk_info2="$(appinfo -sort-i -d " " -o ands,pn -s 2>/dev/null | egrep -v "$(echo $system | sed 's/ /\|/g')")" + Apk_Quantity2="$(echo "$Apk_info2" | wc -l)" + echo "$Apk_info2" | sed 's/\///g ; s/\://g ; s/(//g ; s/)//g ; s/\[//g ; s/\]//g ; s/\-//g ; s/!//g' | while read; do + [[ $bn -ge 229 ]] && bn=118 + app_1=($REPLY $REPLY) + [[ $i = "" ]] && i="0" + [[ $Q = "" ]] && Q="0" + if [[ $(cat "$nametxt2" 2>/dev/null | cut -f2 -d ' ' | egrep "^${app_1[1]}$") != ${app_1[1]} ]]; then + echo "$REPLY system" >>"$nametxt2" && [[ ! -e $MODDIR/tmp ]] && touch "$MODDIR/tmp" + echoRgb "$REPLY($bn)" + let i++ + else + let Q++ + fi + [[ $LR = $Apk_Quantity2 ]] && [[ -e $MODDIR/tmp ]] && echoRgb "\n -系統apk數量=\"$Apk_Quantity2\"\n -存在列表中=\"$Q\"\n -輸出=\"$i\"" && LR="1" + let bn++ LR++ + done + else + echoRgb "僅第三方" "2" + fi + echoRgb "列出第三方應用......." "2" echo "$Apk_info" | sed 's/\///g ; s/\://g ; s/(//g ; s/)//g ; s/\[//g ; s/\]//g ; s/\-//g ; s/!//g' | while read; do [[ $bn -ge 229 ]] && bn=118 app_1=($REPLY $REPLY) @@ -872,7 +947,7 @@ com.android.chrome" *oneplus* | *miui* | *xiaomi* | *oppo* | *flyme* | *meizu* | com.android.soundrecorder | com.mfashiongallery.emag | com.mi.health | *coloros*) if [[ $(echo "$xposed_name" | grep -w "${app_1[1]}") = ${app_1[1]} ]]; then echoRgb "${app_1[2]}為Xposed模塊 進行添加" "0" - echo "$REPLY" >>"$nametxt" && [[ ! -e $MODDIR/tmp ]] && touch "$MODDIR/tmp" + echo "$REPLY user" >>"$nametxt" && [[ ! -e $MODDIR/tmp ]] && touch "$MODDIR/tmp" let i++ rd++ else echoRgb "${app_1[2]}非Xposed模塊 忽略輸出" "0" @@ -880,7 +955,7 @@ com.android.chrome" fi ;; *) - echo "$REPLY" >>"$nametxt" && [[ ! -e $MODDIR/tmp ]] && touch "$MODDIR/tmp" + echo "$REPLY user" >>"$nametxt" && [[ ! -e $MODDIR/tmp ]] && touch "$MODDIR/tmp" echoRgb "$REPLY($bn)" let i++ ;; @@ -889,7 +964,7 @@ com.android.chrome" let Q++ fi if [[ $LR = $Apk_Quantity ]]; then - [[ -e $MODDIR/tmp ]] && echoRgb "\n -apk數量=\"$Apk_Quantity\"\n -已過濾=\"$rc\"\n -xposed=\"$rd\"\n -存在列表中=\"$Q\"\n -輸出=\"$i\"" + [[ -e $MODDIR/tmp ]] && echoRgb "\n -第三方apk數量=\"$Apk_Quantity\"\n -已過濾=\"$rc\"\n -xposed=\"$rd\"\n -存在列表中=\"$Q\"\n -輸出=\"$i\"" fi let bn++ LR++ done @@ -897,10 +972,10 @@ com.android.chrome" cat "$nametxt" | grep -v "#" | while read; do name=($REPLY $REPLY) { - if [[ $REPLY != "" && $(pm path "${name[1]}" | cut -f2 -d ':') = "" ]]; then - echoRgb "${name[2]}不存在系統,從列表中刪除" - echo "$(cat "$nametxt" | sed -e "s/$REPLY//g ; /^$/d")" >"$nametxt" - fi + if [[ $REPLY != "" && $(pm path "${name[1]}" | cut -f2 -d ':') = "" ]]; then + echoRgb "${name[2]}不存在系統,從列表中刪除" + echo "$(cat "$nametxt" | sed -e "s/$REPLY//g ; /^$/d")" >"$nametxt" + fi } & done echo "$(cat "$nametxt" | sed -e '/^$/d')" >"$nametxt" @@ -910,4 +985,123 @@ com.android.chrome" [[ ! -e $MODDIR/tmp ]] && echoRgb "無新增應用" || echoRgb "輸出包名結束 請查看$nametxt" rm -rf "$MODDIR/tmp" ;; +backup_media) + [[ ! -f $MODDIR/backup_settings.conf ]] && echo "backup_settings.conf配置遺失" && EXIT="true" + [[ $EXIT = true ]] && exit 1 + . "$MODDIR/backup_settings.conf" + { + script="${0##*/}" + if [[ $script != "" ]]; then + pgrep -f "tar" | while read; do + kill -KILL " $REPLY" >/dev/null + done + fi + } & + PU="$(ls /dev/block/vold | grep public)" + if [[ $Output_path != "" ]]; then + [[ ${Output_path: -1} = / ]] && Output_path="${Output_path%?}" + Backup="$Output_path/Backup_$Compression_method" + outshow="使用自定義目錄" + else + if [[ $APP_ENV = 1 ]]; then + Backup="/storage/emulated/0/Backup_$Compression_method" + outshow="沒有設定備份目錄 使用默認路徑" + else + Backup="$MODDIR/Backup_$Compression_method" + outshow="使用當前路徑作為備份目錄" + fi + fi + if [[ $PU != "" ]]; then + [[ -f /proc/mounts ]] && PT="$(cat /proc/mounts | grep "$PU" | awk '{print $2}')" + if [[ -d $PT ]]; then + if [[ $(echo "$MODDIR" | grep -oE "^${PT}") != "" || $USBdefault = true ]]; then + hx="USB" + else + echoRgb "檢測到隨身碟 是否在隨身碟備份\n -音量上是,音量下不是" "2" + get_version "選擇了隨身碟備份" "選擇了本地備份" + [[ $branch = true ]] && hx="USB" + fi + if [[ $hx = USB ]]; then + Backup="$PT/Backup_$Compression_method" + data="/dev/block/vold/$PU" + mountinfo="$(df -T "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-4)}')" + case $mountinfo in + vfat | fuseblk | exfat | NTFS | ext4 | f2fs) + outshow="於隨身碟備份" + ;; + *) + echoRgb "隨身碟檔案系統$mountinfo不支持超過單檔4GB\n -請格式化為exfat" "0" + exit 1 + ;; + esac + fi + fi + else + echoRgb "沒有檢測到隨身碟於本地備份" "0" + fi + rm -rf "$Backup/STOP" + #分區詳細 + if [[ $(echo "$Backup" | egrep -o "^/storage/emulated") != "" ]]; then + Backup_path="/data" + else + Backup_path="${Backup%/*}" + fi + echoRgb "$hx備份資料夾所使用分區統計如下↓\n -$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-3),$(NF-2),$(NF-1),$(NF)}' | sed 's/G//g' | awk 'END{print "總共:"$1"G已用:"$2"G剩餘:"$3"G使用率:"$4}')檔案系統:$(df -T "$Backup_path" | sed -n 's|% /.*|%|p' | awk '{print $(NF-4)}')\n -備份目錄輸出位置↓\n -$Backup" + echoRgb "$outshow" "2" + #分區佔用信息 + partition_info() { + Occupation_status="$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-1),$(NF)}')" + lxj="$(echo "$Occupation_status" | awk '{print $2}' | sed 's/%//g')" + } + Backup_data() { + unset zsize + [[ -f $app_details ]] && Size="$(cat "$app_details" | awk "/$1Size/"'{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g')" + data_path="$2" + if [[ -d $data_path ]]; then + if [[ $Size != $(du -ks "$data_path" | awk '{print $1}') ]]; then + partition_info + [[ $lxj -ge 95 ]] && echoRgb "$hx空間不足,達到$lxj%" "0" && exit 2 + echoRgb "備份$1數據" + tar --exclude="Backup_"* --exclude="${data_path##*/}/cache" -cPpf - "$data_path" 2>/dev/null | pv >"$Backup_folder/$1.tar" + echo_log "備份$1數據" + if [[ $result = 0 ]]; then + echo "#$1Size=\"$(du -ks "$data_path" | awk '{print $1}')\"" >>"$app_details" + [[ $2 != $(cat "$app_details" | awk "/$1path/"'{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g') ]] && echo "#$1path=\"$2\"" >>"$app_details" + fi + else + echoRgb "$1數據無發生變化 跳過備份" "2" + fi + else + if [[ -f $data_path ]]; then + echoRgb "$1是一個文件 不支持備份" "0" + else + echoRgb "$1數據不存在跳過備份" "2" + fi + fi + partition_info + } + A=1 + B="$(echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" + if [[ $B != "" ]]; then + starttime1="$(date -u "+%s")" + Backup_folder="$Backup/Media" + [[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder" + [[ ! -f $Backup/Restoremedia.sh ]] && cp -r "$script_path/restore3" "$Backup/Restoremedia.sh" + app_details="$Backup_folder/app_details" + [[ -f $app_details ]] && . "$app_details" + [[ ! -f $Backup/mediaList.txt ]] && echo "#不需要恢復的資料夾請在開頭注釋# 比如#媒體" > "$Backup/mediaList.txt" + echo "$Custom_path" | grep -v "#" | sed -e '/^$/d' | while read; do + echoRgb "備份第$A/$B個資料夾 剩下$((B - A))個" "3" + starttime2="$(date -u "+%s")" + Backup_data "${REPLY##*/}" "$REPLY" + [[ $result = 0 ]] && echo "${REPLY##*/}" >> "$Backup/mediaList.txt" + endtime 2 "${REPLY##*/}備份" "1" + echoRgb "完成$((A * 100 / B))% $hx$(echo "$Occupation_status" | awk 'END{print "剩餘:"$1"使用率:"$2}')" "2" && echoRgb "____________________________________" && let A++ + done + echoRgb "目錄↓↓↓\n -$Backup_folder" + endtime 1 "自定義備份" + else + echoRgb "自定義路徑為空 無法備份" "0" + fi + ;; esac diff --git a/tools/script/restore3 b/tools/script/restore3 index 861e794..86ba7c4 100644 --- a/tools/script/restore3 +++ b/tools/script/restore3 @@ -1,7 +1,7 @@ -if [ -f "${0%/*/*}/tools/bin/tools.sh" ]; then +if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="Restore3" - . "${0%/*/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" else - echo "${0%/*/*}/tools/bin/tools.sh遺失" + echo "${0%/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file