web-dev-qa-db-fra.com

android adb, récupérer la base de données en utilisant run-as

Sur un appareil Android non root, je peux accéder au dossier de données contenant la base de données à l'aide de la commande run-as avec le nom de mon package. La plupart des types de fichiers que je me contente de regarder, mais avec la base de données, je voudrais extraire si à partir du périphérique Android.

Existe-t-il une commande downloadcopy ou move dans cette partie du shell adb? Je souhaite télécharger le fichier de base de données et afficher son contenu à l'aide d'un navigateur de base de données.

Une solution consiste à transformer un package d'application complet en une archive compressée, mais il n'y a pas d'autre réponse sur la façon d'extraire cette archive une fois que cela est fait et transféré sur la machine, me laissant très distrait lorsqu'il pourrait y avoir une solution plus directe pour commencer.

93
CQM

De par sa conception, user build d’Android (c’est ce que vous avez sur votre téléphone jusqu’à déverrouiller bootloader et à flasher le téléphone avec le logiciel userdebug ou eng) restreint l’accès au stockage interne - chaque application ne peut accéder qu’à son propres fichiers. Heureusement pour les développeurs de logiciels qui n'acceptent pas root leurs téléphones, Google fournit un moyen d'accéder aux versions Internal Storage de debuggable de leurs packages à l'aide de la commande run-as

Pour télécharger le /data/data/debuggable.app.package.name/databases/file à partir d'un appareil Android 5.1+, exécutez la commande suivante:

adb exec-out run-as debuggable.app.package.name cat databases/file > file

Pour télécharger plusieurs fichiers d’un dossier sous le /data/data/debuggable.app.package.name/ à la fois, utilisez tar:

adb exec-out run-as debuggable.app.package.name tar c databases/ > databases.tar
adb exec-out run-as debuggable.app.package.name tar c shared_prefs/ > shared_prefs.tar
205
Alex P.

La réponse acceptée ne fonctionne plus pour moi (bloqué par Android?)

Alors à la place, j'ai fait ceci:

> adb Shell
shell $ run-as com.example.package
Shell $ chmod 666 databases/file
Shell $ exit                                               ## exit out of 'run-as'
Shell $ cp /data/data/package.name/databases/file /sdcard/
Shell $ run-as com.example.package
Shell $ chmod 600 databases/file
> adb pull /sdcard/file .
63
marmor

J'ai publié un script Shell simple pour le vidage de bases de données:

https://github.com/Pixplicity/humpty-dumpty-Android

Il exécute deux méthodes distinctes décrites ici:

  1. Tout d'abord, il essaie de rendre le fichier accessible aux autres utilisateurs et tente de l'extraire du périphérique.
  2. Si cela échoue, il diffuse le contenu du fichier sur le terminal vers la machine locale. Il effectue une astuce supplémentaire pour supprimer les caractères \r que certains périphériques transmettent au shell.

À partir de là, vous pouvez utiliser diverses applications CLI ou GUI SQLite, telles que sqlite3 ou sqlitebrowser, pour parcourir le contenu de la base de données.

8
Paul Lammertsma

Si vous recherchez une base de données à partir de debug application, utilisez la procédure ci-dessous:

  1. rechercher et ouvrir l'explorateur de fichier de périphérique

 search and open device file Explorer

  1. Sélectionnez votre combiné et accédez au répertoire data/data

 go to data/data directory

  1. Maintenant, trouvez votre paquet d'application et accédez au dossier des bases de données. Vous pouvez voir les bases de données là-bas et après un clic droit, vous aurez l'option pour enregistrer ceci dans votre lecteur.

 enter image description here

7
Ifta

Je n'ai rien pu faire d'autre pour moi si ce n'est:

adb Shell
run-as package.name
cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db
exit
exit
adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/

La première sortie est de sortir du run-as, la deuxième sortie est de sortir de adb Shell pour faire le pull.

5
Triplee121

Pour la version de débogage de l'application, il est très pratique d'utiliser la commande adb exec-out run-as xxx.yyy.zzz cat somefile > somefile pour extraire un seul fichier. Mais vous devez faire plusieurs fois pour plusieurs fichiers. Voici un script simple que j'utilise pour extraire le répertoire.

#!/bin/bash
P=
F=
D=

function usage()
{
    echo "$(basename $0) [-f file] [-d directory] -p package"
    exit 1
}

while getopts ":p:f:d:" opt
do
    case $opt in
        p)
            P=$OPTARG
            echo package is $OPTARG
            ;;
        f)
            F=$OPTARG
            echo file is $OPTARG
            ;;
        d)
            D=$OPTARG
            echo directory is $OPTARG
            ;;
        \?)
            echo Unknown option -$OPTARG
            usage
            ;;
        \:)
            echo Required argument not found -$OPTARG
            usage
            ;;
    esac
done

[ x$P == x ] && {
    echo "package can not be empty"
    usage
    exit 1
}

[[ x$F == x  &&  x$D == x ]] && {
    echo "file or directory can not be empty"
    usage
    exit 1
}

function file_type()
{
    # use printf to avoid carriage return
    __t=$(adb Shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"")
    echo $__t
}

function list_and_pull()
{
    t=$(file_type $1)
    if [ $t == d ]; then
        for f in $(adb Shell run-as $P ls $1)
        do
            # the carriage return output from adb Shell should
            # be removed
            mkdir -p $(echo -e $1 |sed $'s/\r//')
            list_and_pull $(echo -e $1/$f |sed $'s/\r//')
        done
    else
        echo pull file $1
        [ ! -e $(dirname $1) ] && mkdir -p $(dirname $1)
        $(adb exec-out run-as $P cat $1 > $1)
    fi
}

[ ! -z $D ] && list_and_pull $D
[ ! -z $F ] && list_and_pull $F

J'espère que ce serait utile. Ce script est également disponible sur Gist

L'utilisation typique est 

$ ./exec_out.sh -p com.example.myapplication -d databases

il extraira ensuite tous les fichiers du répertoire de votre base de données d'applications, qui est /data/data/com.example.myapplication/databases, dans le répertoire actuel.

2
alijandro

Une approche beaucoup plus simple pour télécharger le fichier sur votre ordinateur local:

Dans votre PC Shell, exécutez:

adb -d Shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
1
Emre

Si quelqu'un recherche une autre réponse pouvant être utilisée pour extraire Database ainsi que Shared Preferences, procédez comme suit:

Dans votre fichier build.gradle de votre ligne d'ajout d'application

debugCompile 'com.amitshekhar.Android:debug-db:1.0.0'

désormais, lorsque vous exécutez votre application en mode non-release, votre application ouvrira automatiquement le port 8080 à partir de votre appareil IP address. assurez-vous que votre appareil est connecté via wifi et que votre laptop partage le même réseau. Maintenant, il suffit de visiter l'URL 

http: // your_mobile_device_ip: 8080/

pour regarder toutes les données de la base de données avec les préférences partagées.

0

Voici une solution qui fonctionne sur un appareil sous Android 5.1. L'exemple suivant concerne Windows. 

Vous avez besoin de sed ([ https://www.gnu.org/software/sed/manual/sed.html] ou sed.exe sous Windows, par exemple depuis cygwin.) Là ;) ). Pour supprimer les "\ r" caractères incorrects, au moins sous Windows.

Maintenant, lancez la commande suivante:

adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db

La commande sed supprime les caractères de fin/r.

Bien entendu, vous devez remplacer "com.votreentreprise.votre application" par le nom du package de l'application et "Votre nom de base de données" par le nom de la base de données de l'application. 

0
treesAreEverywhere

Le fichier de base de données est emtpy lors de l’utilisation de adb run-as. Cela peut être résolu en appelant close () sur l'instance RoomDatabase. Appelez close () pour laisser SQLite écrire son journal sur le disque. J'ai créé ce bouton qui ferme la connexion à la base de données sur demande:

via GIPHY

Voici comment appeler close sur l'instance de RoomDatabase.

0
Eimert
#!/bin/bash
#export for adb
export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools

adb -d Shell 'run-as com.Android.app  cp /data/data/com.Android.app/files/db.realm /sdcard'
adb pull sdcard/db.realm /Users/userMe/Desktop/db

Vous pouvez utiliser ce script pour obtenir la base de données Realm.

0
dralexnumber