Jawaban ini berdasarkan pengalaman saya dengan jawaban lain, dan komentar di jawaban tersebut. Harapan saya adalah saya dapat membantu seseorang dalam situasi serupa.
Saya melakukan ini di OSX melalui terminal.
Sebelumnya jawaban Vinicius Avellar bekerja sangat baik untuk saya. Saya hanya sebagian besar waktu membutuhkan database dari perangkat dari aplikasi debug.
Hari ini saya memiliki kasus penggunaan di mana saya membutuhkan banyak file pribadi . Saya berakhir dengan dua solusi yang bekerja dengan baik untuk kasus ini.
Gunakan jawaban yang diterima bersama dengan komentar spesifik OSX dari Seseorang Di suatu tempat. Buat cadangan dan gunakan solusi pihak ketiga,
sourceforge.net/projects/adbextractor/files/?source=navbar untuk mengekstraknya menjadi tar. Saya akan menulis lebih banyak tentang pengalaman saya dengan solusi ini di bagian bawah jawaban ini. Gulir ke bawah jika ini yang Anda cari.
Solusi yang lebih cepat yang saya selesaikan. Saya membuat skrip untuk menarik banyak file yang mirip dengan jawaban Tamas. Saya dapat melakukannya dengan cara ini karena aplikasi saya adalah aplikasi debug dan saya memiliki akses ke run-as di perangkat saya. Jika Anda tidak memiliki akses ke run-as, metode ini tidak akan berfungsi untuk Anda di OSX.
Berikut ini skrip saya untuk menarik beberapa file pribadi yang akan saya bagikan dengan Anda, pembaca, yang juga menyelidiki pertanyaan mengagumkan ini;):
#!/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"`"
Inti:
https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4
Kembali ke metode 1 , mendekripsi cadangan menggunakan Android Backup Extractor
Berikut adalah langkah-langkah yang saya ambil di Mac saya, dan masalah yang saya temui:
Pertama, saya mengantri cadangan (dan menyetel kata sandi untuk mengenkripsi cadangan saya, perangkat saya memerlukannya):
adb backup -f myAndroidBackup.ab com.corp.appName
Kedua saya unduh hanya abe.jar dari sini: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Selanjutnya saya berlari:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
Pada titik ini saya mendapat pesan kesalahan. Karena arsip saya dienkripsi, java memberi saya kesalahan sehingga saya perlu menginstal beberapa pustaka kebijakan keamanan.
- Jadi saya pergi ke http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html dan mengunduh toples kebijakan keamanan yang saya butuhkan. Sekarang dalam kasus saya, instruksi penginstalan memberi tahu saya lokasi yang salah untuk meletakkan file jar. Dikatakan bahwa lokasi yang tepat adalah <java-home> / lib / security . Saya menempatkannya di sana terlebih dahulu dan masih mendapat pesan kesalahan. Jadi saya menyelidiki dan di Mac saya dengan Java 1.8 tempat yang benar untuk meletakkannya adalah: <java-home> / jre / lib / security . Saya memastikan untuk membuat cadangan toples kebijakan asli, dan menaruhnya di sana. Vola Saya bisa memasukkan kata sandi dengan abe.jar dan mendekripsi ke file tar.
Terakhir saya baru saja berlari ( setelah menjalankan perintah sebelumnya lagi )
tar xvf myAndroidBackup.tar
Sekarang penting untuk dicatat bahwa jika Anda bisa berlari-sebagai dan kucing, itu jauh lebih cepat. Pertama, Anda hanya mendapatkan file yang Anda inginkan dan bukan seluruh aplikasi. Dua, semakin banyak file (+ enkripsi untuk saya) membuatnya lebih lambat untuk ditransfer. Jadi mengetahui cara ini penting jika Anda tidak memiliki run-as di OSX, tetapi skrip harus menjadi yang pertama untuk aplikasi debug.
Pikiran Anda, saya baru saja menulisnya hari ini dan mengujinya beberapa kali, jadi tolong beri tahu saya jika ada bug!