Récupérez la base de données ou tout autre fichier à partir du stockage interne en utilisant run-as


113

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 run-ascommande avec le nom de mon package. La plupart des types de fichiers que je me contente de visualiser, mais avec la base de données, je voudrais les extraire de l'appareil Android.

Y a-t-il une commande download copyou movede 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 réponse ici consiste à transformer l'ensemble du package d'application en une archive compressée, mais il n'y a pas de réponse supplémentaire sur la façon d'extraire cette archive une fois que cela est fait et déplacé vers la machine, me laissant très distrait quand il pourrait y avoir une solution plus directe pour commencer



stackoverflow.com/questions/13006315 Extraire la base de données sans périphérique d'enracinement
Naveen Prince P

Réponses:


230

De par la conception userd'Android (c'est ce que vous avez sur votre téléphone jusqu'à ce que vous déverrouilliez le bootloader et flasher le téléphone avec userdebugou le englogiciel), il limite l'accès au stockage interne - chaque application ne peut accéder qu'à ses propres fichiers. Heureusement pour les développeurs de logiciels qui ne souhaitent pas rooter leurs téléphones, Google fournit un moyen d'accéder au stockage interne des versions déboguables de leurs packages à l'aide de la run-ascommande.

Pour télécharger le à /data/data/debuggable.app.package.name/databases/filepartir 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 dans 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

8
Ou, utilisez simplement run-aspour copier le fichier vers un emplacement sur le stockage externe et extrayez le fichier de base de données à partir de là, plutôt que de jouer avec les autorisations de fichier.
CommonsWare

5
Le run-as n'a pas la permission d'écrire sur la carte SD - il y a quelque chose de nouveau ajouté avec la dernière mise à jour ... :(
slott

4
Quand j'exécute le shell adb "run-as package.name chmod 666 /data/data/package.name/databases/file" adb termine l'erreur -> run-as: exec a échoué pour chmod666 Erreur: Autorisation refusée. Je suis dans la Nexus 7 sans root
Shudy

2
L'accès en écriture à la carte SD externe n'est plus possible avec adb.
slott

3
Si vous constatez que vous récupérez un fichier vierge ou presque vide, vous pouvez constater que le fichier est simplement une erreur de la console qui a été redirigée vers ce fichier que vous avez créé. Un problème fréquent ici est que vous essayez de copier une base de données à partir de la variante Release de votre application. Vous ne pouvez copier que les bases de données de la variante Debug de votre application . Si cela se produit, installez simplement la variante de débogage et réessayez la commande. J'espère que cela aide quelqu'un.
Aonghus Shortt le

73

La réponse acceptée ne fonctionne plus pour moi (bloquée 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 .

3
Cela devrait être la nouvelle réponse correcte OU @Alex P. vous devriez ajouter cette réponse pour les nouvelles versions d'Android. Dans mon cas également, j'ai dû utiliser 777 et l'appliquer d'abord au répertoire de la base de données avant de pouvoir accéder au fichier db.
muetzenflo

1
Mon appareil est enraciné, mais j'ai trouvé que je devais toujours exécuter supour que la run-ascommande fonctionne.
ThomasW

Et si vous n'avez pas de carte SD?
Gyum Fox

1
si vous n'avez pas de carte SD, il y a quand même un répertoire "sdcard".
arbresAreEverywhere

1
Génial!. il a travaillé pour moi aussi. Pouvons-nous créer un fichier batch / shell? juste en passant le nom du fichier db comme param et nous avons le fichier db.
Qadir Hussain

22

Si quiconque cherche à extraire la base de données de l' application de débogage peut utiliser la procédure ci-dessous:

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

rechercher et ouvrir l'explorateur de fichiers de périphérique

  1. Sélectionnez votre combiné, puis accédez au data/datarépertoire

aller au répertoire data / data

  1. Recherchez maintenant votre package d'application et accédez au dossier des bases de données. Vous pouvez voir les bases de données là-bas et sur un clic droit, vous aurez l'option de l'enregistrer dans votre lecteur.

entrez la description de l'image ici


1
Wow, tellement plus facile et plus sûr que d'utiliser adb-shell
user1708860

9

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

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

Il effectue 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 de l'appareil.
  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 \rcaractères que certains périphériques envoient au shell.

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


Ce script est destiné aux applications débuggables, que diriez-vous si l'application n'est pas débuggable?
blueware

Vos seules options sont susceptibles d'utiliser des outils de sauvegarde, si l'application en question expose ces données dans le cadre d'une sauvegarde. Au-delà de cela, j'ai peur que cela nécessite des autorisations élevées.
Paul Lammertsma

7

Je ne pouvais rien faire d'autre pour moi mais ceci:

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 du shell adb pour faire le pull.


3

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 > somefilepour 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

puis il extraira tous les fichiers du répertoire de bases de données de vos applications, qui est /data/data/com.example.myapplication/databases, dans le répertoire actuel.


1
même pour plusieurs fichiers, il ne s'agit que d'une seule commande. vérifiez la mise à jour stackoverflow.com/a/18472135/1778421 si vous préférez, vous pouvez également ajouter un autre tuyau du côté hôte pour décompresser les fichiers
Alex P.

2

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

Dans le shell de votre PC, exécutez:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>

Assez proche mais cela sort un db malformé pour moi.
Nae

1
#!/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

Si quelqu'un cherche une autre réponse qui peut être utilisée pour récupérer Databaseainsi queShared Preferences puis suivez cette étape:

Dans votre build.gradlefichier de votre application, ajoutez une ligne

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

maintenant, lorsque vous exécutez votre application en non-releasemode, votre application ouvrira automatiquement le port 8080 à partir de votre appareil, IP addressassurez-vous que votre appareil est connecté via wifiet que vous laptoppartagez le même réseau. Maintenant, visitez simplement 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 exécutant Android 5.1. L'exemple suivant est pour Windows.

Vous avez besoin de sed (ou sed.exe sous Windows, par exemple depuis cygwin.) (Sous Unix, ce sera juste là;)). Pour supprimer les mauvais caractères '\ r', au moins sur Windows.

Maintenant, exécutez simplement 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 / r de fin.

Bien sûr, vous devez remplacer "com.yourcompany.yourapp" par le nom du package de l'application et "YourDatabaseName" par le nom de la base de données dans l'application.


0

Le fichier de base de données est vide lors de l'utilisation 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 RoomDatabase.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.