Files
backup_script/tools/META-INF/com/google/android/update-binary
2021-10-22 22:59:04 +08:00

243 lines
9.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/sbin/sh
#初始化
OUTFD="$2"
ZIPFILE="$3"
#设置字符输出
ui_print() {
echo "ui_print "$@"" > /proc/self/fd/$OUTFD
}
#设置工作目录
MODDIR=/dev/backup
#安装二进制文件
rm -rf "$MODDIR"
mkdir -p "$MODDIR"
unzip -o "$ZIPFILE" 'apk/Message.apk' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/pv' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/bin.sh' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/busybox' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/appinfo' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/appinfo.dex' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/tar' -d "$MODDIR"
unzip -o "$ZIPFILE" 'bin/zstd' -d "$MODDIR"
unzip -o "$ZIPFILE" 'script/restore' -d "$MODDIR"
unzip -o "$ZIPFILE" 'script/restore2' -d "$MODDIR"
unzip -o "$ZIPFILE" 'script/Get_DirName' -d "$MODDIR"
unzip -o "$ZIPFILE" 'script/應用列表.txt' -d "$MODDIR"
unzip -o "$ZIPFILE" 'script/backup_settings.conf' -d "$MODDIR"
chmod -R 0755 "$MODDIR/bin/"
busybox="$MODDIR/bin/busybox"
mkdir -p "$MODDIR/xbin"
"$busybox" --list | while read; do
case $REPLY in
tar) ;;
*)
ln -s "$busybox" "$MODDIR/xbin/$REPLY"
;;
esac
done
isBoolean() {
nsx="$1"
if [[ $1 = 1 ]];then
nsx=true
elif [[ $1 = 0 ]];then
nsx=false
else
ui_print "script/backup_settings.conf填寫錯誤" && exit 2
fi
}
Set_back() {
return 1
}
#设置环境
export PATH="$MODDIR/xbin:$MODDIR/bin:$PATH"
. "$MODDIR/script/backup_settings.conf"
i=1
txt="$MODDIR/script/應用列表.txt"
isBoolean "$Splist" && Splist="$nsx"
isBoolean "$Backup_obb_data" && Backup_obb_data="$nsx"
isBoolean "$Backup_user_data" && Backup_user_data="$nsx"
[[ ! -f $txt ]] && ui_print "$txt缺少" && exit 1
r="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')"
[[ $r = "" ]] && ui_print "爬..應用列表.txt是空的備份個鬼" && exit 0
path="/data/media/0/Android"
path2="/data/data"
data="/data"
ui_print $(df -h "$data")
ui_print $(df -h "$data" | awk 'END{print "剩餘:"$3"使用率:"$4}')
Backup="/data/media/0/TWRP/Backup_$Compression_method"
[[ ! -d $Backup ]] && mkdir -p "$Backup" || rm -rf "$Backup"/*
[[ ! -f $Backup/應用列表.txt ]] && echo "#不需要恢復還原的應用請在開頭注釋# 比如#xxxxxxxx 酷安" >"$Backup/應用列表.txt"
[[ ! -d $Backup/bin ]] && cp -r "$MODDIR/bin" "$Backup" && cp -r "$MODDIR/apk" "$Backup/bin"
[[ ! -f $Backup/還原備份.sh ]] && cp -r "$MODDIR/script/restore" "$Backup/還原備份.sh"
[[ ! -f $Backup/掃描資料夾名.sh ]] && cp -r "$MODDIR/script/Get_DirName" "$Backup/掃描資料夾名.sh"
filesize="$(du -ks "$Backup" | awk '{print $1}')"
#調用二進制
Quantity=0
#顯示執行結果
echo_log() {
if [[ $? = 0 ]]; then
ui_print "$1成功" && result=0
else
ui_print "$1備份失敗,過世了" && result=1
fi
}
#檢測apk狀態進行備份
Backup_apk() {
#創建APP備份文件夾
[[ ! -d $Backup_folder ]] && mkdir -p "$Backup_folder"
#備份apk
ui_print "$1"
[[ $lxj -ge 95 ]] && ui_print "$data空間不足,達到$lxj%" && exit 2
rm -rf "$Backup_folder"/*.apk
[[ $(cat "$Backup/應用列表.txt" | grep -v "#" | sed -e '/^$/d' | awk '{print $2}' | grep -w "^${name}$" | head -1) = "" ]] && echo "$name2 $name" >>"$Backup/應用列表.txt"
find "$apk_path" -maxdepth 1 -name "*.apk" -type f | 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'}')"
ui_print "${path##*/} ${m_size}MB(${k_size}KB)"
done
(cd "$apk_path"
case $Compression_method in
tar|TAR|Tar) tar -cf "$Backup_folder/apk.tar" *.apk ;;
zstd|Zstd|ZSTD) tar -cf - *.apk | zstd -r -T0 -6 -q >"$Backup_folder/apk.tar.zst" ;;
esac)
echo_log "備份$apk_number個Apk"
if [[ $result = 0 ]]; then
[[ $PackageName = "" ]] && echo "PackageName=\"$name\"" >>"$app_details"
[[ $ChineseName = "" ]] && echo "ChineseName=\"$name2\"" >>"$app_details"
[[ ! -f $Backup_folder/還原備份.sh ]] && cp -r "$MODDIR/script/restore2" "$Backup_folder/還原備份.sh"
fi
if [[ $name = 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)"
ui_print "刪除文件:${OldFile%/*/*}"
rm -rf "${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
[[ $name = bin.mt.plus && -f $apk_path/base.apk && ! -f $Backup/$name2.apk ]] && cp -r "$apk_path/base.apk" "$Backup/$name2.apk"
unset PackageName ChineseName ; D=1
}
#檢測數據位置進行備份
Backup_data() {
unset zsize
case $1 in
user) data_path="$path2/$name" ;;
data) data_path="$path/$1/$name" ;;
obb) data_path="$path/$1/$name" ;;
*) [[ -f $app_details ]] && data_path="$2" && Compression_method=tar && zsize=1 ;;
esac
if [[ -d $data_path ]]; then
[[ $lxj -ge 95 ]] && ui_print "$data空間不足,達到$lxj%" && exit 2
ui_print "備份$1數據"
case $1 in
user)
case $Compression_method in
tar|Tar|TAR) tar --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" -cpf "$Backup_folder/$1.tar" -C "${data_path%/*}" "${data_path##*/}" 2>/dev/null ;;
zstd|Zstd|ZSTD) tar --exclude="${data_path##*/}/.ota" --exclude="${data_path##*/}/cache" --exclude="${data_path##*/}/lib" -cpf - -C "${data_path%/*}" "${data_path##*/}" 2>/dev/null | zstd -r -T0 -6 -q >"$Backup_folder/$1.tar.zst" ;;
*) ui_print "$Compression_method為不支持的壓縮算法" && rm -rf "$Backup" && exit 2 ;;
esac ;;
*)
case $Compression_method in
tar|Tar|TAR) tar --exclude="Backup_"* -cPpf "$Backup_folder/$1.tar" "$data_path" 2>/dev/null ;;
zstd|Zstd|ZSTD) tar --exclude="Backup_"* -cPpf - "$data_path" 2>/dev/null | zstd -r -T0 -6 -q >"$Backup_folder/$1.tar.zst" ;;
*) ui_print "$Compression_method為不支持的壓縮算法" && rm -rf "$Backup" && exit 2 ;;
esac ;;
esac
echo_log "備份$1數據"
else
ui_print "$1數據不存在跳過備份"
fi
}
endtime() {
#計算總體切換時長耗費
case $1 in
1) starttime="$starttime1" ;;
2) starttime="$starttime2" ;;
esac
endtime="$(date -u "+%s")"
duration="$(echo "$((endtime - starttime))" | awk '{t=split("60 秒 60 分 24 時 999 天",a);for(n=1;n<t;n+=2){if($1==0)break;s=$1%a[n]a[n+1]s;$1=int($1/a[n])}print s}')"
[[ $duration != "" ]] && ui_print "$2用時:$duration" || ui_print "$2用時:0秒"
}
bn=37
#開始循環$txt內的資料進行備份
#記錄開始時間
starttime1="$(date -u "+%s")"
{
while [[ $i -le $r ]]; do
ui_print "備份第$i個應用 總共$r個 剩下$((r-i))個應用"
name="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')"
name2="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')"
lxj="$(df -h "$data" | awk 'END{print $4}' | sed 's/%//g')"
if [[ $name2 = *! || $name2 = * ]]; then
name2="$(echo "$name2" | sed 's/!//g ; s///g')"
ui_print "跳過備份$name2 所有數據"
No_backupdata=1
else
[[ $No_backupdata != "" ]] && unset No_backupdata
fi
Backup_folder="$Backup/${name2}[${name}]"
app_details="$Backup_folder/app_details"
[[ -f $app_details ]] && . "$app_details"
[[ $name = "" ]] && ui_print "警告! 應用列表.txt應用包名獲取失敗可能修改有問題" && exit 1
apk_path="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $3}')"
if [[ -d $apk_path ]]; then
starttime2="$(date -u "+%s")"
ui_print "備份$name2 ($name)"
[[ $name = com.tencent.mobileqq ]] && ui_print "QQ可能恢復備份失敗或是丟失聊天記錄請自行用你信賴的軟件備份"
[[ $name = com.tencent.mm ]] && ui_print "WX可能恢復備份失敗或是丟失聊天記錄請自行用你信賴的軟件備份"
apk_number="$(find "$apk_path" -maxdepth 1 -name "*.apk" -type f 2>/dev/null | wc -l)"
if [[ $apk_number = 1 ]]; then
if [[ $Splist = false ]]; then
Backup_apk "非Split Apk"
else
ui_print "非Split Apk跳過備份"
unset D
fi
else
Backup_apk "Split Apk支持備份"
fi
if [[ $D != "" && $result = 0 && $No_backupdata = "" ]]; then
if [[ $Backup_obb_data = true ]]; then
#備份data數據
Backup_data "data"
#備份obb數據
Backup_data "obb"
fi
#備份user數據
[[ $Backup_user_data = true ]] && Backup_data "user"
fi
endtime 2 "$name2備份"
ui_print "完成$((i*100/r))% $hx$(df -h "$data" | awk 'END{print "剩餘:"$3"使用率:"$4}')"
else
ui_print "$name2[$name]不在安裝列表,備份個寂寞?"
fi
ui_print "
"
let i++
done
#計算出備份大小跟差異性
filesizee="$(du -ks "$Backup" | awk '{print $1}')"
dsize="$(($((filesizee - filesize)) / 1024))"
ui_print "備份資料夾路徑:$Backup"
ui_print "備份資料夾總體大小$(du -ksh "$Backup" | awk '{print $1}')"
if [[ $dsize -gt 0 ]]; then
if [[ $((dsize / 1024)) -gt 0 ]]; then
ui_print "本次備份: $((dsize / 1024))gb"
else
ui_print "本次備份: ${dsize}mb"
fi
else
ui_print "本次備份: $(($((filesizee - filesize)) * 1000 / 1024))kb"
fi
ui_print "批量備份完成"
endtime 1 "批量備份開始到結束"
rm -rf "$MODDIR"
exit 0
}&