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


113

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

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

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



stackoverflow.com/questions/13006315 루팅 장치없이 데이터베이스 가져 오기
Naveen Prince P

답변:


230

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

8
또는 run-as파일 권한을 엉망으로 만드는 대신 파일을 외부 저장소의 한 지점에 복사하고 거기에서 데이터베이스 파일을 가져 오는 데 사용하십시오.
CommonsWare

5
run-as는 sdcard에 쓸 권한이 없습니다-최신 업데이트로 추가 된 새로운 것이 있습니다 ... :(
slott

4
adb shell "run-as package.name chmod 666 /data/data/package.name/databases/file"을 실행하면 adb가 me error-> run-as : exec failed for chmod666 Error : Permission denied를 종료합니다. 루트없이 Nexus 7 사용
Shudy 2015 년

2
adb에서는 더 이상 외부 SD 카드에 대한 쓰기 액세스가 불가능합니다.
slott

3
비어 있거나 거의 비어있는 파일을 되 찾는 경우 해당 파일은 사용자가 만든이 파일로 리디렉션 된 콘솔의 오류 일뿐입니다. 여기서 자주 발생하는 문제는 앱의 릴리스 변형에서 DB를 복사하려고한다는 것입니다. 앱의 디버그 변형에서만 DB를 복사 할 수 있습니다 . 이 경우 디버그 변형을 설치하고 명령을 다시 시도하십시오. 이것이 누군가를 돕기를 바랍니다.
Aonghus Shortt

73

수락 된 답변이 더 이상 작동하지 않습니다 (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 .

3
이것은 새로운 정답이거나 @Alex P 여야합니다. 최신 Android 버전에 대해이 답변을 추가해야합니다. 또한 제 경우에는 777을 사용하고 db 파일에 액세스하기 전에 먼저 데이터베이스 디렉토리에 적용해야했습니다.
muetzenflo

1
내 장치가 루팅되었지만 명령이 작동 su하려면 여전히 실행해야합니다 run-as.
ThomasW

SD 카드가 없으면 어떻게합니까?
Gyum Fox 2015

1
SD 카드가 없더라도 어쨌든 "sdcard"디렉토리가 있습니다.
treesAreEverywhere 2015 년

1
큰!. 그것은 나에게도 효과적이었습니다. 배치 / 쉘 파일을 만들 수 있습니까? db 파일 이름을 param으로 전달하면 db 파일이 있습니다.
Qadir Hussain

22

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

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

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

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

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

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

여기에 이미지 설명 입력


1
와, adb-shell을 사용하는 것보다 훨씬 쉽고 안전합니다
user1708860

9

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

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

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

  1. 먼저 다른 사용자가 파일에 액세스 할 수 있도록하고 장치에서 파일을 가져 오려고합니다.
  2. 실패하면 터미널을 통해 파일의 내용을 로컬 컴퓨터로 스트리밍합니다. \r일부 장치가 셸에 출력하는 문자 를 제거하는 추가 트릭을 수행합니다 .

여기에서 당신은 다음과 같은 CLI 또는 GUI SQLite는 응용 프로그램의 다양한 사용할 수 있습니다 sqlite3또는 sqlitebrowser데이터베이스의 내용을 검색 할 수.


이 스크립트는 디버깅 가능한 애플리케이션을위한 것입니다. 앱이 디버깅 할 수없는 경우에는 어떻습니까?
blueware

문제의 앱이 해당 데이터를 백업의 일부로 노출하는 경우 유일한 옵션은 백업 도구를 사용하는 것입니다. 그 외에도 높은 권한이 필요합니다.
Paul Lammertsma

7

나는 나를 위해 일할 다른 것을 얻을 수 없었지만 이것은 :

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 쉘을 종료하는 것입니다.


3

앱의 디버그 버전의 경우 명령 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을 현재 디렉토리로 추출합니다 .


1
여러 파일의 경우에도 여전히 단일 명령입니다. 업데이트 확인 stackoverflow.com/a/18472135/1778421을 당신은 또한 파일의 압축을 풀 호스트 측의 다른 파이프를 추가 할 수 있습니다 선호하는 경우
알렉스 P.을

2

로컬 컴퓨터에 파일을 다운로드하는 훨씬 더 간단한 방법 :

PC 셸에서 다음을 실행합니다.

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>

꽤 가깝지만 이것은 나를 위해 잘못된 db를 가져옵니다.
Nae

1
#!/bin/bash
#export for adb
export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools

adb -d shell 'run-as com.android.app  cp /data/data/com.android.app/files/db.realm /sdcard'
adb pull sdcard/db.realm /Users/userMe/Desktop/db

Realm 데이터베이스를 얻기 위해이 스크립트를 사용할 수 있습니다.


0

누군가가 검색하는 데 사용할 수있는 또 다른 답을 찾고 있다면 Database뿐만 아니라 Shared Preferences이 단계를 수행하십시오

당신에 build.gradle앱 추가 라인의 파일

debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

당신이 당신의 응용 프로그램을 실행할 때 이제 non-release다음 모드 앱 장치에서 자동으로 열립니다 8080 포트는 것입니다 IP address확인 장치가를 통해 연결되어 있는지 확인 wifi하고이 laptop같은 네트워크를 공유한다. 이제 URL을 방문하십시오.

http : // your_mobile_device_ip : 8080 /

공유 기본 설정과 함께 데이터베이스의 모든 데이터를 볼 수 있습니다.


0

다음은 Android 5.1을 실행하는 기기에서 작동하는 솔루션입니다. 다음 예제는 Windows 용입니다.

당신은 sed 가 필요합니다 (또는 윈도우에서는 sed.exe, 예를 들어 cygwin에서.) (Unix에서는 그냥있을 것입니다;)). 적어도 Windows에서는 잘못된 '\ r'문자를 제거합니다.

이제 다음 명령을 실행하십시오.

adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db

sed 명령은 후행 / r 문자를 제거합니다.

물론 "com.yourcompany.yourapp"을 앱의 패키지 이름으로, "YourDatabaseName"을 앱의 데이터베이스 이름으로 바꿔야합니다.


0

를 사용할 때 데이터베이스 파일은 emtpyadb run-as 입니다. RoomDatabase 인스턴스에서 close ()를 호출하여 해결할 수 있습니다. close ()를 호출하여 SQLite가 저널을 디스크에 쓰도록합니다. 요청시 데이터베이스 연결을 닫는이 버튼을 만들었습니다.

GIPHY를 통해

다음은 RoomDatabase 인스턴스에서 close를 호출하는 방법 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.