web-dev-qa-db-fra.com

Comment extraire les données (privées) de sa propre application Android?

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!

77
Calaf

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).

81
Calaf

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}
43
Trunst

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.

27
Vinicius Avellar

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.

19
Eric Van Bezooijen

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
5
Tamas

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

  1. Cliquez sur Afficher> Fenêtres d'outils> Explorateur de fichiers du périphérique ou cliquez sur le bouton Explorateur de fichiers du périphérique dans la barre de la fenêtre d'outils pour ouvrir l'explorateur de fichiers du périphérique.
  2. Sélectionnez un appareil dans la liste déroulante.
  3. 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.

 file Explorer

Documentation complète

2
Jon

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.

  1. 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.

  2. 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é.

  • Je suis donc allé sur http://www.Oracle.com/technetwork/Java/javase/downloads/jce8-download-2133166.html et j'ai téléchargé les fichiers de règles 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 indique 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 étudié et sur mon Mac avec Java 1.8, le bon endroit pour les placer était: <Java-home>/jre/lib/security. Je me suis assuré de sauvegarder les pots d'origine et de les y placer. Vola j'ai pu entrer un mot de passe avec abe.jar et le déchiffrer dans un fichier tar.

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!

2
Dave Thomas

Si vous utilisez un ordinateur Mac et un téléphone Samsung, procédez comme suit (depuis run-asne fonctionne pas sur Samsung et zlibne fonctionne pas sur Mac)

  1. Effectuez une sauvegarde du répertoire de données de votre application adb backup -f /Users/username/Desktop/data.ab com.example

  2. 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?

  3. Une fois la sauvegarde réussie, vous verrez le fichier data.ab sur votre bureau. Nous devons maintenant convertir ceci au format tar.

  4. Utilisez Android Backup Extractor pour cela. Télécharger | Code source

  5. Téléchargez-le et vous verrez le fichier abe.jar. Ajoutez ceci à votre variable PATH.

  6. 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

  7. Extrayez le fichier data.tar pour accéder à tous les fichiers 

2
Henry

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 ()

1

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
)
  • Exclure le -d à extraire de l'émulateur
  • Ne tape pas vos variables de session
  • Vous pouvez coller le bloc entier dans Terminal.app (ou supprimer les nouvelles lignes si vous le souhaitez)
1
Zack Morris

A partir du script Dave Thomas, j'ai pu écrire ma propre solution pour surmonter 2 problèmes:

  1. ma sauvegarde ne contenait que le fichier manifeste
  2. les fichiers binaires obtenus avec Dave Thomas étaient illisibles

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
1
Paolone

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).

0
serv-inc

tu peux faire: 

adb pull/stockage/émulé/0/Android/data //

0
Roi Bareket

Sauvegardé des données de jeu avec apk . Nougat Oneplus 2.

**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**
0
Samin Ali Mondal