앱의 디버그 버전의 경우 명령 adb exec-out run-as xxx.yyy.zzz cat somefile > somefile
을 사용하여 단일 파일을 추출하는 것이 매우 편리 합니다. 그러나 여러 파일에 대해 여러 번 수행해야합니다. 다음은 디렉토리를 추출하는 데 사용하는 간단한 스크립트입니다.
#!/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
도움이 되길 바랍니다. 이 스크립트는 gist 에서도 사용할 수 있습니다 .
일반적인 사용법은
$ ./exec_out.sh -p com.example.myapplication -d databases
그런 다음 앱 데이터베이스 디렉토리 () 아래의 모든 파일 /data/data/com.example.myapplication/databases
을 현재 디렉토리로 추출합니다 .