一个人怎么可以拉自己的Android应用的(私有)数据?(How can one pull the

2019-07-22 11:59发布

尝试使用拉一个文件

adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt

失败

failed to copy '/data/data/com.corp.appName/files/myFile.txt myFile.txt' to 'myFile.txt': Permission denied

尽管USB调试设备上启用。

我们可以去解决问题,通过古老的路线

adb shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt

但是这是笨拙的多个文件。

我怎样才能拉动目录/data/data/com.corp.appName/files到我的MacBook?

这样做可以直接或通过中转`/存储/ sdcard0 / MYDIR(从那里我可以与Android文件传输继续)的罚款。

其他评论

这可能是因为刚刚运行

adb backup  -f myFiles com.corp.appName

会产生我要找的文件。 在这种情况下,我正在寻找一种方式来解压/解压缩,生成的备份!

Answer 1:

亚行备份会写一个Android专用档案:

adb backup  -f myAndroidBackup.ab  com.corp.appName

这个档案可以被转换成使用tar格式:

dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar

参考:

http://nelenkov.blogspot.ca/2012/06/unpacking-android-backups.html

搜索“更新”,在该链接。


另外,使用Android的备份提取到从Android备份(提取文件.ab )文件。



Answer 2:

我有同样的问题,但解决它运行如下:

$ adb shell
$ run-as {app-package-name}
$ cd /data/data/{app-package-name}
$ chmod 777 {file}
$ cp {file} /mnt/sdcard/

在这之后,你可以运行

$ adb pull /mnt/sdcard/{file}


Answer 3:

这里是我工作:

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db

我直接打印数据库到本地文件。



Answer 4:

MacOSX上,通过组合从卡拉夫和奥利福特的答案,以下为我工作。

在命令行(确保亚行是在你的路径,我的是在〜/库/安卓/ SDK /平台工具/ ADB)和与和USB调试模式,插入您的Android设备,运行:

 adb backup -f backup com.mypackage.myapp

您的Android设备会询问您是否允许备份您的数据。 选择“备份我的数据”

稍等片刻。

该文件的备份将出现在你跑了亚行的目录。

现在运行:

dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar

现在,你有,你可以解压这样一个backup.tar文件:

 tar xvf backup.tar

看看您的应用程序存储中的所有文件。



Answer 5:

您可以在下面使用shell脚本。 它能够拉离应用程序缓存文件为好,不喜欢adb backup工具:

#!/bin/sh

if [ -z "$1" ]; then 
    echo "Sorry script requires an argument for the file you want to pull."
    exit 1
fi

adb shell "run-as com.corp.appName cat '/data/data/com.corp.appNamepp/$1' > '/sdcard/$1'"
adb pull "/sdcard/$1"
adb shell "rm '/sdcard/$1'"

然后你可以使用它像这样:

./pull.sh files/myFile.txt
./pull.sh cache/someCachedData.txt


Answer 6:

这个答案是根据我与其他的答案,在答案评论经验。 我希望我可以帮助别人了类似的情况。

我通过终端上的OSX这样做。

此前维尼Avellar的答案对我来说真是棒极了。 我永远只能大部分时间从调试应用程序需要从设备数据库。

今天,我有地方,我需要多个私人文件的使用情况。 我结束了两个解决方案,这种情况下工作良好。

  1. 使用接受的答案与有人的地方的OSX具体意见一起。 创建一个备份,然后使用第三方解决方案, sourceforge.net/projects/adbextractor/files/?source=navbar解压到焦油。 我会写更多关于我的这个解决方案在此答案的底部体验。 向下滚动,如果这是你在找什么。

  2. 更快的解决方案,我与结算。 我创建了一个脚本拉类似塔马斯的回答多个文件。 我能够做这种方式,因为我的应用程序是一个调试应用程序,我有机会获得运行作为我的设备上。 如果您没有访问权限才能运行,因为这种方法不会为你在OSX工作。

这是我拉,我将与大家分享多个私人文件脚本,读者,谁也正在调查这个问题,真棒):

#!/bin/bash
#
# Strict mode: http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
IFS=$'\n\t'

# 
# Usage: script -f fileToPull -p packageName
# 

# This script is for pulling private files from an Android device
# using run-as. Note: not all devices have run-as access, and
# application must be a debug version for run-as to work.
# 
# If run-as is deactivated on your device use one of the
# alternative methods here:
# http://stackoverflow.com/questions/15558353/how-can-one-pull-the-private-data-of-ones-own-android-app
# 
# If you have encrypted backup files use:
# sourceforge.net/projects/adbextractor/files/?source=navbar 
# From comments in the accepted answer in the above SO question
# 
# If your files aren't encrypted use the accepted answer 
# ( see comments and other answers for OSX compatibility )
# 
# This script is open to expansions to allow selecting 
# device used. Currently first selected device from
# adb shell will be used.

#Check we have one connected device
adb devices -l | grep -e 'device\b' > /dev/null

if [ $? -gt 0 ]; then
    echo "No device connected to adb."
    exit 1
fi

# Set filename or directory to pull from device
# Set package name we will run as
while getopts f:p: opt; do
    case $opt in
        f)
            fileToPull=$OPTARG
            ;;
        p)
            packageName=$OPTARG
            ;;
    esac
done;

# Block file arg from being blank
if [ -z "$fileToPull" ]; then
    echo "Please specify file or folder to pull with -f argument"
    exit 1
fi

# Block package name arg from being blank
if [ -z "$packageName" ]; then
    echo "Please specify package name to run as when pulling file"
    exit 1
fi

# Check package exists
adb shell pm list packages | grep "$packageName" > /dev/null
if [ $? -gt 0 ]; then
    echo "Package name $packageName does not exist on device"
    exit 1
fi

# Check file exists and has permission with run-as
fileCheck=`adb shell "run-as $packageName ls $fileToPull"`
if [[ $fileCheck =~ "Permission denied" ]] || [[ $fileCheck =~ "No such file or directory" ]]; then
    echo "Error: $fileCheck"
    echo "With file -> $fileToPull"
    exit 1
fi

# Function to pull private file
#
# param 1 = package name
# param 2 = file to pull
# param 3 = output file
function pull_private_file () {

    mkdir -p `dirname $3`

    echo -e "\033[0;35m***" >&2
    echo -e "\033[0;36m Coping file $2 -> $3" >&2
    echo -e "\033[0;35m***\033[0m" >&2

    adb shell "run-as $1 cat $2" > $3
}

# Check if a file is a directory
# 
# param 1 = directory to check
function is_file_dir() {

    adb shell "if [ -d \"$1\" ]; then echo TRUE; fi"
}

# Check if a file is a symbolic link
# 
# param 1 = directory to check
function is_file_symlink() {

    adb shell "if [ -L \"$1\" ]; then echo TRUE; fi"
}

# recursively pull files from device connected to adb
# 
# param 1 = package name
# param 2 = file to pull
# param 3 = output file
function recurse_pull_private_files() {

    is_dir=`is_file_dir "$2"`
    is_symlink=`is_file_symlink "$2"`

    if [ -n "$is_dir" ]; then

        files=`adb shell "run-as $1 ls \"$2\""`

        # Handle the case where directory is a symbolic link
        if [ -n "$is_symlink" ]; then
            correctPath=`adb shell "run-as $1 ls -l \"$2\"" | sed 's/.*-> //' | tr -d '\r'`
            files=`adb shell "run-as $1 ls \"$correctPath\""`
        fi

        for i in $files; do

            # Android adds nasty carriage return that screws with bash vars
            # This removes it. Otherwise weird behavior happens
            fileName=`echo "$i" | tr -d '\r'` 

            nextFile="$2/$fileName"
            nextOutput="$3/$fileName"
            recurse_pull_private_files "$1" "$nextFile" "$nextOutput"
        done
    else

        pull_private_file "$1" "$2" "$3"
    fi
}

recurse_pull_private_files "$packageName" "$fileToPull" "`basename "$fileToPull"`"

要点: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4


回到方法1,使用解密备份的Android备份提取

下面是我在我的Mac的步骤,问题我碰到:

首先,我排队备份(并设置密码加密我的备份,我的设备需要它):

adb backup -f myAndroidBackup.ab  com.corp.appName

其次我下载从这里只是abe.jar: https://sourceforge.net/projects/adbextractor/files/abe.jar/download

接下来,我跑了:

java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar

在这一点上,我得到一个错误信息。 因为我的存档被加密,JAVA给我,我需要安装一些安全策略库的错误。

  • 所以我去http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html和下载我所需要的安全策略罐子。 现在,在我的情况下安装说明告诉我错了位置,把jar文件。 上面说的是正确的位置是<java主> / lib / security中 。 我把它们放在那里第一,仍然得到了错误的信息。 所以,我调查,我的Mac上使用Java 1.8的正确的地方,把它们是:<java主> / JRE / lib / security中 。 我确信备份原有的政策罐子,并把它们放在那里。 佛拉我能够与abe.jar输入密码和解密到tar文件。

最后我只是跑( 重新运行前一个命令之后

tar xvf myAndroidBackup.tar

现在要注意的是,如果你可以运行,作为和猫,它是非常快很多是很重要的。 一,你只能得到你想要的文件,而不是整个应用程序。 二,多个文件(+为我加密),使得它更慢传输。 所以,知道做这种方式是很重要的,如果你没有运行作为OSX,但脚本应该是一个调试应用第一跳转。

你要知道我今天只是写它并测试了几次,所以请通知我任何错误的!



Answer 7:

如果您使用的是Mac机和一台三星手机,这是你必须做什么(因为run-as 不起作用三星和zlib 不工作在Mac)

  1. 把你的应用程序的数据目录的备份adb backup -f /Users/username/Desktop/data.ab com.example

  2. 你会被要求输入密码在你的手机加密,不用输入任何。 只需点按“备份我的资料”。 请参阅如何采取备份?

  3. 一旦成功备份,你会看到data.ab在您的桌面文件。 现在我们需要将其转换为tar格式。

  4. 使用Android备份提取这一点。 下载 | 源代码

  5. 下载它,你会看到abe.jar文件。 添加到您的PATH变量。

  6. 执行此生成tar文件: java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar

  7. 提取data.tar文件来访问所有文件



Answer 8:

Android Studio中的较新版本包括我发现是从我开发的Nexus 7下载文件的一个方便的GUI方法的设备文件浏览器

你必须确保你已经启用USB调试设备上

  1. 点击查看>工具窗口>设备文件浏览器,或单击工具栏窗口的设备文件浏览器按钮,打开设备文件浏览器。
  2. 选择从下拉列表中的设备。
  3. 在文件资源管理器窗口的设备内容进行交互。 对文件或目录的右键单击创建新的文件或目录,选定的文件或目录保存到你的机器,上传,删除,或同步。 双击文件Android Studio中打开它。

    Android Studio中保存文件,你在一个临时目录中打开这样你的项目之外。 如果你进行修改,您使用打开设备文件浏览器,并想保存更改回设备的文件,则必须手动将文件上传到设备的修改版本。

完整的文档



Answer 9:

设置通过添加以下代码正确的权限后:

File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner

adb pull为所需的工作。

见File.setReadable()



Answer 10:

启动形式戴夫·托马斯剧本我已经能够写我自己的解决方案,以克服两个问题:

  1. 我的备份是只包含清单文件
  2. 二进制文件得到了与戴夫·托马斯,其中不可读

这是我的脚本,即复制应用程序数据到SD卡,然后将其

#Check we have one connected device
adb devices -l | grep -e 'device\b' > /dev/null

if [ $? -gt 0 ]; then
    echo "No device connected to adb."
    exit 1
fi

# Set filename or directory to pull from device
# Set package name we will run as
while getopts f:p: opt; do
    case $opt in
        f)
            fileToPull=$OPTARG
            ;;
        p)
            packageName=$OPTARG
            ;;
    esac
done;

# Block package name arg from being blank
if [ -z "$packageName" ]; then
    echo "Please specify package name to run as when pulling file"
    exit 1
fi

# Check package exists
adb shell pm list packages | grep "$packageName" > /dev/null
if [ $? -gt 0 ]; then
    echo "Package name $packageName does not exist on device"
    exit 1
fi

    adb shell "run-as $packageName cp -r /data/data/$packageName/ /sdcard/$packageName"
    adb pull /sdcard/$packageName
    adb shell rm -rf /sdcard/$packageName


Answer 11:

类似塔马斯的答案 ,这里是一个班轮为Mac OS X与获取所有文件的应用程序your.app.id从您的设备并将其保存到(在这种情况下) ~/Desktop/your.app.id

(
    id=your.app.id &&
    dest=~/Desktop &&
    adb shell "run-as $id cp -r /data/data/$id /sdcard" &&
    adb -d pull "/sdcard/$id" "$dest" &&
    if [ -n "$id" ]; then adb shell "rm -rf /sdcard/$id"; fi
)
  • 排除-d从模拟器拉
  • 不踩你的会话变量
  • 你可以粘贴整个块到Terminal.app(或者如果需要删除新行)


Answer 12:

备份游戏数据和APK。 牛轧糖一加手机2。

**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**


Answer 13:

这是否意味着,人们可以从文件模式世界上的目录: - X世界:RX足够长的时间才能够获取的文件?

对,就是这样。 古怪的是,你还需要的文件有x位设置。 (至少在Android 2.3)

chmod 755一路下跌合作,复制文件(但你应该事后恢复的权限,如果你打算继续使用的设备)。



Answer 14:

你可以做:

ADB拉/存储/模拟/ 0 / Android设备/数据//



文章来源: How can one pull the (private) data of one's own Android app?
标签: android adb