[android] 실행 도구를 사용하여 내부 저장소에서 데이터베이스 또는 기타 파일 검색

루팅되지 않은 Android 장치에서 run-as패키지 이름과 함께 명령을 사용하여 데이터베이스가 포함 된 데이터 폴더로 이동할 수 있습니다 . 대부분의 파일 형식은보기만으로 만족하지만 데이터베이스를 사용하는 경우 Android 장치에서 가져오고 싶습니다.

있는가 download copy또는 moveADB 쉘의이 부분에서 명령은? 데이터베이스 파일을 다운로드하고 데이터베이스 브라우저를 사용하여 그 내용을보고 싶습니다.

여기에 한 가지 대답은 전체 애플리케이션 패키지를 압축 된 아카이브로 바꾸는 것이지만, 일단 이것이 완료되고 머신으로 이동되면 해당 아카이브를 추출하는 방법에 대한 더 이상의 대답이 없으므로 시작하기에 더 직접적인 솔루션이있을 때 저를 매우 잊혀지 게됩니다.



답변

userAndroid의 설계 빌드 ( 부트 로더 를 잠금 해제하고 userdebug또는 eng소프트웨어로 휴대 전화를 플래시 할 때까지 휴대 전화에있는 것임 )는 내부 저장소에 대한 액세스를 제한 합니다. 모든 앱은 자체 파일에만 액세스 할 수 있습니다. 다행히하려하지 소프트웨어 개발자를위한 뿌리 휴대폰 구글이 액세스 할 수있는 방법을 제공합니다 내부 스토리지디버깅 사용하여 패키지의 버전 run-as명령을 사용합니다.

/data/data/debuggable.app.package.name/databases/fileAndroid 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 .


답변

디버그 응용 프로그램 에서 데이터베이스를 가져 오려는 사람 은 아래 절차를 사용할 수 있습니다.

  1. 장치 파일 탐색기 검색 및 열기

장치 파일 탐색기 검색 및 열기

  1. 핸드셋을 선택한 다음 data/data디렉토리 를 찾습니다.

데이터 / 데이터 디렉토리로 이동

  1. 이제 응용 프로그램 패키지를 찾고 데이터베이스 폴더로 이동하십시오. 거기에서 데이터베이스를 볼 수 있으며 마우스 오른쪽 버튼을 클릭하면 드라이브에 저장할 수있는 옵션이 표시됩니다.

여기에 이미지 설명 입력


답변

데이터베이스 덤프를위한 간단한 셸 스크립트를 게시했습니다.

https://github.com/Pixplicity/humpty-dumpty-android

여기에 설명 된 두 가지 고유 한 방법을 수행합니다.

  1. 먼저 다른 사용자가 파일에 액세스 할 수 있도록하고 장치에서 파일을 가져 오려고합니다.
  2. 실패하면 터미널을 통해 파일의 내용을 로컬 컴퓨터로 스트리밍합니다. \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>