/
restore_apps.sh
executable file
·105 lines (82 loc) · 2.4 KB
/
restore_apps.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/bin/bash
# License; Apache-2
# Originally from Raphael Moll
# Tested/Fixed for Android O by marc_soft@merlins.org 2017/12
# improved / completly reworked to play nice with Android 9 / 10 by anddisa@gmail.com 2019/12
curr_dir="$(dirname "$0")"
. "$curr_dir/functions.sh"
set -e # fail early
OLDIFS="$IFS"
cat <<EOF
WARNING: restoring random system apps is quite likely to make things worse
unless you are copying between 2 identical devices.
You probably want to mv backupdir/app_{com.android,com.google}* /backup/location
This will cause this script not to try and restore system app data
EOF
sleep 5
DIR="$1"
if [[ ! -d "$DIR" ]]; then
echo "Usage: $0 <data-dir>"
echo "Must be created with ./backup_apps.sh"
exit 2
fi
shift
checkPrerequisites
updateBusybox
lookForAdbDevice
checkRootType
pushBusybox
cd $DIR
if [ $# -gt 0 ]; then
APPS="$@"
echo "## Push apps: $APPS"
else
APPS=$(echo app_*)
echo "## Push all apps in $DIR: $APPS"
fi
echo "## Installing apps"
for appPackage in $APPS
do
APP=`tar xvfz $appPackage -C /tmp/ --wildcards "*.apk" | sed 's/\.\///'`
echo $appPackage
echo $APP
echo "Installing $APP"
pushd /tmp
error=`$A install-multiple -r -t ${APP}`
echo "error=$error"
rm *.apk
popd
appPrefix=$(echo $appPackage | sed 's/app_//' | sed 's/\.tar\.gz//')
echo $appPrefix
allApps=`$A shell cmd package list packages -f`
#echo $allApps
appConfig=$(echo $allApps | tr " " "\n" | grep $appPrefix)
echo "$appConfig"
#dataDir=`echo $appConfig | sed 's/package://' | rev | cut -d "=" -f1 | rev`
dataDir=$appPrefix
echo $dataDir
echo
echo "## Now installing app data"
$AS "pm clear $appPrefix"
sleep 1
echo "Attempting to restore data for $APP"
# figure out current app user id
L=( $($AS ls -d -l /data/data/$dataDir 2>/dev/null) ) || :
# drwx------ 10 u0_a240 u0_a240 4096 2017-12-10 13:45 .
# => return u0_a240
ID=${L[2]}
if [[ -z $ID ]]; then
echo "Error: $APP still not installed"
exit 2
fi
echo "APP User id is $ID"
dataPackage=`echo $appPackage | sed 's/app_/data_/'`
echo "mkdir -p /dev/tmp/$dataDir"
$AS "mkdir -p /dev/tmp/$dataDir"
cat $dataPackage | pv -trab | $AS "/dev/busybox tar -xzpf - -C /data/data/$dataDir"
echo "$AS chown -R $ID.$ID /data/data/$dataDir"
$AS "chown -R $ID.$ID /data/data/$dataDir"
done
echo "script exiting after adb install will want to fix securelinux perms with: restorecon -FRDv /data/data"
$AS "restorecon -FRDv /data/data"
cleanup