Je travaille actuellement sur une application WiFi pour Android. Je ne parviens pas à accéder à la base de données sur le périphérique. Le débogage dans l'émulateur ne fonctionne pas pour moi, car l'émulateur ne prend pas en charge le WiFi. J'ai essayé d'extraire le fichier de base de données de l'appareil en utilisant
adb pull data/data/package-name/databases/database-name
Mais j'obtiens l'erreur "Autorisation refusée". Dans cette réponse Android: Où sont stockés les fichiers de base de données? , Commonsware a suggéré d'extraire le fichier de base de données en s'exécutant en mode débogage. Mais ça ne marche pas aussi. Toute aide sur la façon de déboguer la base de données sans enregistrer le périphérique serait grandement appréciée.
Je vais me répéter de une autre réponse :
À partir de l’API 8 (Android 2.2), si vous construisez l’application en tant que debuggable, vous pouvez utiliser la commande Shell
run-as
pour exécuter une commande ou un exécutable en tant qu’utilisateur/application spécifique ou simplement basculer sur laUID
de votre application pour pouvoir y accéder. son répertoire de données.
Donc, si vous souhaitez extraire votre base de données d'application du périphérique, vous devez exécuter la version de débogage de l'application, vous connecter avec adb Shell
et exécuter la commande suivante:
run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite
Cela va copier votre db-file
à la racine de votre carte SD/stockage externe. Maintenant, vous pouvez facilement l'obtenir à l'aide du gestionnaire de fichiers, de adb pull
ou de ce que vous préférez. Notez qu'avec cette approche, votre application n'a PAS besoin d'avoir l'autorisation WRITE_EXTERNAL_STORAGE
, car la copie est effectuée par l'utilisateur Shell, qui peut toujours écrire sur le stockage externe.
Sur les systèmes Linux/Mac, il est possible de copier une base de données directement sur votre ordinateur avec la commande suivante, que vous pouvez utiliser sans entrer dans le shell adb:
adb Shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite
Toutefois, cela ne fonctionnera pas correctement sous Windows en raison de la conversion des symboles CR/LF. Utilisez l'ancienne méthode ici.
J'utilise ce script shell sur mon MAC, qui copie la base de données directement dans mon dossier personnel. Solution simple en un clic, il suffit de changer le nom du package (com.example.app) et le nom de la base de données (database.sqlite).
Script simple
#!/bin/bash
adb -d Shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/
Script acceptant les arguments [nom_package] [base de données]
#!/bin/bash
REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"
if [ $# -ne $REQUIRED_ARGS ]
then
echo ""
echo "Usage:"
echo "Android_db_move.sh [package_name] [db_name]"
echo "eg. Android_db_move.sh lt.appcamp.impuls impuls.db"
echo ""
exit 1
fi;
echo""
cmd1="$ADB_PATH -d Shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"
echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
then
echo ".........OK"
fi;
echo $cmd2
eval $cmd2
if [ $? -eq 0 ]
then
echo ".........OK"
fi;
exit 0
Le meilleur moyen de visualiser et de gérer votre base de données d'applications Android est d'utiliser cette bibliothèque https://github.com/sanathp/DatabaseManager_For_Android
Avec cette bibliothèque, vous pouvez gérer votre base de données d'applications SQLite à partir de votre application elle-même . Vous pouvez afficher les tables de votre base de données d'applications, mettre à jour, supprimer, insérer des lignes dans vos tables .Tout depuis votre application.
C’est un fichier d’activité Java unique, il suffit d’ajouter le fichier Java à votre dossier source. Une fois le développement terminé, supprimez le fichier Java de votre dossier src.
Cela m'a beaucoup aidé. J'espère que cela vous aidera aussi.
Vous pouvez voir la démonstration d'une minute ici: http://youtu.be/P5vpaGoBlBY
Si vous obtenez
The system cannot find the path specified.
essayer
adb -d Shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"
Notez la double citation!
Dans mon application, j'exporte la base de données sur la carte SD. Une fois que la base de données est sur la carte SD, vous pouvez y accéder en connectant le périphérique à votre ordinateur.
Regardez ce post: Faire une sauvegarde de la base de données sur SDCard sous Android
Bien que, c’est une vieille question, je pense qu’elle est toujours pertinente et mérite une réponse actuelle. Il existe des outils permettant d’inspecter directement les bases de données (sans qu’il soit nécessaire de les extraire du périphérique ou de l’émulateur).
L'outil que j'ai découvert le plus récemment (et que je préfère surtout) est Android Debug Database .
Il vous suffit d'ajouter cette dépendance:
debugImplementation 'com.amitshekhar.Android:debug-db:1.0.3'
Aucun autre code n'est requis . Après avoir lancé votre application, ouvrez logcat et filtrez pour "DebugDB" et vous trouverez un message disant
D/DebugDB: Open http://192.168.178.XXX:8080 in your browser
Cela fonctionne avec tous les navigateurs et vous pouvez inspecter vos tables de base de données et vos préférences partagées.
Cela fonctionne également avec les émulateurs par défaut et Genymotion.
L'outil que j'ai utilisé auparavant est stetho .
Inconvénient: vous devez ajouter un peu de code et vous êtes lié au navigateur Chrome.
Avantage: vous avez également la possibilité d'inspecter le trafic réseau.
J'ai simplement fait:
$ adb Shell
shell@Android:/ $ run-as myapp.package.name sh
Shell@Android:/data/data/myapp.package.name $
Ensuite, je peux déboguer une base de données sqlite ou tout ce que je veux faire avec Shell avec les autorisations appropriées.
Il est possible, si un apk est débogable, d’utiliser un programme appelé run-as à partir du shell (non root) adb pour copier le fichier privé d’une application.
Voici des instructions étape par étape, principalement issues d'une combinaison des autres réponses. Cela fonctionne avec des appareils qui ne sont pas déverrouillés.
Connectez votre appareil et lancez l'application en mode débogage.
Copiez le fichier de base de données de votre dossier d’application sur votre carte SD: exécutez:
./adb -d Shell 'run-as com.votrepackge.name cat /data/data/com.votrepackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'
Tirez les fichiers de base de données sur votre machine: exécutez:
./adb tirer/sdcard/execute: ./adb
Installez Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/
Ouvrez Firefox SQLLite Manager et ouvrez votre fichier de base de données à partir de l'étape 3 ci-dessus.
Prendre plaisir!
Vous devez exécuter adb en tant que root ou l’utiliser sur un téléphone rooté.
Pour exécuter adb en tant que root, utilisez adb root
Voir aussi: Pourquoi l'accès au dossier de données est-il refusé lors de l'utilisation d'adb?
Aucune des solutions run-as
- et-cat-to-sdcard ne fonctionnait pour moi sous Android 4.4.2. Je ne suis pas sûr, mais je suppose que cela peut être dû à l'outil run-as
qui ne gère pas correctement les nouvelles autorisations sdcard_r
et sdcard_rw
.
J'ai d'abord dû copier le fichier de base de données dans /files
dans la mémoire de stockage interne privée de mon application:
Shell@hammerhead:/ $ run-as com.example.myapp
Shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb
Ensuite, j'ai copié /sdcard/Android/data/com.example.myapp/files
dans Javaland (cela nécessite l'autorisation WRITE_EXTERNAL_STORAGE
):
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
if (isExternalStorageWritable()) {
final FileInputStream input;
try {
input = openFileInput("mydb");
File output = new File(getExternalFilesDir(null), "mydb");
copy(input, output);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void copy(FileInputStream in, File dst) throws IOException {
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
}
Enfin, j'ai copié le fichier sur mon ordinateur portable:
$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
Si vous rencontrez un problème similaire, essayez comme ceci:
adb Shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
adb pull /data/data/package/databases/yourdb.sqlite
cd <Android_SDK_PATH>
(pour moi sous Windows cd C:\Users\Willi\AppData\Local\Android\sdk
)cd platform-tools
adb Shell
(cela ne fonctionne que si un seul émulateur est en cours d'exécution)cd data/data
su
(obtenir les privilèges de super utilisateur)cd <PACKAGE_NAME>/databases
sqlite3 <DB_NAME>
;
, sinon l'instruction n'est pas émise et passe à une nouvelle ligne)Remarque: Utilisez ls
(Linux) ou dir
(Windows) si vous devez répertorier le contenu du répertoire.
Essayez cette application: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Il fournit un accès à distance à votre base de données sans la retirer.
En version payante, il dispose d'un accès racine pour une base de données privée (/ data/data/nom-package ...) ou implémente un fournisseur de contenu pour se connecter à l'aide de SQLiteWeb (Instructions dans l'application)
Mais si vous voulez rester avec la version gratuite, vous pouvez créer votre base de données dans un stockage externe:
database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
+ "/" + DATABASE_NAME, null, DATABASE_VERSION);
Sous OSX, en utilisant @Tadas, répondez avec automator et sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):
ouvrez Automator et créez un nouveau flux de travail.
ajoutez l'action "Run Shell Script".
Coller ceci:
source ~/.bash_profile adb Shell 'run-as cat /data/data/votre_app_uid/databases/db.name> /tmp/db.name'adb tirer /tmp/db.name ~ /open -a sqlitebrowser ~/db.name
cliquez sur Exécuter pour actualiser la base de données sur sqlitebrowser.