119

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

adb shell のこの部分からdownload copyorコマンドはありますか? moveデータベース ファイルをダウンロードし、データベース ブラウザを使用してその内容を表示したいと考えています。

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

4

12 に答える 12

75

受け入れられた回答が機能しなくなりました (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 .
于 2015-02-17T09:24:18.093 に答える
9

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

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

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

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

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

于 2015-04-08T19:16:05.100 に答える
5

アプリのデバッグ バージョンの場合、コマンドを使用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を現在のディレクトリに抽出します。

于 2016-04-12T06:21:44.047 に答える
3

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

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

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
于 2017-11-08T21:26:38.967 に答える
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 データベースを取得できます。

于 2018-10-26T06:48:51.030 に答える