android adb,使用run-as检索数据库

在一个非rooted的android设备上,我可以使用包名称使用run-as命令导航到包含数据库的数据文件夹。 大多数文件types,我只是查看内容,但与数据库,我想如果从Android设备拉。

是否有从这个部分的adbshelldownload copymove命令? 我想下载数据库文件并使用数据库浏览器查看其内容。

这里的一个答案涉及将整个应用程序包转换成压缩存档,但是一旦完成并移动到机器后,如何提取该存档就没有进一步的答案,当我们可能有一个更直接的解决scheme

谢谢

通过deviseuser构build的Android(这是你的手机上,直到你解锁引导程序,并用userdebugeng软件闪存手机)限制访问内部存储 – 每个应用程序只能访问自己的文件。 幸运的是,软件开发人员不愿意为自己的手机打电话,Google提供了一种使用run-as命令访问软件包的可debugging版本的内部存储的方法。

要从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 . 

我已经发布了一个简单的shell脚本来转储数据库:

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

它执行这里描述的两种不同的方法:

  1. 首先,它试图使其他用户可以访问该文件,并试图从设备中获取该文件。
  2. 如果失败,则通过terminal将文件的内容stream式传输到本地机器。 它执行一个额外的技巧来删除某些设备输出到shell的\r字符。

从这里您可以使用各种CLI或GUI SQLite应用程序(如sqlite3sqlitebrowser )来浏览数据库的内容。

对于应用程序的debugging版本,使用命令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 

希望这会有所帮助。 这个脚本也是可用的。

典型的用法是

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

那么它会将您的应用程序数据库目录(即/data/data/com.example.myapplication/databases下的所有文件提取到当前目录中。

我无法得到任何东西为我工作,但这:

 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,第二个出口是退出adbshell做pull。

以下是运行Android 5.1的设备的解决scheme。 以下示例适用于Windows。

你需要sed(例如在cygwin上的窗口中有[ https://www.gnu.org/software/sed/manual/sed.html%5D或sed.exe。)(在Unix上,它就在那里;;)) 。 删除不好的'\ r'字符,至less在窗口上。

现在只需运行以下命令:

 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字符。

当然,你应该用应用程序的包名称replace“com.yourcompany.yourapp”,用应用程序中的数据库名称replace“YourDatabaseName”。

将文件下载到本地计算机的方法要简单得多:

在你的PC机上运行:

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