Pourquoi ai-je un accès refusé au dossier de données lorsque j'utilise adb?


181

Je me suis connecté à mon appareil en direct à l'aide de l'adb et des 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 parcourir les répertoires en utilisant la ligne de commande comme celle-ci?

Comment obtenir un accès root sur mon téléphone?


Simple ... assurez-vous que l'écran de votre téléphone est allumé. Cliquez sur "Autoriser" lorsqu'il vous demande si vous souhaitez que Unknown ait accès à root. Terminé.

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

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

Réponses:


139

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

  1. Vous devez disposer d'un téléphone avec un accès root pour parcourir le dossier de données sur un téléphone Android. Cela signifie que vous avez un appareil de développement ( ADP1 ou un ION de Google I / O) ou que 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

77
Et "adb root" nécessite une version personnalisée de adb, sinon "adbd ne peut pas s'exécuter en tant que root dans les versions de production"
bortzmeyer

16
construction personnalisée d'adb? d'où puis-je l'obtenir?
Gopinath

9
une réponse à la question @Gopinath?
Ewoks

2
@Gopinath: Je pense que vous devez le créer à partir de la source pour le périphérique cible, configuré pour autoriser root à l'aide du ndk, puis le flasher sur le périphérique avec une image des fichiers binaires.
Ben Jaguar Marshall

4
AFAIK, il n'est pas nécessaire d'avoir une version personnalisée d'adb. Il est nécessaire d'avoir adbd support s'exécute en tant que root, mais cet adbd est sur l'appareil - donc, quelle que soit la modification apportée pour que l'appareil ait un accès root, cela suffit.
nitzanms

222

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

Liste du contenu du répertoire de votre application:

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

Basculez vers l'UID de com.yourapp et exécutez toutes les autres commandes en utilisant cet uid (jusqu'à ce que vous appeliez exit):

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

 
Remarque 1 : il existe un problème connu avec certains téléphones HTC Desire. En raison d'un propriétaire / autorisations non standard du /data/datarépertoire, la run-ascommande ne s'exécute pas sur ces téléphones.

Note 2 : Comme indiqué dans les commentaires de @Avio: run-asa également des problèmes avec les téléphones Samsung Galaxy S exécutant Cyanogenmod dans n'importe quelle version (de 7 à 10.1) car sur cette plate /data/data- forme se trouve 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
Cela fonctionne comme vous l'avez expliqué où vous run-as com.mypackage. Le problème que j'ai rencontré est celui de sqlite3 /data/data/com.mypackage/databases/mydb"sqlite3: permission refusée". Sqlite3 peut-il être exécuté uniquement par root?
styfle

5
Fonctionne à merveille lorsqu'il s'agit de répertorier les fichiers stockés dans la mémoire interne.
zaplec

5
J'ai dû modifier les autorisations sur le fichier pour pouvoir le déplacer vers ma carte SD, car je ne pouvais pas le faire fonctionner en tant qu'application. Donc, 1) exécutez comme com.package.example, chmod 777 databasefile.db. 2) quitter, aller à sdcard, cp /data/data/com.package.example/databases/databasefile.db. Et l'étape 3 devrait rétablir les autorisations 777
Maragues

3
Mon colis est inconnu, peu importe comment je l'orthographe correctement dans mon terminal: (
Costa

3
Cela devrait être la réponse correcte car c'est la bonne méthode à utiliser pour les téléphones non rootés.
LNI

49

avant de commencer, avez-vous un téléphone rooté ? sinon, je suggère fortement qu'il soit temps que vous fassiez le saut. 99% des tutoriels qui vous aident à faire cela nécessitent que vous ayez un téléphone enraciné (je sais, car j'ai passé environ une heure à chercher un moyen de le faire sans avoir un téléphone enraciné .. je n'ai pas pu en trouver. ) aussi si vous y réfléchissez, votre iPhone doit également être rooté pour effectuer cette même tâche. C'est donc tout à fait raisonnable. En savoir plus sur l'enracinement à la fin de la réponse.

à partir de votre type de 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 tapez:

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 susur la ligne de commande adb et voyez ce qui se passe, si vous obtenez une erreur, votre téléphone n'est pas rooté. Si ce n'est pas le cas, rootez-le d'abord, puis continuez ces instructions.

à partir de là, vous pouvez taper lset 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 découvrir en tapant sqlite3, si vous obtenez, command not foundvous devrez l'installer. Pour installer sqlite, suivez les instructions ici .

à propos de l'enracinement: si vous n'avez jamais rooté votre téléphone auparavant et que vous craignez qu'il visse votre téléphone, je peux vous dire en toute confiance qu'il n'y a rien à craindre. il existe des tonnes de tutoriels d'enracinement de téléphone rapides et faciles pour à peu près tous les nouveaux et anciens modèles, et vous pouvez rooter votre téléphone même si vous avez un mac (j'ai rooté mon s3 avec mon mac).


8
Vous n'avez pas besoin d'un téléphone rooté pour run-astravailler. Je viens de l'essayer sur un Galaxy Nexus S de production
Ted Hopp

@TedHopp et donc b / c cela fonctionne très bien sur votre Galaxy Nexus S de production ... cela fonctionnera très bien sur tous les téléphones Android, n'est-ce pas?
abbood

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

@TedHopp personnellement, je ne suis pas vraiment un développeur Android .. et des instructions comme celles-ci build the application as debuggable (either by building it with the Eclipse, or ant debug command)peuvent vous paraître triviales, mais elles m'intimident un peu. Je suppose que ma réponse s'adresse davantage aux personnes qui sont à l'aise avec l'enracinement de leurs téléphones Android, mais qui ne connaissent pas bien le monde des développeurs Android. Mais je suis heureux que nous ayons cette discussion. Je veux que les lecteurs de ma réponse soient conscients des autres alternatives non-
rooting

1
Excellent homme de réponse. J'utilise quelques téléphones différents ici (MotoX, nexus4, LG G3, SGIII) et c'est plutôt bon pour tous.
Chad Bingham

45

$ adb shell

$ cd / données

$ ls

opendir a échoué, autorisation refusée


Vous devriez faire ceci:

$ adb shell

$ cd /data

shell@android:/data $ run-as com.your.package 

shell@android:/data/data/com.your.package $ ls

D'ACCORD!


Cela marche! Quelques choses à faire avant d'exécuter des commandes. Une fois que les options de développement sont activées sur le téléphone, nous devons également activer le débogage USB . J'ai également activé quelque chose sur mon téléphone (HTC M8) appelé Sélectionner l'application de débogage et j'ai choisi mon application. Pourrait être standard sur tous les téléphones ... devrait être.
srinij

30

J'ai eu un problème similaire en essayant d'opérer sur un Samsung Galaxy S rooté. Émettre une commande depuis la coque de l'ordinateur

> adb root

échoue avec un message "impossible de s'exécuter en tant que root dans les versions de production". Voici une méthode simple qui permet de devenir root.

Au lieu de la précédente, exécutez 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 du shell adb. Si, par la suite, l'invite est devenue «#» après avoir émis la deuxième commande, cela signifie que vous êtes maintenant root. Désormais, en tant que root, vous pouvez faire tout ce que vous voulez avec votre appareil.

Pour revenir au shell `` sûr '', lancez

# 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.


13
su: permission refusée
petrnohejl

3
Super merci! Btw, vous devez avoir un téléphone enraciné pour ce faire. Vous pouvez également avoir besoin de SuperSU ou de quelque chose de similaire? Au moins quand j'ai essayé d'utiliser "su" SuperSU m'a donné une boîte de dialogue sur mon téléphone.
Richard Fung

16
/ system / bin / sh: su: not found
matt lohkamp

1
Merci :) la adb shell + surésolution de la question de la permission ennuyeuse pour toujours. J'ai eu un problème su: not foundsur Android 4.3, mais depuis que j'ai mis à niveau vers la version 4.4.2, le problème a disparu. 4.3 semble avoir des problèmes.

3
su n'est pas disponible pour moi, Nexus 5 / Android 5.1 - existe-t-il une solution de contournement?
CodeManX

19

J'ai eu beaucoup de problèmes avec ça aussi. Je ne comprends toujours pas complètement l'autorisation et l'exécution de la racine, mais cela a fonctionné pour moi (l'une des réponses précédentes en partie) pour copier le fichier de base de données à partir de / data / data / [nom du package] /databases/my_db.db. Exécuter shell root ou su dans le shell pour une raison quelconque ne fonctionnait pas, ni copier le fichier db (je pouvais cependant naviguer vers le répertoire), ni sqlite3 .

Donc, cela a fonctionné! 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>

Allez maintenant dans le répertoire SDCARD et récupérez votre fichier db_copy.db. Même cela était caché, mais j'ai réussi à l'envoyer par e-mail. De retour sous Windows, j'ai pu ouvrir le fichier db avec SQLite Database Browser. :)


J'ai essayé -> run-as <app_package_name> mais l'adb n'a pas reconnu mon app_package_name. J'ai utilisé le package_name que j'ai spécifié dans mon AndroidManifest.xml. Y a-t-il quelque chose qui me manque?
ARK

3

Voici les deux étapes pour obtenir un accès root:

  1. Vos appareils Android doivent être rootés.
  2. Dans le shell ADB, tapez su et l'appareil Android affichera y / n? Vous choisissez autoriser.

tapez su .. donnera une invite sur l'appareil mobile .. demande une super permission via Superuser .. cela a fonctionné
Mahajan344

2

les builds de production ne peuvent pas saisir / data / app

drwxrwx--- system   cache             1970-01-01 08:00 cache
drwxrwxr-x root     system            1970-01-01 08:00 mnt 
drwxrwx--x system   system            1970-01-01 08:15 data

peut nécessiter un changement de propriétaire pour le faire fonctionner.


2

Le problème pourrait être que nous devions spécifiquement donner un accès root adb dans les options de développement des derniers CM. Voici ce que j'ai fait.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * démon non en cours d'exécution. démarrage maintenant sur le port 5037 * * le démon a démarré avec succès * l'accès root est désactivé par les paramètres du système - activer dans les paramètres -> options de développement

après avoir modifié les options de développement ...

abc@abc-L655:~$ sudo adb kill-server
abc@abc-L655:~$ sudo adb root start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
restarting adbd as root
abc@abc-L655:~$ adb shell
root@android:/ # ls /data/ .... good to go.. 

1

si vous connaissez le package d'application, vous pouvez cddirectement dans ce dossier.

par exemple cd data/data/com.yourapp

cela vous déposera dans un répertoire qui read/writablevous permettra de modifier les fichiers selon vos besoins. Étant donné que le dossier est le même sur le emulator, vous pouvez l'utiliser pour obtenir le chemin du dossier.


2
Je peux accéder directement au dossier, mais j'obtiens toujours l'erreur "opendir failed, permission refusée".
Tyler Collier

C'est parce que l'utilisateur "shell" d'adb a l'autorisation d'exécution sur les répertoires, mais pas l'autorisation de lecture.
Chris Stratton

0

Si vous voulez simplement voir votre base de données et vos tables, le moyen le plus simple est d'utiliser Stetho. Outil assez cool pour tous les développeurs Android qui utilisent SQLitebuit by Facobook developed.

Steps to use the tool

  1. Ajoutez ci-dessous la dépendance dans le fichier gradle de votre application (Module: app)

'compilez' com.facebook.stetho: stetho: 1.4.2 '

  1. Ajoutez ci-dessous des lignes de code dans votre méthode Activity onCreate ()
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Maintenant, créez votre application et lorsque l'application est en cours d'exécution, vous pouvez parcourir votre base de données d'application, en ouvrant chrome dans l'url:

chrome://inspect/#devices

Les captures d'écran de la même chose sont comme ci-dessous_

ChromeInspact

ChromeInspact

Votre DB

Votre DB

J'espère que cela aidera à tous! :)


0

Cela fonctionne si votre appareil Android est enraciné par quelque moyen que ce soit (je ne sais pas s'il fonctionne pour un appareil non enraciné).

  1. adb shell - accéder au shell
  2. su - devenez le superutilisateur.

Vous pouvez maintenant lire tous les fichiers de tous les répertoires.


-3

sans rooter l'appareil, vous pouvez accéder aux fichiers par ce qui suit La capture d'écran cmd:

  1. démarrer l'adb en utilisant cmd à partir du dossier platform-tools en fonction de votre utilisateur

    cd C:\Users\YourUserName\AppData\Local\Android\sdk\platform-tools

    il peut se trouver dans un autre dossier selon l'endroit où vous l'avez installé.

  2. afficher les appareils de travail.

    adb devices

    pour dire que la réponse os la commande est

    List of devices attached
    0123456789ABCDEF     device
  3. écrire la commande

        adb -s 0123456789ABCDEF shell "su"

    il s'ouvrira dans

        root@theDeviceName:/ #

4.Accéder aux fichiers, lister tous les fichiers

ls

et ainsi de suite le répertoire chang vers n'importe où ailleurs comme le dossier de données

cd data/data

1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su" / system / bin / sh: su: not found
Solo

dans mon cas, c'était Android 5.0.2 je ne sais pas s'il diffère d'une version à une autre @Koen
Mahmoud Ashraf

le chemin dépend de l'endroit où vous avez installé android studio et de ses SDK @Solo
Mahmoud Ashraf

1
Le problème n'est pas de trouver où se trouve adb. C'est dans mon PATH. Obtenir la liste des fichiers (ou même l'exécuter su) ne fonctionne pas / n'est pas autorisé. Test avec Android 4.3.
Koen

su n'est pas trouvé
Brill Pappin

-5

Lorsque vous êtes dans le répertoire shell du périphérique. Courez

su - root

Ensuite, vous devriez pouvoir accéder aux données / dossier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.