web-dev-qa-db-fra.com

Accès Android ADB aux bases de données d'application sans racine

Quelqu'un peut-il me dire s'il est possible d'utiliser la BAD pour extraire et pousser une base de données depuis une application sans privilèges root sur le téléphone?

Par exemple, je connais l'emplacement de ma magie enracinée et mon rêve est:

/data/data/com.xxxx.xxxx/databases/xxxx

Je sais que vous pouvez utiliser ADB sans root, mais lorsque vous essayez d'utiliser Shell, vous ne pouvez pas afficher cet emplacement sans root privaliges. Mais on m'a dit que vous pouvez utiliser Push and pull si vous connaissez le fichier que vous voulez?

En gros, je veux extraire une base de données de MY app sur un téléphone non root, la modifier et la repousser.

Le seul problème que j'ai, c'est que mes deux téléphones sont tous deux root et que je n'ai pas accès à un téléphone non root pour l'essayer.

33
Scoobler

Bien que la réponse de Nilhcem n'ait pas fonctionné pour moi, cela m'a conduit dans la bonne direction (pour celle que j'ai votée) et j'ai maintenant une solution de travail.

Ancienne réponse qui pourrait ne pas fonctionner avec les nouvelles versions d'Android:

#Transfer file from app databases directory to PC
adb Shell
$ run-as package.name
$ cd ./databases/
$ ls -l #Find the current permissions - r=4, w=2, x=1
$ chmod 666 ./dbname.db
$ exit
$ exit
adb pull /data/data/package.name/databases/dbname.db ~/Desktop/

#Transfer file from PC to app databases directory (requires the above permission change)
adb Push ~/Desktop/dbname.db /data/data/package.name/databases/dbname.db
adb Shell
$ run-as package.name
$ chmod 660 ./databases/dbname.db #Restore original permissions
$ exit
$ exit

Autre méthode utilisant le stockage externe (confirmé pour fonctionner avec 6.0.1):

#Transfer file from app databases directory to external storage
adb Shell
$ run-as package.name
$ cp ./databases/dbname.db /sdcard/
$ exit
$ exit

#Transfer file from external storage to app databases directory
adb Shell
$ run-as package.name
$ cp /sdcard/dbname.db ./databases/
$ exit
$ exit
77
Pilot_51

Une solution rapide consiste à utiliser la commande run-as pour copier la base de données dans un dossier auquel vous pouvez accéder, tel que /sdcard, puis effectuez un adb pull normal.

adb Shell
$ run-as package.name cp /data/data/package.name/dbname.db /sdcard/
$ exit
adb pull /sdcard/dbname.db

Plus d'informations sur la commande run-as ici

Notez que la commande run-as est disponible à partir du niveau 8 de l'API (Android 2.2) et ne peut être utilisée que si l'application est debbugable .

13
Nilhcem

Sur OxygenOS (basé sur Android 5.2), j'ai mélangé les deux solutions fournies par Pilot_51.

J'ai d'abord utilisé run-as pour accéder à /data/data/package.name/databases à partir d'ici. Je n'ai pas pu copier directement sur /sdcard/ et j'ai donc modifié l'autorisation du fichier. Après cela, j'ai quitté le mode run-as et utilisé cp pour copier le fichier dans le stockage /sdcard/. Finalement, j'ai pu utiliser adb pull

$ adb -s <DEVICE_ID> Shell
$ run-as package.name
$ chmod 666 databases/dbname.db
$ exit
$ cp /data/data/package.name/databases/dbname.db /sdcard/dbname.db
$ exit
$ adb pull /sdcard/dbname.db ./dbname.db
1
FredMaggiowski

si vous voulez pousser le fichier db dans l'application

tout d’abord, placez "fichier.db" sous "/ storage/emulated/0 /" en raison d’un problème d’autorisation. alors vous devriez prétendre comme une application pour accéder au dossier de données. 

  adb Shell
  $ run-as com.package.name
  :/data/data/com.package.name $ cp /storage/emulated/0/file.db /data/data/com.package.name/databases/

il copie le fichier.db qui dans le dossier principal aux bases de données.

0
AhuraMazda

Nous avons défini les autorisations de fichier sur lisibles pour tous les utilisateurs à partir de l'application.

if (BuildConfig.DEBUG)
{
    new File(mDB.getPath()).setReadable(true, false);
}

Ensuite, retirez le fichier .db avec adb normalement.

adb -d pull //data/data/xxxxx/databases/xxxxx.db .

NOTE: J'ai découvert que cela devait être fait chaque fois que le fichier de base de données était ouvert, par exemple dans onCreate ainsi que le constructeur de votre wrapper SQLiteOpenHelper (lorsque votre base de données n'était pas nulle) ou peut-être onOpen. Si seulement dans onCreate, la prochaine fois que vous exécuterez votre application et que le fichier .db existe déjà, pour une raison quelconque, les autorisations ont été modifiées. Cela pourrait avoir quelque chose à voir avec la façon dont Android gère ses données.

0
delrocco