Cette réponse est basée sur mon expérience avec d'autres réponses et des commentaires dans les réponses. J'espère que je peux aider quelqu'un dans une situation similaire.
Je fais cela sur OSX via un terminal.
Auparavant, la réponse de Vinicius Avellar fonctionnait très bien pour moi. J'avais seulement la plupart du temps besoin de la base de données de l'appareil à partir d'une application de débogage.
Aujourd'hui, j'ai eu un cas d'utilisation où j'avais besoin de plusieurs fichiers privés . Je me suis retrouvé avec deux solutions qui ont bien fonctionné pour ce cas.
Utilisez la réponse acceptée avec les commentaires spécifiques OSX de Someone Somewhere. Créez une sauvegarde et utilisez la solution tierce,
sourceforge.net/projects/adbextractor/files/?source=navbar pour décompresser dans un tar. J'écrirai plus sur mon expérience avec cette solution au bas de cette réponse. Faites défiler vers le bas si c'est ce que vous recherchez.
Une solution plus rapide avec laquelle je me suis installé. J'ai créé un script pour extraire plusieurs fichiers similaires à la réponse de Tamas. Je peux le faire de cette façon car mon application est une application de débogage et j'ai accès à run-as sur mon appareil. Si vous n'avez pas accès à run-as, cette méthode ne fonctionnera pas pour vous sous OSX.
Voici mon script pour extraire plusieurs fichiers privés que je partagerai avec vous, le lecteur, qui étudie également cette question géniale;):
#!/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
Retour à la méthode 1 , décrypter une sauvegarde à l'aide d' Android Backup Extractor
Voici les étapes que j'ai suivies sur mon Mac et les problèmes que j'ai rencontrés:
J'ai d'abord mis une sauvegarde en file d'attente (et défini un mot de passe pour crypter ma sauvegarde, mon appareil en avait besoin):
adb backup -f myAndroidBackup.ab com.corp.appName
Deuxièmement, j'ai téléchargé juste abe.jar à partir d'ici: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Ensuite, j'ai couru:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
À ce stade, j'ai reçu un message d'erreur. Comme mon archive est chiffrée, java m'a donné une erreur dont j'avais besoin pour installer certaines bibliothèques de politiques de sécurité.
- Je suis donc allé sur http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html et j'ai téléchargé les jars de politique de sécurité dont j'avais besoin. Maintenant, dans mon cas, les instructions d'installation m'ont indiqué le mauvais emplacement pour mettre les fichiers jar. Il dit que l'emplacement approprié est <java-home> / lib / security . Je les ai mis là en premier et j'ai toujours le message d'erreur. J'ai donc enquêté et sur mon Mac avec Java 1.8, le bon endroit pour les mettre était: <java-home> / jre / lib / security . Je me suis assuré de sauvegarder les jars de politique d'origine et de les y mettre. Vola J'ai pu entrer un mot de passe avec abe.jar et déchiffrer dans un fichier tar.
Enfin, je viens de courir ( après avoir réexécuté la commande précédente )
tar xvf myAndroidBackup.tar
Maintenant, il est important de noter que si vous pouvez simplement courir en tant que chat, c'est beaucoup plus rapide. Premièrement, vous n'obtenez que les fichiers souhaités et non l'application entière. Deuxièmement, plus il y a de fichiers (+ cryptage pour moi), plus le transfert est lent. Il est donc important de savoir comment procéder de cette manière si vous ne disposez pas de run-as sur OSX, mais le script doit être utilisé en premier pour une application de débogage.
Remarquez que je viens de l'écrire aujourd'hui et de l'avoir testé quelques fois, alors veuillez me signaler tout bogue!