119

在非 root 的 android 设备上,我可以使用run-as带有我的包名称的命令导航到包含数据库的数据文件夹。大多数文件类型我只满足于查看,但是如果我想从 android 设备中提取数据库的话。

adb shell 的这一部分是否有download copyor命令?move我想下载数据库文件并使用数据库浏览器查看其内容。

这里的一个答案涉及将整个应用程序包转换为压缩存档,但是一旦完成并移动到机器上如何提取该存档,没有进一步的答案,当可能有一个更直接的解决方案开始时让我非常迷茫

4

12 回答 12

248

通过 Android 的设计user构建(在您解锁引导加载程序userdebug并用软件或软件刷新手机之前,您在手机上拥有的内容eng)限制了对内部存储的访问- 每个应用程序只能访问自己的文件。幸运的是,对于不愿意根植手机的软件开发人员,Google 提供了一种使用命令访问其软件包可调试版本的内部存储的方法。run-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
于 2013-08-27T17:41:48.243 回答
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 回答
28

如果有人想从调试应用程序中提取数据库,可以使用以下过程:

  1. 搜索并打开设备文件资源管理器

搜索并打开设备文件资源管理器

  1. 选择您的手机,然后浏览到data/data目录

转到数据/数据目录

  1. 现在找到您的应用程序包并转到数据库文件夹。您可以在那里看到数据库,然后右键单击,您将获得将其保存在驱动器中的选项。

在此处输入图像描述

于 2018-07-30T05:22:17.577 回答
9

我发布了一个用于转储数据库的简单 shell 脚本:

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

它执行此处描述的两种不同的方法:

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

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

于 2015-04-08T19:16:05.100 回答
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,第二个退出是退出adb shell做拉取。

于 2017-06-27T15:46:14.437 回答
5

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到当前目录中。

于 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 回答
1

使用adb run-as. _ _ 这可以通过在 RoomDatabase 实例上调用 close() 来解决。调用 close() 让 SQLite 将其日志写入磁盘。我创建了这个按钮,可以根据请求关闭数据库连接:

通过 GIPHY

以下是如何在 RoomDatabase 实例上调用 close。

于 2019-05-12T07:54:26.230 回答
1

从设备中提取应用程序数据库(以调试模式安装)的步骤

如果打开则关闭数据库连接

打开 cmd(命令提示符)(将 dir 更改为您的 adb 路径)

cd C:\Program Files (x86)\Android\android-sdk\platform-tools

(列出应用程序文件)

adb -d shell "运行为 com.xyz.name ls /data/data/com.xyz.name/files/"

(将所需文件复制到 sdcard)

adb -d shell "运行为 com.xyz.name cp /data/data/com.xyz.name/files/abc.db /sdcard/abc.db"

(从 sdcard 复制到机器 adb 文件夹)

adb 拉 /sdcard/abc.db

打开数据库连接

在我的情况下目标文件路径 C:\Users{userName}\AppData\Local\VirtualStore\Program Files (x86)\Android\android-sdk\platform-tools 或设备存储

于 2020-10-29T11:16:52.590 回答
0

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

您需要sed(或 Windows 上的 sed.exe,例如来自 cygwin。)(在 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”替换为应用程序中的数据库名称。

于 2015-09-23T22:25:34.470 回答
0

如果有人正在寻找另一个可用于检索Database的答案,请Shared Preferences按照以下步骤操作:

在您build.gradle的应用程序文件中添加行

debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

现在,当您在non-release模式下运行您的应用程序时,您的应用程序将自动从您的设备打开 8080 端口,IP address确保您的设备已通过连接wifi并且您laptop共享同一网络。现在只需访问网址

http://your_mobile_device_ip:8080/

观察数据库的所有数据以及共享的偏好。

于 2018-06-26T06:19:11.043 回答