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 download
copy
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.
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
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 .
J'ai publié un script Shell simple pour le vidage de bases de données:
Il exécute deux méthodes distinctes décrites ici:
\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.
Si vous recherchez une base de données à partir de debug application, utilisez la procédure ci-dessous:
- rechercher et ouvrir l'explorateur de fichier de périphérique
- Sélectionnez votre combiné et accédez au répertoire
data/data
- 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.
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.
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.
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>
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
pour regarder toutes les données de la base de données avec les préférences partagées.
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.
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:
Voici comment appeler close sur l'instance de RoomDatabase.
#!/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.