루팅되지 않은 Android 장치에서 run-as
패키지 이름과 함께 명령을 사용하여 데이터베이스가 포함 된 데이터 폴더로 이동할 수 있습니다 . 대부분의 파일 형식은보기만으로 만족하지만 데이터베이스를 사용하는 경우 Android 장치에서 가져오고 싶습니다.
있는가 download
copy
또는 move
ADB 쉘의이 부분에서 명령은? 데이터베이스 파일을 다운로드하고 데이터베이스 브라우저를 사용하여 그 내용을보고 싶습니다.
여기에 한 가지 대답은 전체 애플리케이션 패키지를 압축 된 아카이브로 바꾸는 것이지만, 일단 이것이 완료되고 머신으로 이동되면 해당 아카이브를 추출하는 방법에 대한 더 이상의 대답이 없으므로 시작하기에 더 직접적인 솔루션이있을 때 저를 매우 잊혀지 게됩니다.
답변
user
Android의 설계 빌드 ( 부트 로더 를 잠금 해제하고 userdebug
또는 eng
소프트웨어로 휴대 전화를 플래시 할 때까지 휴대 전화에있는 것임 )는 내부 저장소에 대한 액세스를 제한 합니다. 모든 앱은 자체 파일에만 액세스 할 수 있습니다. 다행히하려하지 소프트웨어 개발자를위한 뿌리 휴대폰 구글이 액세스 할 수있는 방법을 제공합니다 내부 스토리지 의 디버깅 사용하여 패키지의 버전 run-as
명령을 사용합니다.
/data/data/debuggable.app.package.name/databases/file
Android 5.1 이상 기기에서 다운로드하려면 다음 명령어를 실행하세요.
adb exec-out run-as debuggable.app.package.name cat databases/file > file
아래의 폴더에 여러 파일을 한 번에 다운로드하려면 다음 /data/data/debuggable.app.package.name/
을 사용하십시오 tar
.
adb exec-out run-as debuggable.app.package.name tar c databases/ > databases.tar
adb exec-out run-as debuggable.app.package.name tar c shared_prefs/ > shared_prefs.tar
답변
수락 된 답변이 더 이상 작동하지 않습니다 (Android에서 차단 되었습니까?).
그래서 대신 이렇게했습니다.
> adb shell
shell $ run-as com.example.package
shell $ chmod 666 databases/file
shell $ exit ## exit out of 'run-as'
shell $ cp /data/data/package.name/databases/file /sdcard/
shell $ run-as com.example.package
shell $ chmod 600 databases/file
> adb pull /sdcard/file .
답변
디버그 응용 프로그램 에서 데이터베이스를 가져 오려는 사람 은 아래 절차를 사용할 수 있습니다.
- 장치 파일 탐색기 검색 및 열기
- 핸드셋을 선택한 다음
data/data
디렉토리 를 찾습니다.
- 이제 응용 프로그램 패키지를 찾고 데이터베이스 폴더로 이동하십시오. 거기에서 데이터베이스를 볼 수 있으며 마우스 오른쪽 버튼을 클릭하면 드라이브에 저장할 수있는 옵션이 표시됩니다.
답변
데이터베이스 덤프를위한 간단한 셸 스크립트를 게시했습니다.
여기에 설명 된 두 가지 고유 한 방법을 수행합니다.
- 먼저 다른 사용자가 파일에 액세스 할 수 있도록하고 장치에서 파일을 가져 오려고합니다.
- 실패하면 터미널을 통해 파일의 내용을 로컬 컴퓨터로 스트리밍합니다.
\r
일부 장치가 셸에 출력하는 문자 를 제거하는 추가 트릭을 수행합니다 .
여기에서 당신은 다음과 같은 CLI 또는 GUI SQLite는 응용 프로그램의 다양한 사용할 수 있습니다 sqlite3
또는 sqlitebrowser
데이터베이스의 내용을 검색 할 수.
답변
나는 나를 위해 일할 다른 것을 얻을 수 없었지만 이것은 :
adb shell
run-as package.name
cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db
exit
exit
adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/
첫 번째 종료는 실행 도구를 종료하는 것이고, 두 번째 종료는 풀을 수행하기 위해 adb 쉘을 종료하는 것입니다.
답변
앱의 디버그 버전의 경우 명령 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
을 현재 디렉토리로 추출합니다 .
답변
로컬 컴퓨터에 파일을 다운로드하는 훨씬 더 간단한 방법 :
PC 셸에서 다음을 실행합니다.
adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>