尝试使用拉一个文件
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的答案对我来说真是棒极了。 我永远只能大部分时间从调试应用程序需要从设备数据库。
今天,我有地方,我需要多个私人文件的使用情况。 我结束了两个解决方案,这种情况下工作良好。
使用接受的答案与有人的地方的OSX具体意见一起。 创建一个备份,然后使用第三方解决方案, sourceforge.net/projects/adbextractor/files/?source=navbar解压到焦油。 我会写更多关于我的这个解决方案在此答案的底部体验。 向下滚动,如果这是你在找什么。
更快的解决方案,我与结算。 我创建了一个脚本拉类似塔马斯的回答多个文件。 我能够做这种方式,因为我的应用程序是一个调试应用程序,我有机会获得运行作为我的设备上。 如果您没有访问权限才能运行,因为这种方法不会为你在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)
把你的应用程序的数据目录的备份adb backup -f /Users/username/Desktop/data.ab com.example
你会被要求输入密码在你的手机加密,不用输入任何。 只需点按“备份我的资料”。 请参阅如何采取备份?
一旦成功备份,你会看到data.ab
在您的桌面文件。 现在我们需要将其转换为tar
格式。
使用Android备份提取这一点。 下载 | 源代码
下载它,你会看到abe.jar
文件。 添加到您的PATH变量。
执行此生成tar文件: java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar
提取data.tar文件来访问所有文件
Answer 8:
Android Studio中的较新版本包括我发现是从我开发的Nexus 7下载文件的一个方便的GUI方法的设备文件浏览器 。
你必须确保你已经启用USB调试设备上
- 点击查看>工具窗口>设备文件浏览器,或单击工具栏窗口的设备文件浏览器按钮,打开设备文件浏览器。
- 选择从下拉列表中的设备。
在文件资源管理器窗口的设备内容进行交互。 对文件或目录的右键单击创建新的文件或目录,选定的文件或目录保存到你的机器,上传,删除,或同步。 双击文件Android Studio中打开它。
Android Studio中保存文件,你在一个临时目录中打开这样你的项目之外。 如果你进行修改,您使用打开设备文件浏览器,并想保存更改回设备的文件,则必须手动将文件上传到设备的修改版本。
完整的文档
Answer 9:
设置通过添加以下代码正确的权限后:
File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner
adb pull
为所需的工作。
见File.setReadable()
Answer 10:
启动形式戴夫·托马斯剧本我已经能够写我自己的解决方案,以克服两个问题:
- 我的备份是只包含清单文件
- 二进制文件得到了与戴夫·托马斯,其中不可读
这是我的脚本,即复制应用程序数据到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?