aboutsummaryrefslogtreecommitdiffstats
path: root/bin/androidbackup.sh
blob: ee95f010b5c45fe228b811538a6355bf2ce30f46 (plain)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/bin/bash

if [ -e $HOME/bin/functions.sh ]
then
  . $HOME/bin/functions.sh
else
  exit 0
fi

## CONFIGURATION
ADB=adb

function help()
{
  echo "Android data backup/restore"
  echo "Usage:"
  echo -e "\t [backup|restoredata|restoreapk] [device]"
  exit 0
}

function _backup()
{
  adb -s $DEVICE pull /data/system/packages.list .
  cat packages.list | while read line
  do
    read name dir <<< $(echo $line | awk '{ print $1 " " $4 }')
    #echo $dir
    apk=$($ADB shell bash -c "ls /data/app/${name}* 2> /dev/null")
    if [ -n $exists ]
    then
      echo $name $apk
    else
      echo LALALALALAAA $name
    fi
    echo ""
  done
}

function _restoreapk() {
  mkdir -p done skipped
  apps=$(ls -1 | grep -c apk)
  num=1
  for i in *.apk
  do
    if [ $i = "done" -o $i = "skipped" ]
    then
      continue
    fi
    echo_green "Application $i ($num/$apps)"

    name=$(echo $i | sed 's/-[0-9].apk//')
    existing=$($ADB shell sh -c "ls /data/app*/${name}* 2> /dev/null")
    echo $existing
    if [ -n "$existing" ]
    then
      echo $i already installed
      mv $i skipped
      continue
    fi
    echo "  Restore apk? [1|0] (default 1)"
    echo -en "  "
    read inst
    inst=${inst:=1}

    if [ $inst -eq 1 ]
    then
      $ADB install $i
      mv $i done
    else
      echo -e "  Skipping...\n\n"
      mv $i skipped
    fi
    let num=num+1
  done
}

function _restoredata()
{
  mkdir -p done skipped
  apps=$(ls -l | grep -v skipped | grep -v done | grep -c '^d')
  num=1
  for i in *
  do
    if [ $i = "done" -o $i = "skipped" ]
    then
      continue
    fi

    echo_green "Application $i ($num/$apps)"
    if [ $(adb shell ls -l /data/data | grep -c $i) -lt 1 ]
    then
      echo_red "  not installed, skipping.\n\n"
      mv $i skipped
      continue
    fi

    echo "  Restore data? [1|0] (default 0)"
    echo -en "  "
    read inst
    inst=${inst:=0}

    if [ $inst -eq 1 ]
    then
      if [ $i = "com.android.providers.telephony" ]
      then
        echo -e "SMS/CALLS"
        $ADB push $i/databases/mmssms.db /data/data/$i/databases
        $ADB shell chmod 660 /data/data/$i/databases/mmssms.db
        $ADB shell toolbox chown 1001:1001 /data/data/$i/databases/mmssms.db
        $ADB shell killall system_server
        mv $i done
      else
        own=$($ADB shell ls -l /data/data/ | grep  $i | head -n 1 | awk '{ print $3}')
        echo -e "  User $own\n\n"
        mute $ADB push $i /data/data/$i
        mute $ADB shell chown $own:$own /data/data/$i/*
        mute $ADB shell chown $own:$own /data/data/$i/*/*
        mute $ADB shell chown $own:$own /data/data/$i/*/*/*
        mv $i done
      fi
    else
      echo -e "  Skipping...\n\n"
      mv $i skipped
    fi
    let num=num+1
  done
}

case $1 in
  backup)
    _backup
    ;;
  restoredata)
    _restoredata
    ;;
  restoreapk)
    _restoreapk
    ;;
  *)
    help
    exit 0
    ;;
esac