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

CQM*_*CQM 104 database android adb android-sqlite internal-storage

在非root用户设备上,我可以使用run-as带有我的包名称的命令导航到包含数据库的数据文件夹.我满意的大多数文件类型只是查看,但我想从Android设备拉数据库.

是否有一个download copymove亚行外壳,这部分命令?我想下载数据库文件并使用数据库浏览器查看其内容.

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

Ale*_* P. 218

通过userAndroid的设计构建(这是你在手机上解锁引导程序并用手机userdebugeng软件刷机)限制访问内部存储 - 每个应用程序只能访问自己的文件.幸运的是软件开发商不愿意自己的手机谷歌提供了一种方式来访问内部存储可调试使用它们的软件包的版本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
Run Code Online (Sandbox Code Playgroud)

要一次下载文件夹中的多个文件/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
Run Code Online (Sandbox Code Playgroud)

  • 或者,只需使用`run-as`将文件复制到外部存储上的某个位置,然后从那里提取数据库文件,而不是乱用文件权限. (6认同)
  • run-as无权写入SD卡 - 最新更新中添加了一些新内容...... :( (4认同)
  • 当我运行的adb壳"运行为package.name搭配chmod 666 /data/data/package.name/databases/file"亚行结束我的错误 - >运行 - 如:EXEC失败chmod666错误:权限被拒绝.我在没有root的Nexus 7中 (3认同)
  • 如果您发现您正在返回一个空白或接近空白的文件,您可能会发现该文件只是来自已重定向到您已创建的此文件的控制台的错误.这里经常出现的问题是您尝试从应用的Release变体中复制数据库.**您只能从应用程序的Debug变体中复制数据库**.如果发生这种情况,只需安装调试版本并再次尝试该命令.希望这有助于某人. (3认同)
  • 使用adb不再可以对外部SD卡进行写访问. (2认同)
  • 使用"adb exec-out run-as package.name cat databases/file> file"传输数据库时,我得到额外的换行符(CR LF),使sqliteman无法读取该文件.看起来该文件被复制为文本而不是二进制文件.有没有办法解决它? (2认同)
  • 请注意,“adb exec-out”似乎捕获设备上的 stderr 并将其打印到本地 *stdout*。这意味着如果“tar”打印错误消息(例如,如果您给它一个绝对路径),它们最终会出现在生成的“.tar”文件中并使其格式错误。 (2认同)

mar*_*mor 69

接受的答案对我来说不再有效(被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 .
Run Code Online (Sandbox Code Playgroud)

  • 这应该是新的正确答案或@Alex P.您应该为较新的Android版本添加此答案.同样在我的情况下,我必须先使用777并将其应用到数据库目录中,然后才能访问db文件. (3认同)

Ift*_*fta 14

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

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

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

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

转到数据/数据目录

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

在此输入图像描述


Pau*_*sma 8

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

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

它执行两种不同的方法:

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

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


Tri*_*121 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 Code Online (Sandbox Code Playgroud)

第一个出口是退出run-as,第二个出口是退出adb shell以进行拉取.


ali*_*dro 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
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助。该脚本也可以在gist上找到。

典型用法是

$ ./exec_out.sh -p com.example.myapplication -d databases
Run Code Online (Sandbox Code Playgroud)

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

  • 即使对于多个文件,它仍然只是一个命令。检查更新 /sf/answers/1293049481/ 如果您愿意,您还可以在主机端添加另一个管道来解压文件 (2认同)