web-dev-qa-db-ja.com

android adb、run-asを使用してデータベースを取得

ルート化されていないAndroidデバイスでは、run-asコマンドとパッケージ名を使用して、データベースを含むデータフォルダーに移動できます。ほとんどのファイルタイプは表示だけで満足していますが、データベースではAndroidデバイスから取得したい場合です。

Adbシェルのこの部分からdownloadcopyまたはmoveコマンドがありますか?データベースファイルをダウンロードし、データベースブラウザを使用してそのコンテンツを表示したいと思います。

ここでの1つの答えは、アプリケーションパッケージ全体を圧縮アーカイブに変換することです。ただし、これを実行してマシンに移動した後、そのアーカイブを抽出する方法については、それ以上の答えはありません。

101
CQM

設計によりuser Androidのビルド(これはbootloaderのロックを解除してフラッシュするまで携帯電話にあるものです) userdebugまたはengソフトウェアを搭載した電話)は、Internal Storageへのアクセスを制限します-すべてのアプリは、独自のファイルにのみアクセスできます。幸いなことに、rootを望まないソフトウェア開発者向けに、GoogleはInternal Storageofdebuggablerun-asコマンドを使用したパッケージのバージョン。

Android 5.1+デバイスから/data/data/debuggable.app.package.name/databases/fileをダウンロードするには、次のコマンドを実行します。

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
214
Alex P.

受け入れられた答えはもう機能しません(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 .
68
marmor

debug applicationからデータベースをプルしようとしている人がいる場合、以下の手順を使用できます。

  1. デバイスファイルエクスプローラーを検索して開きます

search and open device file Explorer

  1. ハンドセットを選択し、data/dataディレクトリを参照します

go to data/data directory

  1. アプリケーションパッケージを見つけて、データベースフォルダーに移動します。そこにデータベースが表示され、右クリックすると、これをドライブに保存するオプションが表示されます。

enter image description here

13
Ifta

データベースをダンプするための簡単なシェルスクリプトを公開しました。

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

ここで説明する2つの異なる方法を実行します。

  1. 最初に、他のユーザーがファイルにアクセスできるようにし、デバイスからプルしようとします。
  2. それが失敗した場合、ファイルの内容を端末経由でローカルマシンにストリーミングします。一部のデバイスがシェルに出力する\r文字を削除するための追加のトリックを実行します。

ここから、sqlite3sqlitebrowserなどのさまざまなCLIまたはGUI SQLiteアプリケーションを使用して、データベースのコンテンツを参照できます。

8
Paul Lammertsma

私は他に何も私のために働くことができませんでしたが、これは:

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

最初の出口はrun-asを終了し、2番目の出口はプルを実行するためにadbシェルを終了します。

6
Triplee121

アプリのデバッグバージョンでは、コマンドadb exec-out run-as xxx.yyy.zzz cat somefile > somefileを使用して1つのファイルを抽出するのが非常に便利です。ただし、複数のファイルに対して複数回行う必要があります。以下は、ディレクトリを抽出するために使用する簡単なスクリプトです。

#!/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)を現在のディレクトリに抽出します。

2
alijandro

ローカルコンピューターにファイルをダウンロードするはるかに簡単な方法:

PCシェルで次を実行します。

adb -d Shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
1
Emre
#!/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データベースを取得できます。

1
dralexnumber

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 /

共有設定とともにデータベースのすべてのデータを監視します。

以下は、Android 5.1を実行しているデバイスで動作するソリューションです。次の例はWindows用です。

sed (またはcygwinなどのWindowsではsed.exe)が必要です(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

adb run-asを使用する場合、データベースファイルはemtpyです。これは、RoomDatabaseインスタンスでclose()を呼び出すことで解決できます。 close()を呼び出して、SQLiteがジャーナルをディスクに書き込むようにします。要求に応じてデータベース接続を閉じるこのボタンを作成しました:

GIPHY経由

ここでcloseを呼び出す方法 RoomDatabaseインスタンスで。

0
Eimert