Diese Antwort basiert auf meinen Erfahrungen mit anderen Antworten und Kommentaren in den Antworten. Ich hoffe, ich kann jemandem in einer ähnlichen Situation helfen.
Ich mache das unter OSX via Terminal.
Zuvor hat die Antwort von Vinicius Avellar für mich hervorragend funktioniert. Ich brauchte die meiste Zeit nur die Datenbank vom Gerät aus einer Debug-Anwendung.
Heute hatte ich einen Anwendungsfall, in dem ich mehrere private Dateien benötigte . Am Ende hatte ich zwei Lösungen, die für diesen Fall gut funktionierten.
Verwenden Sie die akzeptierte Antwort zusammen mit den OSX-spezifischen Kommentaren von Someone Somewhere. Erstellen Sie ein Backup und verwenden Sie die Drittanbieterlösung
sourceforge.net/projects/adbextractor/files/?source=navbar , um sie in einen Teer zu entpacken. Ich werde am Ende dieser Antwort mehr über meine Erfahrungen mit dieser Lösung schreiben. Scrollen Sie nach unten, wenn Sie danach suchen.
Eine schnellere Lösung, mit der ich mich abgefunden habe. Ich habe ein Skript zum Abrufen mehrerer Dateien erstellt, ähnlich der Antwort von Tamas. Ich kann dies auf diese Weise tun, da meine App eine Debug-App ist und ich Zugriff auf Run-As auf meinem Gerät habe. Wenn Sie keinen Zugriff auf run-as haben, funktioniert diese Methode unter OSX nicht.
Hier ist mein Skript zum Abrufen mehrerer privater Dateien, die ich mit Ihnen, dem Leser, teilen werde, der auch diese großartige Frage untersucht;):
#!/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"`"
Inhalt:
https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4
Zurück zu Methode 1 : Entschlüsseln eines Backups mit Android Backup Extractor
Hier sind die Schritte, die ich auf meinem Mac unternommen habe, und die Probleme, auf die ich gestoßen bin:
Zuerst habe ich ein Backup in die Warteschlange gestellt (und ein Kennwort zum Verschlüsseln meines Backups festgelegt, mein Gerät hat es benötigt):
adb backup -f myAndroidBackup.ab com.corp.appName
Zweitens habe ich nur abe.jar von hier heruntergeladen: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Als nächstes rannte ich:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
Zu diesem Zeitpunkt erhielt ich eine Fehlermeldung. Da mein Archiv verschlüsselt ist, gab mir Java einen Fehler, den ich zum Installieren einiger Sicherheitsrichtlinienbibliotheken benötigte.
- Also ging ich zu http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html und lud die benötigten Sicherheitsrichtlinien-Jars herunter. In meinem Fall haben mir die Installationsanweisungen den falschen Speicherort für die JAR-Dateien mitgeteilt. Es heißt, dass der richtige Speicherort <java-home> / lib / security ist . Ich habe sie zuerst dort abgelegt und trotzdem die Fehlermeldung erhalten. Also habe ich nachgeforscht und auf meinem Mac mit Java 1.8 war der richtige Ort, um sie zu platzieren: <java-home> / jre / lib / security . Ich habe dafür gesorgt, dass die ursprünglichen Richtliniengläser gesichert und dort abgelegt wurden. Vola Ich konnte mit abe.jar ein Passwort eingeben und in eine TAR-Datei entschlüsseln.
Zuletzt bin ich gerade gelaufen ( nachdem ich den vorherigen Befehl erneut ausgeführt habe )
tar xvf myAndroidBackup.tar
Jetzt ist es wichtig zu beachten, dass es viel viel schneller geht, wenn Sie nur als Katze laufen können. Erstens erhalten Sie nur die gewünschten Dateien und nicht die gesamte Anwendung. Zweitens, je mehr Dateien (+ Verschlüsselung für mich), desto langsamer wird die Übertragung. Daher ist es wichtig zu wissen, wie dies zu tun ist, wenn Sie unter OSX kein Run-as haben, das Skript jedoch zuerst für eine Debug-Anwendung aufgerufen werden sollte.
Wohlgemerkt, ich habe es heute geschrieben und ein paar Mal getestet. Bitte benachrichtigen Sie mich über Fehler!