Tenter de tirer un seul fichier en utilisant
adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt
échoue avec
failed to copy '/data/data/com.corp.appName/files/myFile.txt myFile.txt' to 'myFile.txt': Permission denied
malgré cela, le débogage USB est activé sur le périphérique.
Nous pouvons contourner le problème par la voie archaïque
adb Shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt
mais cela est difficile à manier pour plusieurs fichiers.
Comment puis-je extraire le répertoire /data/data/com.corp.appName/files sur mon MacBook?
Faire cela directement ou via un transit dans `/ storage/sdcard0/myDir (à partir duquel je peux continuer avec Android File Transfer) est acceptable.
Commentaire additionnel
Il se peut que juste courir
adb backup -f myFiles com.corp.appName
va générer les fichiers que je cherche. Dans ce cas, je cherche un moyen de décompresser/décompresser la sauvegarde résultante!
adb backup écrira une archive spécifique à Android:
adb backup -f myAndroidBackup.ab com.corp.appName
Cette archive peut être convertie au format tar à l'aide de:
dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar
Référence:
http://nelenkov.blogspot.ca/2012/06/unpacking-Android-backups.html
Recherchez "Mise à jour" sur ce lien.
Vous pouvez également utiliser Extracteur de sauvegarde Android pour extraire des fichiers du fichier de sauvegarde Android (.ab
).
J'ai eu le même problème, mais j'ai résolu le problème en suivant:
$ adb Shell
$ run-as {app-package-name}
$ cd /data/data/{app-package-name}
$ chmod 777 {file}
$ cp {file} /mnt/sdcard/
Après cela, vous pouvez courir
$ adb pull /mnt/sdcard/{file}
Voici ce qui a fonctionné pour moi:
adb -d Shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
J'imprime la base de données directement dans un fichier local.
Sur MacOSX, en combinant les réponses de Calaf et Ollie Ford, les éléments suivants ont fonctionné pour moi.
Sur la ligne de commande (assurez-vous que adb est sur votre chemin, le mien était à ~/Bibliothèque/Android/sdk/platform-tools/adb) et avec votre appareil Android branché et en mode de débogage USB, exécutez:
adb backup -f backup com.mypackage.myapp
Votre appareil Android vous demandera la permission de sauvegarder vos données. Sélectionnez "SAUVEGARDER MES DONNÉES"
Attends quelques instants.
La sauvegarde de fichier apparaîtra dans le répertoire où vous avez exécuté adb.
Maintenant, lancez:
dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar
Vous avez maintenant un fichier backup.tar que vous pouvez décompresser comme ceci:
tar xvf backup.tar
Et voir tous les fichiers stockés par votre application.
Vous pouvez utiliser ce script Shell ci-dessous. Il est également capable d'extraire des fichiers du cache de l'application, contrairement à l'outil adb backup
:
#!/bin/sh
if [ -z "$1" ]; then
echo "Sorry script requires an argument for the file you want to pull."
exit 1
fi
adb Shell "run-as com.corp.appName cat '/data/data/com.corp.appNamepp/$1' > '/sdcard/$1'"
adb pull "/sdcard/$1"
adb Shell "rm '/sdcard/$1'"
Ensuite, vous pouvez l'utiliser comme ceci:
./pull.sh files/myFile.txt
./pull.sh cache/someCachedData.txt
Les versions les plus récentes d'Android Studio incluent l'explorateur de fichiers périphérique, que j'ai trouvé très pratique comme méthode de téléchargement des fichiers à l'aide d'une interface graphique, à partir de mon développement Nexus 7.
Vous devez vous assurer que vous avez activé le débogage USB sur le périphérique
Interagissez avec le contenu du périphérique dans la fenêtre de l'explorateur de fichiers. Cliquez avec le bouton droit de la souris sur un fichier ou un répertoire pour créer un nouveau fichier ou répertoire, enregistrez le fichier ou le répertoire sélectionné sur votre ordinateur, téléchargez, supprimez ou synchronisez. Double-cliquez sur un fichier pour l'ouvrir dans Android Studio.
Android Studio enregistre les fichiers ainsi ouverts dans un répertoire temporaire situé en dehors de votre projet. Si vous apportez des modifications à un fichier que vous avez ouvert à l'aide de l'Explorateur de fichiers du périphérique et souhaitez sauvegarder vos modifications sur le périphérique, vous devez télécharger manuellement la version modifiée du fichier sur le périphérique.
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 pouvoir aider quelqu'un dans une situation similaire.
Je le fais sur OSX via un terminal.
Auparavant, la réponse de Vinicius Avellar a bien fonctionné pour moi. La plupart du temps, je n'avais besoin que de la base de données du périphérique 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 cette affaire.
Utilisez la réponse acceptée avec les commentaires spécifiques de Someone Somewhere à OSX. Créez une sauvegarde et utilisez la solution tierce, sourceforge.net/projects/adbextractor/files/?source=navbar à décompresser dans un goudron. J'écrirai plus en détail 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 j'ai réglé. J'ai créé un script pour extraire plusieurs fichiers similaire à la réponse de Tamas. Je suis capable de le faire De cette façon, parce que mon application est une application de débogage et que 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 sur OSX.
Voici mon script pour extraire plusieurs fichiers privés que je partagerai avec vous, le lecteur, qui enquête également sur cette question épineuse;):
#!/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échiffrement d'une sauvegarde à l'aide de 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 en file d'attente une sauvegarde (et définir un mot de passe pour crypter ma sauvegarde, mon appareil l'exigeait):
adb backup -f myAndroidBackup.ab com.corp.appName
Deuxièmement, j'ai juste téléchargé 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. Parce que mes archives sont cryptées, Java m'a dit qu'il me fallait installer certaines bibliothèques de règles de sécurité.
Enfin, je viens de courir (après avoir relancé la commande précédente _)
tar xvf myAndroidBackup.tar
Maintenant, il est important de noter que si vous pouvez simplement courir comme un chat, c'est beaucoup plus rapide. Premièrement, vous n’obtenez que les fichiers de votre choix et non l’application complète. Deuxièmement, plus le nombre de fichiers (+ cryptage pour moi) est élevé, plus le transfert est lent. Il est donc important de savoir procéder de cette manière si vous n’avez pas d’exécution sous OSX, mais le script doit tout d’abord être lu pour une application de débogage.
Remarquez que je viens de l'écrire aujourd'hui et de l'avoir testé plusieurs fois, alors s'il vous plaît, informez-moi de tout bug!
Si vous utilisez un ordinateur Mac et un téléphone Samsung, procédez comme suit (depuis run-as
ne fonctionne pas sur Samsung et zlib
ne fonctionne pas sur Mac)
Effectuez une sauvegarde du répertoire de données de votre application adb backup -f /Users/username/Desktop/data.ab com.example
Un mot de passe vous sera demandé pour chiffrer votre téléphone. N'entrez aucun mot de passe. Appuyez simplement sur "Sauvegarder mes données". Voir Comment prendre BackUp?
Une fois la sauvegarde réussie, vous verrez le fichier data.ab
sur votre bureau. Nous devons maintenant convertir ceci au format tar
.
Utilisez Android Backup Extractor pour cela. Télécharger | Code source
Téléchargez-le et vous verrez le fichier abe.jar
. Ajoutez ceci à votre variable PATH.
Exécutez ceci pour générer le fichier tar: Java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar
Extrayez le fichier data.tar pour accéder à tous les fichiers
Après avoir défini les bonnes autorisations en ajoutant le code suivant:
File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner
adb pull
fonctionne comme vous le souhaitez.
voir File.setReadable ()
Semblable à La réponse de Tamas , voici une ligne pour Mac OS X permettant d'extraire tous les fichiers de l'application avec your.app.id
sur votre appareil et de les enregistrer dans (dans ce cas) ~/Desktop/your.app.id
:
(
id=your.app.id &&
dest=~/Desktop &&
adb Shell "run-as $id cp -r /data/data/$id /sdcard" &&
adb -d pull "/sdcard/$id" "$dest" &&
if [ -n "$id" ]; then adb Shell "rm -rf /sdcard/$id"; fi
)
-d
à extraire de l'émulateurA partir du script Dave Thomas, j'ai pu écrire ma propre solution pour surmonter 2 problèmes:
Ceci est mon script, qui copie les données de l'application sur la carte SD puis le tire
#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 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
adb Shell "run-as $packageName cp -r /data/data/$packageName/ /sdcard/$packageName"
adb pull /sdcard/$packageName
adb Shell rm -rf /sdcard/$packageName
Est-ce que cela signifie que l’on peut chmoder le répertoire de monde: - x à monde: r-x assez longtemps pour pouvoir récupérer les fichiers?
Oui, exactement. Bizarrement, vous avez également besoin que le fichier ait le bit x
défini. (au moins sur Android 2.3)
chmod 755
tout au long de la tâche a fonctionné pour copier un fichier (mais vous devez rétablir les autorisations ultérieurement si vous prévoyez de continuer à utiliser le périphérique).
tu peux faire:
adb pull/stockage/émulé/0/Android/data //
Sauvegardé des données de jeu avec apk . Nougat Oneplus 2.
**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**