ルート化されていないAndroidデバイスでは、run-as
コマンドとパッケージ名を使用して、データベースを含むデータフォルダーに移動できます。ほとんどのファイルタイプは表示だけで満足していますが、データベースではAndroidデバイスから取得したい場合です。
Adbシェルのこの部分からdownload
copy
またはmove
コマンドがありますか?データベースファイルをダウンロードし、データベースブラウザを使用してそのコンテンツを表示したいと思います。
ここでの1つの答えは、アプリケーションパッケージ全体を圧縮アーカイブに変換することです。ただし、これを実行してマシンに移動した後、そのアーカイブを抽出する方法については、それ以上の答えはありません。
設計により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
受け入れられた答えはもう機能しません(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 .
データベースをダンプするための簡単なシェルスクリプトを公開しました。
ここで説明する2つの異なる方法を実行します。
\r
文字を削除するための追加のトリックを実行します。ここから、sqlite3
やsqlitebrowser
などのさまざまなCLIまたはGUI SQLiteアプリケーションを使用して、データベースのコンテンツを参照できます。
私は他に何も私のために働くことができませんでしたが、これは:
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シェルを終了します。
アプリのデバッグバージョンでは、コマンド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
)を現在のディレクトリに抽出します。
ローカルコンピューターにファイルをダウンロードするはるかに簡単な方法:
PCシェルで次を実行します。
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
このスクリプトを使用して、Realmデータベースを取得できます。
Database
およびShared Preferences
を取得するために使用できる別の答えを誰かが探している場合は、次の手順を実行します。
アプリのbuild.gradle
ファイルに行を追加します
debugCompile 'com.amitshekhar.Android:debug-db:1.0.0'
アプリをnon-release
モードで実行すると、アプリは自動的にデバイスから8080ポートを開きますIP address
デバイスがwifi
経由で接続され、laptop
が共有されていることを確認します同じネットワーク。今すぐURLにアクセスしてください
共有設定とともにデータベースのすべてのデータを監視します。
以下は、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」をアプリ内のデータベースの名前に置き換える必要があります。
adb run-as
を使用する場合、データベースファイルはemtpyです。これは、RoomDatabaseインスタンスでclose()を呼び出すことで解決できます。 close()を呼び出して、SQLiteがジャーナルをディスクに書き込むようにします。要求に応じてデータベース接続を閉じるこのボタンを作成しました:
ここでcloseを呼び出す方法 RoomDatabaseインスタンスで。