Question

Quelqu'un peut-il me dire, est-il possible d'utiliser la BAD pour tirer et pousser une base de données à partir d'une application, sans les privilèges root au téléphone?

Par exemple, je sais que l'emplacement sur mon rêve et la magie enracinée est:

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

Je sais que vous pouvez utiliser la BAD sans racine, mais en essayant d'utiliser le shell - vous ne pouvez pas voir cet endroit sans privaliges racine. Mais on m'a dit que vous pouvez utiliser pousser et tirer si vous connaissez le fichier que vous voulez?

En fait, je veux tirer une base de données de mon application sur un téléphone non modifier racine et le pousser à nouveau.

Le seul problème que j'ai est, les deux téléphones que j'ai sont à la fois racine et je ne pas avoir accès à un non racine pour l'essayer.

Était-ce utile?

La solution

Alors que la réponse de Nilhcem n'a pas fonctionné pour moi, il me conduire dans la bonne direction (pour que j'upvoted) et j'ai maintenant une solution de travail.

Ancienne réponse qui ne fonctionne pas 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 une mémoire externe (confirmé pour travailler 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

Autres conseils

Une solution rapide est d'utiliser la commande run-as pour copier la base de données dans un dossier où vous pouvez avoir accès, tels que /sdcard puis, faire une adb pull normale

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

Plus d'informations sur l'exécution de la commande

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

Le OxygenOS (basé sur Android 5.2) J'ai mélangé les deux solutions fournies par Pilot_51.

D'abord, je l'ai utilisé run-as à gagner d'ici l'accès à /data/data/package.name/databases Je n'ai pas pu copier directement sur /sdcard/ donc j'ai changé l'autorisation du fichier. Après que je suis sorti du mode run-as et utilisé cp pour copier le fichier dans le stockage de /sdcard/. Finalement, je suis en mesure d'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

Nous avons mis les permissions de fichiers lisibles à tous les utilisateurs pour partir de l'application.

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

Ensuite, il suffit de tirer le .db off avec adb normalement.

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

Remarque: J'ai découvert que ce qui doit être fait à chaque fois que le fichier de base de données est ouverte, par exemple dans onCreate ainsi que le constructeur de votre wrapper SQLiteOpenHelper (lorsque votre base de données est non nul ) ou onOpen peut-être. Si seulement onCreate, la prochaine fois que vous exécutez votre application et le .db existe déjà, pour une raison quelconque les autorisations ont été modifiées en arrière. Cela pourrait avoir quelque chose à voir avec la façon dont Android gère ses données.

si vous voulez pousser le fichier db dans l'application

tout d'abord lieu « file.db » sous « / stockage / émulé / 0 / » en raison de problème d'autorisation. alors vous devriez faire semblant que l'application d'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/

copie le file.db que dans le dossier principal aux bases de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top