program story

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

inputbox 2020. 8. 14. 07:42
반응형

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


루팅되지 않은 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. If that fails, it streams the contents of the file over the terminal to the local machine. It performs an additional trick to remove \r characters that some devices output to the shell.

From here you can use a variety of CLI or GUI SQLite applications, such as sqlite3 or sqlitebrowser, to browse the contents of the database.


I couldn't get anything else to work for me but this:

adb shell
run-as package.name
cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db
exit
exit
adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/

The first exit is to exit out of the run-as, the second exit is to exit out of adb shell to do the pull.


For app's debug version, it's very convenient to use command adb exec-out run-as xxx.yyy.zzz cat somefile > somefile to extract a single file. But you have to do multiple times for multiple files. Here is a simple script I use to extract the directory.

#!/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

Hope it would be helpful. This script is also available at gist.

Typical usage is

$ ./exec_out.sh -p com.example.myapplication -d databases

then it will extract all files under your apps databases directory, which is /data/data/com.example.myapplication/databases, into current directory.


Much much simpler approach to download the file onto your local computer:

In your PC shell run:

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

#!/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

You can use this script for get Realm database.


If someone is looking for another answer that can be used to retrieve Database as well as Shared Preferences then follow this step:

In your build.gradle file of your app add line

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

now when you run your app in non-release mode then your app will automatically open 8080 port from your device IP address make sure your device is connected via wifi and your laptop is sharing the same network. Now simply visit the url

http://your_mobile_device_ip:8080/

to watch all data of database along with shared preferences.


Here's a solution that works on a device running Android 5.1. The following example is for Windows.

You need sed (or sed.exe on windows, e.g. from cygwin.) ( On Unix, it'll just be there ;) ). To remove bad '\r' characters, at least on windows.

Now just run the following command:

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

The sed command strips out trailing /r characters.

Of course you should replace "com.yourcompany.yourapp" with the package name of the app and "YourDatabaseName" with the name of the database in the app.


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

GIPHY를 통해

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

참고 URL : https://stackoverflow.com/questions/18471780/retrieve-database-or-any-other-file-from-the-internal-storage-using-run-as

반응형