Câu trả lời này dựa trên kinh nghiệm của tôi với các câu trả lời khác và nhận xét trong câu trả lời. Hy vọng của tôi là tôi có thể giúp đỡ ai đó trong hoàn cảnh tương tự.
Tôi đang làm điều này trên OSX thông qua thiết bị đầu cuối.
Trước đây câu trả lời của Vinicius Avellar rất hiệu quả đối với tôi. Tôi hầu như chỉ cần cơ sở dữ liệu từ thiết bị từ một ứng dụng gỡ lỗi.
Hôm nay tôi có một trường hợp sử dụng mà tôi cần nhiều tệp riêng tư . Tôi đã kết thúc với hai giải pháp hoạt động tốt cho trường hợp này.
Sử dụng câu trả lời được chấp nhận cùng với nhận xét cụ thể OSX của Ai đó ở đâu đó. Tạo một bản sao lưu và sử dụng giải pháp của bên thứ 3,
sourceforge.net/projects/adbextractor/files/?source=navbar để giải nén thành một tệp tar. Tôi sẽ viết thêm về trải nghiệm của tôi với giải pháp này ở cuối câu trả lời này. Cuộn xuống nếu đây là những gì bạn đang tìm kiếm.
Một giải pháp nhanh hơn mà tôi đã giải quyết. Tôi đã tạo một tập lệnh để kéo nhiều tệp tương tự như câu trả lời của Tamas. Tôi có thể làm theo cách này vì ứng dụng của tôi là ứng dụng gỡ lỗi và tôi có quyền truy cập để chạy như trên thiết bị của mình. Nếu bạn không có quyền truy cập run-vì phương pháp này sẽ không hoạt động với bạn trên OSX.
Đây là kịch bản của tôi để kéo nhiều tệp riêng tư mà tôi sẽ chia sẻ với bạn, độc giả, người cũng đang điều tra câu hỏi tuyệt vời này;):
#!/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"`"
Gist:
https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4
Quay lại phương pháp 1 , giải mã bản sao lưu bằng Android Backup Extractor
Dưới đây là các bước tôi đã thực hiện trên máy Mac của mình và các vấn đề tôi đã gặp phải:
Đầu tiên, tôi xếp hàng đợi một bản sao lưu (và đặt mật khẩu để mã hóa bản sao lưu của mình, thiết bị của tôi yêu cầu nó):
adb backup -f myAndroidBackup.ab com.corp.appName
Thứ hai, tôi chỉ tải xuống abe.jar từ đây: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Tiếp theo tôi chạy:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
Tại thời điểm này, tôi nhận được một thông báo lỗi. Vì tệp lưu trữ của tôi được mã hóa, java đã cho tôi một lỗi mà tôi cần cài đặt một số thư viện chính sách bảo mật.
- Vì vậy, tôi đã truy cập http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html và tải xuống các lọ chính sách bảo mật mà tôi cần. Bây giờ trong trường hợp của tôi, hướng dẫn cài đặt đã cho tôi biết vị trí sai để đặt các tệp jar. Nó nói rằng vị trí thích hợp là <java-home> / lib / security . Tôi đặt chúng ở đó đầu tiên và vẫn nhận được thông báo lỗi. Vì vậy, tôi đã điều tra và trên máy Mac của tôi với Java 1.8, vị trí chính xác để đặt chúng là: <java-home> / jre / lib / security . Tôi đảm bảo sao lưu các lọ chính sách ban đầu và đặt chúng ở đó. Vola Tôi đã có thể nhập mật khẩu bằng abe.jar và giải mã thành tệp tar.
Cuối cùng tôi vừa chạy ( sau khi chạy lại lệnh trước đó )
tar xvf myAndroidBackup.tar
Bây giờ điều quan trọng cần lưu ý là nếu bạn có thể vừa chạy vừa mèo, thì nó sẽ nhanh hơn nhiều. Một, bạn chỉ nhận được các tệp bạn muốn chứ không phải toàn bộ ứng dụng. Thứ hai, càng nhiều tệp (+ mã hóa đối với tôi) khiến tốc độ truyền chậm hơn. Vì vậy, biết thực hiện theo cách này là rất quan trọng nếu bạn không có run-as trên OSX, nhưng tập lệnh trước tiên phải là goto cho một ứng dụng gỡ lỗi.
Phiền bạn, tôi mới viết nó hôm nay và thử nghiệm nó một vài lần, vì vậy hãy thông báo cho tôi nếu có bất kỳ lỗi nào!