Android (至少在安卓2.3上)
Android (至少在安卓2.3上),android,adb,Android,Adb,chmod 755一直以来都在复制文件(但如果您打算继续使用该设备,您应该在之后恢复权限)。如果您使用的是Mac电脑和三星手机,这就是您必须做的事情(因为在三星电脑上以的身份运行,在Mac电脑上以的身份运行) 备份应用程序的数据目录 adb备份-f/Users/username/Desktop/data.ab com.示例 您将被要求在手机中输入密码进行加密,请勿输入任何密码。只需点击“备份我的数据”。看 成功备份后,您将在桌面上看到data.ab文件。现在我们需要将其转换为tar格式 为此,请
chmod 755
一直以来都在复制文件(但如果您打算继续使用该设备,您应该在之后恢复权限)。如果您使用的是Mac电脑和三星手机,这就是您必须做的事情(因为在三星电脑上以
的身份运行,在Mac电脑上以的身份运行)
adb备份-f/Users/username/Desktop/data.ab com.示例
data.ab
文件。现在我们需要将其转换为tar
格式abe.jar
文件。将其添加到PATH变量中java-jar abe.jar解包/Users/username/Desktop/data.ab/Users/username/Desktop/data.tar
Android Studio的较新版本包括设备文件浏览器,我发现它是一种方便的GUI方法,可以从我的开发Nexus 7下载文件 您必须确保已在设备上启用USB调试
除非该设备是根目录的,否则您根本无法这样做。我希望您是错的,但以防万一,请将您的评论作为答案。你能补充一下你为什么这么认为吗?我想保存我的程序有缺陷版本保存的所有垃圾文件,以确保我即将发布的程序能够优雅地处理所有类型的输入文件。这是否意味着可以将目录从world:--x复制到world:r-x足够长,以便能够获取文件?@Knossos尽管如此这是我的应用程序,用户能够保存应用程序存储在其设备上的私有数据副本是否合法?毕竟,数据可能属于设备所有者,而不是应用程序作者。问题是如何区分所有者和试图与应用程序私有数据交互的恶意应用程序/程序。(其中可能包含用户个人数据)在调试时更改权限是可以的,但在即将发布时,这样做会破坏默认提供的保护(防止其他应用访问/弄乱文件)。因此,开发人员可以访问文件,即使它们只是用户可读/写的,这是一种更理想的方式。
bs=24 skip=1
比bs=1 skip=24
(在我的系统上,38.6mb/s vs 1.7mb/s):)Python替代方案,用于openssl没有使用zlib编译的情况:dd if=data.ab bs=1 skip=24 | Python-c"输入zlib,sys,;sys.stdout.write(zlib.decompress(sys.stdin.read())“| tar-xvf-
(来自上述源代码)我在MacBook上使用dd
命令从来没有成功过。相反,我使用java-jar./abe.jar unpack data.ab data.tar
。你也可以从下载abe实用程序,我注意到我必须强制关闭我要备份其数据的应用程序,否则备份是空的!(Android 4.4.2)这与清单显示android:allowBackup=“false”时的效果相同“更好的是,直接将文件解压缩到本地目录:dd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib-d | tar-x
最好的部分是当您不给出参数,然后用rm/sdcard/
替代时,幸运的是它不是-rf
。您可以直接在主机上搜索文件:“adb shell运行为com.whater.Fnord cat/data/data/com.whater.Fnord/databases/logging.db>/tmp/foo”(其中/tmp/foo是主机上的一个文件,而不是android设备)刚刚实现@dave thomas不久前解决了这个问题。删除我的否决票。或者不删除:-(“除非编辑此答案,否则您的投票现在被锁定。“TBH我不明白这件事有多麻烦。原始脚本永远不会删除目录(缺少-rf开关),除非它是空的。我没有检查,但即使目录是空的,我也怀疑脚本是否会删除目录,因为它是一个装载点。脚本看起来很危险,但从来都不是…你的Mac版本可以工作!注意:adb backup
和dd
tar转换步骤在工作时不提供任何状态,并且可以执行m如果您有大量数据,则需要几分钟。请耐心等待!我收到:“zlib.error:error-3,同时解压缩数据:不正确的标题检查”但是,我的备份要求密码进行加密。此python方法不要求密码对备份进行解密。上面示例中的注释中的abe.jar要求密码,但在使用该方法解构后,我没有获得所有文件。我对加密备份的第二次尝试abe.jar成功。正是该命令导致了我的db f我很想被腐蚀,但我和followi一起工作
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
adb shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt
adb backup -f myFiles com.corp.appName
adb backup -f myAndroidBackup.ab com.corp.appName
dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar
File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner
#!/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
$ 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}
adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
adb backup -f backup com.mypackage.myapp
dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar
tar xvf backup.tar
#!/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"`"
adb backup -f myAndroidBackup.ab com.corp.appName
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
tar xvf myAndroidBackup.tar
#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
**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**
(
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
)