run-asを使用して内部ストレージからデータベースまたはその他のファイルを取得する


113

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

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

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



stackoverflow.com/questions/13006315ルート化デバイスなしでデータベースをプルする
Naveen Prince P

回答:


230

userAndroidの設計ビルド(ブートローダーのロックを解除し、userdebugまたはengソフトウェアでスマートフォンをフラッシュするまでは、これがスマートフォンにある)により、内部ストレージへのアクセスが制限されます-すべてのアプリは、自分のファイルにのみアクセスできます。幸いなことを望んでいないソフトウェア開発者のためのルート、Googleがアクセスする方法を提供自分の携帯電話を内部ストレージデバッグ使用して、それらのパッケージのバージョン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 2014

5
run-asにはsdcardへの書き込み権限がありません-最新の更新で何か新しいものが追加されています... :(
slott

4
adb shell "run-as package.name chmod 666 /data/data/package.name/databases/file"を実行すると、adbがエラーを終了します-> run-as:exec failed for chmod666 Error:Permission denied。ルートなしのNexus 7にいる
Shudy

2
adbでは、外部sdカードへの書き込みアクセスはできなくなりました。
スロット、2015年

3
空白またはほとんど空白のファイルが返されている場合、そのファイルは、作成したこのファイルにリダイレクトされたコンソールからの単なるエラーである可能性があります。ここで頻繁に発生する問題は、アプリのリリースバリアントからDBをコピーしようとしていることです。アプリのデバッグバリアントからのみDBをコピーできます。これが発生した場合は、デバッグバリアントをインストールして、コマンドを再試行してください。これが誰かを助けることを願っています。
Aonghus Shortt 2017

72

承認された回答が機能しなくなりました(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ファイルにアクセスする前に、first / as-wellをデータベースディレクトリに適用する必要がありました。
muetzenflo 2015年

1
私のデバイスはルート権限suを取得してrun-asいますが、コマンドを機能させるには実行する必要があることがわかりました
ThomasW

SDカードがない場合はどうなりますか?
Gyum Fox

1
SDカードがない場合でも、とにかく「sdcard」ディレクトリがまだあります。
treesAreEverywhere 2015

1
すごい!。それも私のために働いた。バッチ/シェルファイルを作成できますか?パラメータとしてdbファイル名を渡すだけで、dbファイルがあります。
カディールフセイン2017

22

デバッグアプリケーションからデータベースをプルしようとしている人が以下の手順を使用する可能性がある場合:

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

デバイスファイルエクスプローラーを検索して開く

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

data / dataディレクトリに移動します

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

ここに画像の説明を入力してください


1
うわー、adb-shellを使用するよりもはるかに簡単で安全
user1708860

9

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

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

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

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

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


このスクリプトはデバッグ可能なアプリケーション用ですが、アプリがデバッグできない場合はどうですか?
ブルーウェア

問題のアプリがバックアップの一部としてそのデータを公開する場合、唯一の選択肢はバックアップツールを使用することです。それを超えると、権限の昇格が必要になると思います。
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/

最初の出口はrun-asを終了することで、2番目の出口はプルを実行するために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を確認してください
Alex P.

2

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

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

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

かなり近いですが、これは私にとって不正なデータベースを引き出します。
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

このスクリプトを使用して、レルムデータベースを取得できます。


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(または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。これは、RoomDatabaseインスタンスでclose()を呼び出すことで解決できます。close()を呼び出して、SQLiteがそのジャーナルをディスクに書き込むようにします。リクエストに応じてデータベース接続を閉じるこのボタンを作成しました:

GIPHY経由

RoomDatabaseインスタンスでcloseを呼び出す方法は次のとおりです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.