使用运行方式从内部存储中检索数据库或任何其他文件


113

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

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

这里的一个答案涉及将整个应用程序包转换为压缩的归档文件,但是在完成该归档文件并将其移至机器后如何提取该归档文件没有进一步的答案,当可能有一个更直接的解决方案开始时,我非常困惑。



stackoverflow.com/questions/13006315在没有生根设备的情况下提取数据库
Naveen Prince P

Answers:


230

通过userAndroid的设计版本(在解锁引导加载程序并使用userdebugeng软件刷新手机之前,手机上才具有此功能)限制了对内部存储的访问-每个应用只能访问自己的文件。幸运的是,对于不愿扎根手机的软件开发人员,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
运行方式没有写入sdcard的权限-最新更新中添加了一些新内容... :(
slott 2015年

4
当我运行adb shell“ run-as package.name chmod 666 /data/data/package.name/databases/file”时,adb结束了我的错误-> run-as:chmod666的exec错误:权限被拒绝。我在无根用户的Nexus 7中
Shudy 2015年

2
使用adb不再可以对外部SD卡进行写访问。
洛特

3
如果发现要返回一个空白或几乎空白的文件,则可能会发现该文件只是控制台中的一个错误,已被重定向到您创建的该文件。这里的一个常见问题是您试图从应用程序的Release版本复制数据库。您只能从应用程序的Debug变量复制数据库。如果发生这种情况,只需安装调试变量,然后重试该命令。希望这对某人有帮助。
Aonghus Shortt

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
这应该是新的正确答案或@AlexP。您应该为较新的Android版本添加此答案。同样在我的情况下,我必须先使用777并将其首先应用于数据库目录,然后才能访问db文件。
muetzenflo,2015年

1
我的设备已植根,但是我仍然需要运行su以使run-as命令正常运行。
ThomasW 2015年

如果没有SD卡怎么办?
Gyum Fox

1
如果没有SD卡,则仍然存在“ sdcard”目录。
treesAreEverywhere

1
大!。它也对我有用。我们可以制作批处理/外壳文件吗?只是将db文件名作为参数传递,我们就有了db文件。
卡迪尔·侯赛因

22

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

  1. 搜索并打开设备文件浏览器

搜索并打开设备文件浏览器

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

转到数据/数据目录

  1. 现在找到您的应用程序包,然后转到数据库文件夹。您可以在此处看到数据库,然后单击鼠标右键,您将可以选择将其保存在驱动器中。

在此处输入图片说明


1
哇,与使用adb-shell相比,它更加轻松,安全得多
user1708860

9

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

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

它执行以下两种不同的方法:

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

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


该脚本适用于可调试的应用程序,如果应用程序不可调试该怎么办?
blueware '19

如果相关应用将数据公开为备份的一部分,则您唯一的选择可能是使用备份工具。除此之外,我担心这将需要提升的权限。
Paul Lammertsma '19

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/

第一个出口是退出运行方式,第二个出口是退出adb shell进行拉。


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 Shell中运行:

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

非常接近,但这对我来说格式不正确。

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数据库。


0

如果有人在寻找另一个可以用来检索Database以及Shared Preferences然后按照此步骤:

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

debugCompile'c​​om.amitshekhar.android:debug-db:1.0.0'

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

http:// your_mobile_device_ip:8080 /

监视数据库的所有数据以及共享的首选项。


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”替换为应用程序中的数据库名称。


0

数据库文件是emtpy使用时adb run-as。这可以通过在RoomDatabase实例上调用close()来解决。调用close()以使SQLite将其日记记录写入磁盘。我创建了此按钮,该按钮可应要求关闭数据库连接:

通过GIPHY

这是在RoomDatabase实例上调用close的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.