199 votes

Pourquoi l'accès au dossier de données est-il refusé lorsque j'utilise adb ?

Je me suis connecté à mon appareil en direct en utilisant l'adb et les commandes suivantes :

C:\>adb -s HT829GZ52000 shell
$ ls
ls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
logo.rle
init.trout.rc
init.rc
init.goldfish.rc
init
default.prop
data
root
dev
$ cd data
cd data
$ ls
ls
opendir failed, Permission denied

J'ai été surpris de voir que l'accès m'était refusé. Comment se fait-il que je ne puisse pas naviguer dans les répertoires en utilisant la ligne de commande comme ça ?

Comment obtenir l'accès Root sur mon téléphone ?

0 votes

Simple... Assurez-vous que l'écran de votre téléphone est allumé. Cliquez sur "Autoriser" quand il est demandé si vous voulez que l'inconnu ait accès à Root. C'est fait.

0 votes

J'ai décidé de créer un simple avd pour avoir accès à la base de données. Quelqu'un a-t-il des liens vers des guides, sans flare et graphiques "personnalisés" pour les développeurs ? Juste comment obtenir un simple Android vanilla sur un appareil acheté.

0 votes

Aucune invite de ce type ne se produit sur mon appareil Android 7.1.1. Mais adb va de l'avant et liste le contenu du répertoire. Le problème est que le contenu n'existe pas réellement. J'utilise adb-sync pour ajouter le contenu. C'est assez bizarre.

238voto

Idolon Points 11503

À partir du niveau 8 de l'API (Android 2.2), pour l'application débuggable (celle qui est construite par Android Studio tout le temps, sauf si la version release a été demandée), vous pouvez utiliser le shell run-as pour exécuter une commande ou un exécutable en tant qu'utilisateur/application spécifique ou simplement passer à la commande UID de votre application afin que vous puissiez accéder à son données répertoire.

Lister le contenu du répertoire de votre application :

run-as com.yourapp ls -l /data/data/com.yourapp

Passer à l'UID de com.yourapp et exécuter toutes les commandes suivantes en utilisant cet uid (jusqu'à ce que vous appeliez exit ):

run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit

 
Note 1 : il existe un problème connu avec certains téléphones HTC Desire. En raison d'un propriétaire/des autorisations non standard du /data/data répertoire, run-as ne fonctionne pas sur ces téléphones.

Note 2 : Comme indiqué dans les commentaires par @Avio : run-as a également des problèmes avec les téléphones Samsung Galaxy S utilisant Cyanogenmod, quelle que soit la version (de 7 à 10.1), car sur cette plateforme /data/data est un lien symbolique vers /datadata . Une façon de résoudre le problème est de remplacer le lien symbolique par le répertoire réel (malheureusement, cela nécessite généralement un accès Root).

2 votes

Cela fonctionne comme vous l'avez expliqué où vous run-as com.mypackage . Le problème que je rencontre est le suivant sqlite3 /data/data/com.mypackage/databases/mydb indique "sqlite3 : permission denied". sqlite3 ne peut-il être exécuté que par Root ?

1 votes

@styfle Ça veut dire que soit vous n'avez pas la permission de vous exécuter. sqlite3 exécutable (ou accéder au dossier où il est situé), ou il n'y a pas de sqlite3 du tout sur votre téléphone (voir par exemple : stackoverflow.com/a/3645800/648313 )

1 votes

@styfle Check stackoverflow.com/a/8433520/648313 pour la solution possible de sqlite3 problème que vous avez.

150voto

Reto Meier Points 55904

Il y a deux choses à retenir si vous voulez tout parcourir sur votre appareil.

  1. Vous devez disposer d'un téléphone avec un accès Root pour pouvoir parcourir le dossier de données d'un téléphone Android. Cela signifie que soit vous avez un appareil pour développeur ( ADP1 ou un ION de Google I/O) ou vous avez trouvé un moyen de "Rooter" votre téléphone d'une autre manière.
  2. Vous devez exécuter ADB en mode Root, faites-le en exécutant : adb root

85 votes

Et "adb Root" nécessite une construction personnalisée d'adb, sinon "adbd ne peut pas fonctionner en tant que Root dans les constructions de production".

17 votes

Une version personnalisée d'adb ? où puis-je l'obtenir ?

10 votes

Une réponse à la question de @Gopinath ?

57voto

abbood Points 5959

avant de commencer, avez-vous un enraciné Si ce n'est pas le cas, je vous suggère fortement de faire le saut. 99% des tutoriels qui vous aident à le faire exigent que vous ayez un téléphone enraciné (je le sais parce que j'ai passé environ une heure à chercher un moyen de le faire sans avoir un téléphone enraciné je n'en ai pas trouvé ) aussi si vous y pensez, votre iPhone doit aussi être enraciné pour faire cette même tâche. C'est donc tout à fait raisonnable. Plus d'informations sur l'enracinement à la fin de la réponse.

à partir de votre ligne de commande :

adb shell

cela vous amène à la ligne de commande de votre shell Android (vous devriez voir quelque chose comme ceci : shell@android:/ $ maintenant type :

shell@android:/ $run-as com.domain.yourapp

cela devrait vous amener directement au répertoire de données de com.domain.yourapp :

shell@android:/data/data/com.domain.yourapp $ 

Si ce n'est pas le cas (c'est-à-dire si vous obtenez une erreur), vous n'avez probablement pas de téléphone rooté, ou vous n'avez pas utilisé vos privilèges d'utilisateur Root. Pour utiliser vos privilèges d'utilisateur Root, tapez su sur la ligne de commande adb et voyez ce qui se passe, si vous obtenez une erreur, alors votre téléphone n'est pas enraciné. S'il ne l'est pas, enracinez-le d'abord puis continuez ces instructions.

de là, vous pouvez taper ls et vous verrez tous les répertoires, y compris les dbs :

shell@android:/data/data/com.domain.yourapp $ ls

cache
databases
lib
shared_prefs   

après cela, vous pouvez utiliser sqlite3 pour parcourir la base de données. si vous ne l'avez pas installé (vous pouvez le trouver en tapant sqlite3 si vous obtenez command not found alors vous devrez l'installer. Pour installer sqlite, suivez les instructions aquí .

sur l'enracinement : si vous n'avez jamais enraciné votre téléphone auparavant et que vous craignez que cela ne bousille votre téléphone, je peux vous dire en toute confiance qu'il n'y a aucune raison de s'inquiéter. il existe des tonnes de tutoriels rapides et faciles sur l'enracinement des téléphones pour pratiquement tous les modèles, nouveaux et anciens, qui existent, et vous pouvez Rooter votre téléphone même si vous avez un mac (J'ai rooté mon s3 avec mon mac).

9 votes

Vous n'avez pas besoin d'un téléphone rooté pour run-as pour travailler. Je viens de l'essayer sur un Galaxy Nexus S de série.

0 votes

@TedHopp et donc, puisque cela fonctionne parfaitement sur votre Galaxy Nexus S de série, cela fonctionnera parfaitement sur tous les téléphones Android, n'est-ce pas ?

0 votes

D'abord, mon téléphone est un contre-exemple qui montre qu'un téléphone rooté n'est pas requis . Deuxièmement, oui, il devrait fonctionner sur tous les appareils non rootés qui sont au moins Android 2.2 (non parce que ça fonctionne sur mon téléphone, mais parce que c'est comme ça que c'est censé fonctionner ; voir la réponse d'Idolon ).

31voto

rytis Points 318

J'ai eu un problème similaire en essayant d'opérer sur un Samsung Galaxy S enraciné. En lançant une commande depuis le shell de l'ordinateur

> adb root

échoue avec le message "cannot run as Root in production builds". Voici une méthode simple qui permet de devenir Root.

Au lieu de la précédente, lancez les deux commandes suivantes l'une après l'autre

> adb shell
$ su

Après la première commande, si l'invite est passée de '>' à '$' comme indiqué ci-dessus, cela signifie que vous êtes entré dans l'environnement shell adb. Si, par la suite, l'invite est passée à '#' après la deuxième commande, cela signifie que vous êtes maintenant Root. Maintenant, en tant que Root, vous pouvez faire tout ce que vous voulez avec votre appareil.

Pour revenir au shell "sûr", tapez

# exit

Vous verrez que l'invite '$' réapparaît, ce qui signifie que vous êtes dans le shell adb en tant qu'utilisateur et non en tant que Root.

0 votes

Je reçois une erreur indiquant que "adb Root" ne fonctionne pas dans les constructions de production.

3 votes

Génial, merci ! En fait, vous devez avoir un téléphone rooté pour faire cela. Vous pouvez également avoir besoin de SuperSU ou quelque chose de similaire ? En tout cas quand j'ai essayé d'utiliser "su" SuperSU m'a donné un dialogue sur mon téléphone.

21 votes

/system/bin/sh : su : non trouvé

19voto

MSquare Points 1232

J'ai eu beaucoup de problèmes avec ça aussi. Je ne comprends toujours pas complètement les autorisations et l'exécution de Root, mais cela a fonctionné pour moi (une des réponses précédentes en partie) pour copier le fichier de base de données de /data/data/[nom du paquet]/databases/my_db.db . Exécution de Racine de coquillage ou su dans l'interpréteur de commandes n'a pas fonctionné, pas plus que la copie du fichier db (j'ai pu naviguer jusqu'au répertoire cependant), pas plus que l'utilisation de sqlite3 .

Alors, ça a marché ! Dans l'invite de commande DOS :

C:\Program Files\Android\android-sdk\platform-tools>adb shell
1|shell@android:/ $ run-as de.vogella.android.locationapi.maps
run-as de.vogella.android.locationapi.maps
1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data
cd /data
shell@android:/data $ cd data
cd data
shell@android:/data/data $ cd de.vogella.android.locationapi.maps
cd de.vogella.android.locationapi.maps
shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases
cd databases
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls
ls
bus_timetable_lines.db
bus_timetable_lines.db-journal
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus
_timetable_lines.db > /sdcard/db_copy.db
 bus_timetable_lines.db > /sdcard/db_copy.db                                   <
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit   ^
exit
shell@android:/ $ exit
exit

C:\Program Files\Android\android-sdk\platform-tools>

Maintenant, allez dans le répertoire SDCARD et récupérez votre fichier db_copy.db . Même celui-ci était caché, mais j'ai réussi à l'envoyer par email. De retour dans Windows, j'ai pu ouvrir le fichier db avec SQLite Database Browser :)

0 votes

J'ai essayé -> run-as <nom_de_l'application> Mais l'adb n'a pas reconnu mon nom_de_l'application. J'ai utilisé le nom du paquetage que j'ai spécifié dans mon AndroidManifest.xml. Y a-t-il quelque chose qui m'échappe ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X