คำตอบนี้มาจากประสบการณ์ของฉันกับคำตอบอื่น ๆ และความคิดเห็นในคำตอบ ความหวังของฉันคือฉันสามารถช่วยใครบางคนในสถานการณ์คล้าย ๆ กันได้
ฉันกำลังทำสิ่งนี้บนOSXผ่านเทอร์มินัล
ก่อนหน้านี้คำตอบของ Vinicius Avellar ใช้ได้ผลดีสำหรับฉัน ฉันเป็นเพียงช่วงเวลาส่วนใหญ่ที่ต้องการฐานข้อมูลจากอุปกรณ์จากแอปพลิเคชันดีบัก
วันนี้ผมมีกรณีการใช้งานที่ผมจำเป็นต้องมีไฟล์ส่วนตัวหลาย ฉันได้วิธีแก้ปัญหาสองวิธีที่ใช้ได้ผลดีสำหรับกรณีนี้
ใช้คำตอบที่ยอมรับพร้อมกับความคิดเห็นเฉพาะ OSX ของใครบางคน สร้างข้อมูลสำรองและใช้โซลูชันของบุคคลที่สาม
sourceforge.net/projects/adbextractor/files/?source=navbarเพื่อคลายแพ็กลงใน tar ฉันจะเขียนเพิ่มเติมเกี่ยวกับประสบการณ์ของฉันกับโซลูชันนี้ที่ด้านล่างของคำตอบนี้ เลื่อนลงหากนี่คือสิ่งที่คุณกำลังมองหา
วิธีแก้ปัญหาที่เร็วกว่าซึ่งฉันตัดสินด้วย ฉันสร้างสคริปต์สำหรับดึงไฟล์หลายไฟล์ที่คล้ายกับคำตอบของ Tamas ฉันสามารถทำได้ด้วยวิธีนี้เนื่องจากแอปของฉันเป็นแอปดีบักและฉันสามารถเข้าถึงการรันบนอุปกรณ์ของฉันได้ หากคุณไม่สามารถเข้าถึง run-as วิธีนี้จะไม่ได้ผลสำหรับคุณบน OSX
นี่คือสคริปต์ของฉันสำหรับการดึงไฟล์ส่วนตัวหลายไฟล์ที่ฉันจะแบ่งปันกับคุณผู้อ่านซึ่งกำลังตรวจสอบคำถามที่ยอดเยี่ยมนี้ด้วย;):
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
adb devices -l | grep -e 'device\b' > /dev/null
if [ $? -gt 0 ]; then
echo "No device connected to adb."
exit 1
fi
while getopts f:p: opt; do
case $opt in
f)
fileToPull=$OPTARG
;;
p)
packageName=$OPTARG
;;
esac
done;
if [ -z "$fileToPull" ]; then
echo "Please specify file or folder to pull with -f argument"
exit 1
fi
if [ -z "$packageName" ]; then
echo "Please specify package name to run as when pulling file"
exit 1
fi
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
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 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
}
function is_file_dir() {
adb shell "if [ -d \"$1\" ]; then echo TRUE; fi"
}
function is_file_symlink() {
adb shell "if [ -L \"$1\" ]; then echo TRUE; fi"
}
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\""`
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
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 Backup Extractor
นี่คือขั้นตอนที่ฉันทำบน 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 / การรักษาความปลอดภัย ฉันใส่ไว้ที่นั่นก่อนและยังคงได้รับข้อความแสดงข้อผิดพลาด ดังนั้นผมจึงสอบสวนและบน Mac ของฉันกับ Java 1.8 สถานที่ที่ถูกต้องที่จะนำพวกเขาคือ: <Java บ้าน> / JRE / lib / การรักษาความปลอดภัย ฉันแน่ใจว่าได้สำรองข้อมูลในช่องนโยบายเดิมและวางไว้ที่นั่น Vola ฉันสามารถป้อนรหัสผ่านด้วย abe.jar และถอดรหัสเป็นไฟล์ tar
สุดท้ายฉันเพิ่งวิ่ง ( หลังจากเรียกใช้คำสั่งก่อนหน้าอีกครั้ง )
tar xvf myAndroidBackup.tar
ตอนนี้สิ่งสำคัญคือต้องสังเกตว่าถ้าคุณสามารถวิ่งเป็นและแมวได้มันจะเร็วกว่ามาก ประการแรกคุณจะได้รับเฉพาะไฟล์ที่คุณต้องการไม่ใช่แอปพลิเคชันทั้งหมด สองไฟล์ยิ่งมากขึ้น (+ การเข้ารหัสสำหรับฉัน) ทำให้การถ่ายโอนช้าลง ดังนั้นการรู้วิธีนี้จึงเป็นสิ่งสำคัญหากคุณไม่ได้รันบน OSX แต่สคริปต์ควรเป็นขั้นแรกสำหรับแอปพลิเคชันดีบัก
โปรดทราบว่าฉันเพิ่งเขียนวันนี้และทดสอบไปสองสามครั้งดังนั้นโปรดแจ้งให้ฉันทราบถึงข้อบกพร่องใด ๆ !