Pourquoi l'accès au dossier de données est-il refusé lors de l'utilisation de adb?
Question
Je me suis connecté à mon périphérique 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 est refusé. Comment se fait-il que je ne puisse pas parcourir les répertoires en utilisant la ligne de commande comme ceci?
Comment obtenir un accès root sur mon téléphone?
La solution
Il y a deux choses à retenir si vous voulez parcourir tout votre appareil.
- Vous devez disposer d'un téléphone avec un accès root pour pouvoir parcourir le dossier de données sur un téléphone Android. Cela signifie que vous avez soit un appareil de développement ( ADP1 ou un ION de Google I / O) ou vous avez trouvé un manière de «rooter» votre téléphone d’une autre manière.
- Vous devez exécuter ADB en mode racine. Pour ce faire, exécutez:
adb root
Autres conseils
À partir de l'API de niveau 8 (Android 2.2), pour l'application débogable (celle générée par Android Studio toutes les fois sauf si la version de l'édition est demandée), vous pouvez utiliser le shell run-as
. commande pour exécuter une commande ou un exécutable en tant qu’utilisateur / application spécifique ou simplement basculer sur UID de votre application afin que vous puissiez accéder à son répertoire données .
Liste le contenu du répertoire de votre application:
run-as com.yourapp ls -l /data/data/com.yourapp
Basculez vers l'UID de com.votre application et exécutez toutes les commandes ultérieures utilisant cet uid (jusqu'à ce que vous appeliez exit
):
run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit
& nbsp;
Note 1 : il existe un problème connu avec certains téléphones HTC Desire. En raison d'un propriétaire / autorisations non standard du répertoire / data / data ??code>, la commande
run-as
ne s'exécute pas sur ces téléphones.
Note 2 : Comme indiqué dans les commentaires de @Avio:
run-as
a également des problèmes avec les téléphones Samsung Galaxy S exécutant CyanogenMod, quelle que soit leur version (de 7 à 10.1) car sur cette plate-forme, / data / data ??code> est un lien symbolique vers
/ datadata ??code>. Une façon de résoudre ce problème consiste à remplacer le lien symbolique par le répertoire réel (malheureusement, cela nécessite généralement un accès root).
avant de commencer, disposez-vous d'un téléphone enraciné ? sinon, je suggère fortement qu'il soit temps de faire 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'en ai trouvé aucun. ) également si vous y réfléchissez, votre iPhone doit également être enraciné pour effectuer la même tâche. Donc c'est totalement 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 à votre ligne de commande shell android (vous devriez voir quelque chose comme ceci: shell @ android: / $
maintenant tapez:
shell@android:/ $run-as com.domain.yourapp
ceci devrait vous mener 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, votre téléphone n’est pas enraciné. Si ce n'est pas le cas, lancez-le d'abord puis poursuivez ces instructions.
À partir de là, vous pouvez taper ls
et vous verrez tous les répertoires, y compris 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 déjà installé (vous pouvez le trouver en tapant sqlite3
, si vous obtenez une commande non trouvée
puis installez-le. Pour installer sqlite, suivez les instructions ici .
sur l'enracinement: si vous n'avez jamais installé votre téléphone et que vous craignez de le faire visser, je peux vous dire en toute confiance qu'il n'y a pas de quoi s'inquiéter. il existe des tonnes de didacticiels d’enracinement rapide et facile pour pratiquement tous les modèles, anciens et nouveaux, , et vous pouvez rooter votre téléphone même si vous avez un mac (j'ai enraciné mon s3 avec mon mac) .
$ shell adb
$ cd / data ??p>
$ ls
échec d'opendir, 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
OK!
J'ai eu un problème similaire lorsque j'essayais de faire fonctionner un Samsung Galaxy S enraciné. Émission d'une commande à partir du shell de l'ordinateur
> adb root
échoue avec un message "ne peut pas être exécuté en tant que root dans les versions de production". Voici une méthode simple qui permet de devenir root.
Au lieu des précédentes, lancez les deux commandes suivantes l'une après l'autre
> adb shell
$ su
Après la première commande, si l'invite a changé de '>' comme indiqué ci-dessus, cela signifie que vous avez entré l'environnement shell adb. Si, par la suite, l'invite a été remplacée par '#' après avoir exécuté 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écurisé", exécutez
.# exit
Vous verrez que l'invite '$' réapparaîtra, ce qui signifie que vous êtes dans le shell adb en tant qu'utilisateur et non en tant que root.
J'ai également eu beaucoup de difficulté avec cela. Je ne comprends toujours pas bien les permissions et l'exécution root, mais cela a fonctionné pour moi (une partie des réponses précédentes) pour copier le fichier de base de données à partir de / data / data / [nom du paquet] /databases/my_db.db. Exécuter racine du shell ou su dans un shell pour une raison quelconque ne fonctionnait pas, pas plus que la copie du fichier db (je pouvais accéder au répertoire par contre), 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 courrier électronique. De retour dans Windows, j'ai pu ouvrir le fichier db avec SQLite Database Browser. :)
Les étapes pour obtenir un accès root sont les suivantes:
- Vos appareils Android doivent être enracinés.
- Dans le shell ADB, tapez su et le périphérique Android vous demandera y / n? Vous choisissez autoriser.
versions de production ne peuvent pas entrer / 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 avoir besoin de changer de propriétaire pour le faire fonctionner.
Le problème pourrait être que nous devions donner spécifiquement 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 * le démon ne fonctionne pas. en le démarrant maintenant sur le port 5037 * * démon démarré avec succès * l'accès root est désactivé par les paramètres système - activez 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..
si vous connaissez le package d'application, vous pouvez cd
directement dans ce dossier.
Par exemple, cd data / data / com.votre application
cela vous déposera dans un répertoire en lecture / écriture
afin que vous puissiez modifier les fichiers si nécessaire. Le dossier étant le même sur emulator
, vous pouvez l'utiliser pour obtenir le chemin du dossier.
Si vous souhaitez simplement voir votre base de données & amp; Dans les tableaux , la méthode la plus simple consiste à utiliser Stetho
. Outil plutôt cool pour tous les développeurs Android utilisant SQLite
par développé par Facobook
.
Procédure d'utilisation de l'outil
- Ajouter ci-dessous la dépendance dans le fichier de classe de votre application (module: app)
'compiler' com.facebook.stetho: stetho: 1.4.2 '
- Ajoutez des lignes de code ci-dessous dans votre méthode Activity onCreate ()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Stetho.initializeWithDefaults(this); setContentView(R.layout.activity_main); }
Maintenant, construisez votre application & amp; Lorsque l'application est en cours d'exécution, vous pouvez parcourir votre base de données d'applications en ouvrant chrome dans l'URL:
chrome://inspect/#devices
Les captures d'écran sont les mêmes que ci-dessous _
ChromeInspact
Votre DB
J'espère que cela aidera à tous! :)
sans enraciner le périphérique, vous pouvez accéder aux fichiers à l'aide des éléments suivants La capture d'écran cmd:
-
démarrez 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 être dans un autre dossier, cela dépend de l'endroit où vous l'avez installé.
-
afficher les périphériques qui fonctionnent.
adb devices
pour dire le répondeur la commande est
List of devices attached 0123456789ABCDEF device
-
écrivez la commande
adb -s 0123456789ABCDEF shell "su"
il va s'ouvrir dans
root@theDeviceName:/ #
4.Accès aux fichiers, liste tous les fichiers
ls
et ainsi de suite dans le répertoire de modifications vers n'importe quel autre emplacement, comme le dossier de données
cd data/data
Lorsque vous vous trouvez dans le répertoire shell du périphérique. Il suffit de courir
su - root
Ensuite, vous devriez pouvoir accéder aux données / dossiers.