Đối với phiên bản gỡ lỗi của ứng dụng, rất tiện lợi khi sử dụng lệnh adb exec-out run-as xxx.yyy.zzz cat somefile > somefile
để giải nén một tệp duy nhất. Nhưng bạn phải thực hiện nhiều lần cho nhiều tệp. Đây là một script đơn giản tôi sử dụng để giải nén thư mục.
#!/bin/bash
P=
F=
D=
function usage()
{
echo "$(basename $0) [-f file] [-d directory] -p package"
exit 1
}
while getopts ":p:f:d:" opt
do
case $opt in
p)
P=$OPTARG
echo package is $OPTARG
;;
f)
F=$OPTARG
echo file is $OPTARG
;;
d)
D=$OPTARG
echo directory is $OPTARG
;;
\?)
echo Unknown option -$OPTARG
usage
;;
\:)
echo Required argument not found -$OPTARG
usage
;;
esac
done
[ x$P == x ] && {
echo "package can not be empty"
usage
exit 1
}
[[ x$F == x && x$D == x ]] && {
echo "file or directory can not be empty"
usage
exit 1
}
function file_type()
{
# use printf to avoid carriage return
__t=$(adb shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"")
echo $__t
}
function list_and_pull()
{
t=$(file_type $1)
if [ $t == d ]; then
for f in $(adb shell run-as $P ls $1)
do
# the carriage return output from adb shell should
# be removed
mkdir -p $(echo -e $1 |sed $'s/\r//')
list_and_pull $(echo -e $1/$f |sed $'s/\r//')
done
else
echo pull file $1
[ ! -e $(dirname $1) ] && mkdir -p $(dirname $1)
$(adb exec-out run-as $P cat $1 > $1)
fi
}
[ ! -z $D ] && list_and_pull $D
[ ! -z $F ] && list_and_pull $F
Hy vọng nó sẽ hữu ích. Tập lệnh này cũng có sẵn tại ý chính .
Cách sử dụng điển hình là
$ ./exec_out.sh -p com.example.myapplication -d databases
sau đó nó sẽ trích xuất tất cả các tệp trong thư mục cơ sở dữ liệu ứng dụng của bạn /data/data/com.example.myapplication/databases
, vào thư mục hiện tại.