Warum wird mir bei Verwendung von adb der Zugriff auf den Datenordner verweigert?


180

Ich habe mit adb und den folgenden Befehlen eine Verbindung zu meinem Live-Gerät hergestellt:

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

Ich war überrascht zu sehen, dass mir der Zugang verweigert wurde. Wie kommt es, dass ich mit der folgenden Befehlszeile nicht in den Verzeichnissen navigieren kann?

Wie erhalte ich Root-Zugriff auf meinem Telefon?


Einfach ... stellen Sie sicher, dass Ihr Telefonbildschirm eingeschaltet ist. Klicken Sie auf "Zulassen", wenn Sie gefragt werden, ob Unbekannt Zugriff auf root haben soll. Getan.

beschlossen, eine einfache avd zu erstellen, um Zugriff auf die Datenbank zu haben. Hat jemand Links zu Anleitungen, ohne "benutzerdefinierte" Flare und Grafiken für Entwickler? Nur wie man einfaches Vanille-Android auf einem gekauften Gerät bekommt.
BGS

Auf meinem Android 7.1.1-Gerät tritt keine solche Eingabeaufforderung auf. Aber adb geht voran und listet den Inhalt des Verzeichnisses auf. Das Problem ist, dass der Inhalt nicht wirklich existiert. Ich verwende adb-sync, um Inhalte hinzuzufügen. Es ist ziemlich komisch.
Tom Russell

Antworten:


138

Es gibt zwei Dinge zu beachten, wenn Sie alles auf Ihrem Gerät durchsuchen möchten.

  1. Sie benötigen ein Telefon mit Root-Zugriff, um den Datenordner auf einem Android-Telefon durchsuchen zu können. Das bedeutet, dass Sie entweder ein Entwicklergerät ( ADP1 oder ein ION von Google I / O) haben oder einen Weg gefunden haben, Ihr Telefon auf andere Weise zu "rooten".
  2. Sie müssen ADB im Root-Modus ausführen. Führen Sie dazu Folgendes aus: adb root

76
Und "adb root" erfordert einen benutzerdefinierten Build von adb, andernfalls kann "adbd nicht als root in Produktions-Builds ausgeführt werden"
bortzmeyer

16
Custom Build von ADB? Woher bekomme ich es?
Gopinath

9
Irgendeine Antwort auf die @ Gopinath-Frage?
Ewoks

2
@Gopinath: Ich glaube, Sie müssen es aus dem Quellcode für das Zielgerät erstellen, das so konfiguriert ist, dass Root mit dem ndk zugelassen wird, und es dann zusammen mit einem Image der Binärdateien auf das Gerät flashen.
Ben Jaguar Marshall

4
AFAIK, es ist nicht erforderlich, einen benutzerdefinierten Build von adb zu haben. Es ist notwendig, dass die adbd- Unterstützung als root ausgeführt wird, aber diese adbd befindet sich auf dem Gerät. Daher ist es ausreichend, alle Änderungen vorzunehmen, damit das Gerät über Root-Zugriff verfügt.
Nitzanms

220

Ab API-Stufe 8 (Android 2.2) können Sie für die debuggbare Anwendung (die von Android Studio ständig erstellt wurde, sofern der Release-Build nicht angefordert wurde) den Shell- run-asBefehl verwenden, um einen Befehl oder eine ausführbare Datei als einen bestimmten Benutzer / eine bestimmte Anwendung auszuführen oder wechseln Sie einfach zur UID Ihrer Anwendung, damit Sie auf deren Datenverzeichnis zugreifen können .

Listen Sie den Verzeichnisinhalt Ihrer App auf:

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

Wechseln Sie zur UID von com.yourapp und führen Sie alle weiteren Befehle mit dieser UID aus (bis Sie aufrufen exit):

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

 
Hinweis 1 : Bei einigen HTC Desire-Telefonen ist ein Problem bekannt . Aufgrund eines nicht standardmäßigen Besitzers / einer nicht standardmäßigen Berechtigung des /data/dataVerzeichnisses kann der run-asBefehl auf diesen Telefonen nicht ausgeführt werden.

Hinweis 2 : Wie in den Kommentaren von @Avio erwähnt: run-asProbleme gibt es auch mit Samsung Galaxy S-Handys, auf denen Cyanogenmod in jeder Version (von 7 bis 10.1) ausgeführt wird, da auf dieser Plattform /data/dataein Symlink zu /datadata. Eine Möglichkeit, das Problem zu lösen, besteht darin, den Symlink durch das eigentliche Verzeichnis zu ersetzen (dies erfordert normalerweise normalerweise Root-Zugriff).


2
Dies funktioniert so, wie Sie erklärt haben, wo Sie sich befinden run-as com.mypackage. Das Problem, auf das ich sqlite3 /data/data/com.mypackage/databases/mydbgestoßen bin, lautet "sqlite3: Berechtigung verweigert". Kann sqlite3 nur von root ausgeführt werden?
Styfle

5
Funktioniert wie ein Zauber, wenn es darum geht, im internen Speicher gespeicherte Dateien aufzulisten.
Zaplec

5
Ich musste die Berechtigungen für die Datei ändern, um sie auf meine SD-Karte verschieben zu können, da ich sie nicht als meine Anwendung ausführen konnte. Also, 1) run-as com.package.example, chmod 777 databasefile.db. 2) Beenden Sie den Vorgang und gehen Sie zu sdcard, cp /data/data/com.package.example/databases/databasefile.db. Und Schritt 3 sollte die 777 Berechtigungen
zurücksetzen

3
Mein Paket ist unbekannt, egal wie richtig ich es in mein Terminal schreibe: (
Costa

3
Dies sollte die Antwort sein, die als richtig markiert ist, da dies die richtige Methode für Telefone ohne Rootberechtigung ist.
LNI

47

Haben Sie ein gerootetes Telefon, bevor wir anfangen ? Wenn nicht, empfehle ich dringend, dass es Zeit ist, den Sprung zu machen. 99% der Tutorials, die Ihnen dabei helfen, setzen voraus, dass Sie ein gerootetes Telefon haben (ich weiß, dass ich ungefähr eine Stunde lang nach einer Möglichkeit gesucht habe, dies zu tun, ohne ein gerootetes Telefon zu haben. Ich konnte keine finden.) ) Auch wenn Sie darüber nachdenken, muss Ihr iPhone gerootet sein, um dieselbe Aufgabe zu erledigen. Es ist also völlig vernünftig. Mehr zum Rooten am Ende der Antwort.

von Ihrem Befehlszeilentyp:

adb shell

Damit gelangen Sie zu Ihrer Android-Shell-Befehlszeile (Sie sollten ungefähr Folgendes sehen: Geben Sie shell@android:/ $jetzt Folgendes ein :

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

Dies sollte Sie direkt in das Datenverzeichnis von com.domain.yourapp:

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

Wenn dies nicht der Fall ist (dh wenn Sie eine Fehlermeldung erhalten), haben Sie wahrscheinlich kein gerootetes Telefon oder Sie haben Ihre Root-Benutzerrechte nicht verwendet. Um Ihre Root-Benutzerrechte zu verwenden, geben Sie suin die adb-Befehlszeile ein und sehen Sie, was passiert. Wenn Sie eine Fehlermeldung erhalten, ist Ihr Telefon nicht gerootet. Wenn dies nicht der Fall ist, rooten Sie es zuerst und fahren Sie dann mit diesen Anweisungen fort.

Von dort aus können lsSie eingeben und alle Verzeichnisse einschließlich der Datenbank sehen:

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

cache
databases
lib
shared_prefs   

Danach können Sie sqlite3 verwenden, um die Datenbank zu durchsuchen. Wenn Sie sie nicht installiert haben (Sie können sie durch Eingabe herausfinden sqlite3, wenn Sie sie erhalten, müssen command not foundSie sie installieren. Befolgen Sie die Anweisungen hier, um sqlite zu installieren .

Informationen zum Rooten: Wenn Sie Ihr Telefon noch nie zuvor gerootet haben und sich Sorgen darüber machen, dass es Ihr Telefon verschraubt, kann ich Ihnen mit vollem Vertrauen sagen, dass Sie sich keine Sorgen machen müssen. Es gibt unzählige schnelle und einfache Tutorials zum Rooten von Telefonen für so ziemlich alle neuen und alten Modelle, und Sie können Ihr Telefon auch dann rooten, wenn Sie einen Mac haben (ich habe mein s3 mit meinem Mac gerootet).


8
Sie benötigen kein gerootetes Telefon, um run-asarbeiten zu können. Ich habe es gerade auf einem Serien-Galaxy Nexus S. versucht
Ted Hopp

@ TedHopp und so b / c funktioniert es gut auf Ihrem produktionsgebauten Galaxy Nexus S .. es wird gut auf allen Android-Handys funktionieren, oder?
Abbood

Erstens ist mein Telefon ein Gegenbeispiel, das zeigt, dass kein gerootetes Telefon erforderlich ist . Zweitens, ja, es sollte auf allen nicht gerooteten Geräten funktionieren, die mindestens Android 2.2 sind (nicht weil es auf meinem Telefon funktioniert, sondern weil es so funktionieren soll; siehe die Antwort von Idolon ).
Ted Hopp

@ TedHopp persönlich bin ich kein großer Android-Entwickler .. und so build the application as debuggable (either by building it with the Eclipse, or ant debug command)klingen Anweisungen wie für Sie vielleicht trivial, aber sie schüchtern mich irgendwie ein. Ich denke, meine Antwort ist eher für Leute, die mit dem Rooten ihrer Android-Handys vertraut sind, sich aber in der Welt der Android-Entwickler nicht gut auskennen. Aber ich bin froh, dass wir diese Diskussion führen. Ich möchte, dass die Leser meiner Antwort sich der anderen Alternativen bewusst werden, die nicht verwurzelt sind
Abbood

1
Großartige Antwort Mann. Ich benutze hier ein paar verschiedene Telefone (MotoX, Nexus4, LG G3, SGIII) und das ist ziemlich gut für alle.
Chad Bingham

43

$ adb Shell

$ cd / data

$ ls

opendir fehlgeschlagen, Erlaubnis verweigert


Du solltest das tun:

$ adb shell

$ cd /data

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

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

OK!


Das funktioniert! Einige Dinge, die Sie tun müssen, bevor Sie Befehle ausführen. Sobald die Entwickleroptionen auf dem Telefon aktiviert sind, müssen wir auch das USB-Debugging aktivieren . Ich habe außerdem auf meinem Telefon (HTC M8) die Option "Debug-App auswählen" aktiviert und meine App ausgewählt. Könnte bei allen Handys Standard sein ... sollte sein.
Srinij

30

Ich hatte ein ähnliches Problem, als ich versuchte, auf einem verwurzelten Samsung Galaxy S zu arbeiten. Ich gab einen Befehl über die Computer-Shell aus

> adb root

schlägt mit der Meldung "Kann nicht als Root in Produktions-Builds ausgeführt werden" fehl. Hier ist eine einfache Methode, mit der Sie root werden können.

Geben Sie anstelle der vorherigen Befehle die folgenden zwei Befehle nacheinander aus

> adb shell
$ su

Wenn sich die Eingabeaufforderung nach dem ersten Befehl wie oben gezeigt von '>' in '$' geändert hat, bedeutet dies, dass Sie die ADB-Shell-Umgebung aufgerufen haben. Wenn sich die Eingabeaufforderung nach dem Ausgeben des zweiten Befehls später in '#' geändert hat, bedeutet dies, dass Sie jetzt root sind. Jetzt können Sie als Root mit Ihrem Gerät alles tun, was Sie wollen.

Problem, um zur "sicheren" Shell zurückzukehren

# exit

Sie werden sehen, dass die Eingabeaufforderung '$' erneut angezeigt wird, was bedeutet, dass Sie sich als Benutzer und nicht als Root in der ADB-Shell befinden.


12
su: Erlaubnis verweigert
petrnohejl

3
Super danke! Übrigens benötigen Sie ein gerootetes Telefon, um dies zu tun. Möglicherweise benötigen Sie auch SuperSU oder ähnliches? Zumindest als ich versuchte "su" zu verwenden, gab mir SuperSU einen Dialog auf meinem Handy.
Richard Fung

16
/ system / bin / sh: su: nicht gefunden
matt lohkamp

1
Danke :) das hat adb shell + sudie nervige Erlaubnis Sache für immer gelöst. Ich hatte ein Problem mit su: not foundAndroid 4.3, aber seit ich auf 4.4.2 aktualisiert habe, ist das Problem verschwunden. 4.3 scheint Probleme zu haben.

3
su steht mir nicht zur Verfügung, Nexus 5 / Android 5.1 - gibt es eine Problemumgehung?
CodeManX

19

Ich hatte auch große Probleme damit. Ich verstehe die Berechtigung und den Root-Lauf immer noch nicht vollständig, aber dies funktionierte für mich (eine der vorherigen Antworten teilweise), um die Datenbankdatei aus / data / data / [Paketname] /databases/my_db.db zu kopieren. Das Ausführen von Shell-Root oder su in Shell aus irgendeinem Grund hat nicht funktioniert, das Kopieren der Datenbankdatei (ich konnte jedoch zum Verzeichnis navigieren) und sqlite3 auch nicht .

Das hat also funktioniert! In der DOS-Eingabeaufforderung:

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>

Gehen Sie nun zum SDCARD-Verzeichnis und holen Sie sich Ihre Datei db_copy.db. Auch das war versteckt, aber ich habe es geschafft, es per E-Mail zu versenden. Zurück in Windows konnte ich die Datenbankdatei mit dem SQLite-Datenbankbrowser öffnen. :) :)


Ich habe versucht -> run-as <App_Paketname>, aber der ADB hat meinen App_Paketname nicht erkannt. Ich habe den Paketnamen verwendet, den ich in meiner AndroidManifest.xml angegeben habe. Fehlt mir etwas?
ARK

3

Im Folgenden sind die beiden Schritte aufgeführt, um Root-Zugriff zu erhalten:

  1. Ihre Android-Geräte müssen gerootet sein.
  2. Geben Sie in der ADB-Shell su ein, und das Android-Gerät fordert Sie auf, j / n? Sie wählen erlauben.

Typ su .. wird auf dem mobilen Gerät eine Eingabeaufforderung geben .. um Super-Erlaubnis durch Superuser bitten .. es hat funktioniert
Mahajan344

2

Produktions-Builds können / data / app nicht eingeben

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

Möglicherweise muss der rechte Eigentümer geändert werden, um es zu betreiben.


2

Das Problem könnte sein, dass wir in den Entwicklungsoptionen der neuesten CMs speziell adb root-Zugriff in den Entwicklungsoptionen gewähren müssen. Hier ist, was ich getan habe.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * daemon läuft nicht. Starten Sie es jetzt auf Port 5037 * * Daemon wurde erfolgreich gestartet * Der Root-Zugriff wird durch die Systemeinstellung deaktiviert - in den Einstellungen aktivieren -> Entwicklungsoptionen

nach Änderung der Entwicklungsoptionen ...

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

Wenn Sie das Anwendungspaket kennen, können Sie cddirekt in diesen Ordner wechseln.

z.B cd data/data/com.yourapp

Dadurch werden Sie in ein Verzeichnis read/writableverschoben, in dem Sie die Dateien nach Bedarf ändern können. Da der Ordner auf dem identisch ist emulator, können Sie damit den Ordnerpfad abrufen.


2
Ich kann direkt in den Ordner cd, aber ich erhalte immer noch den Fehler "opendir fehlgeschlagen, Berechtigung verweigert".
Tyler Collier

Dies liegt daran, dass der "Shell" -Benutzer von adb über Ausführungsberechtigungen für die Verzeichnisse verfügt, jedoch nicht über Leseberechtigungen.
Chris Stratton

0

Wenn Sie nur Ihre DB & Tabellen sehen möchten, ist es am einfachsten, sie zu verwenden Stetho. Ziemlich cooles Tool für jeden Android-Entwickler, der SQLitebuit by verwendet Facobook developed.

Steps to use the tool

  1. Fügen Sie unten die Abhängigkeit in die Gradle-Datei Ihrer Anwendung ein (Modul: App)

'kompilieren' com.facebook.stetho: stetho: 1.4.2 '

  1. Fügen Sie in Ihrer Activity onCreate () -Methode die folgenden Codezeilen hinzu
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Erstellen Sie jetzt Ihre Anwendung und wenn die App ausgeführt wird, können Sie Ihre App-Datenbank durchsuchen, indem Sie Chrome in der URL öffnen:

chrome://inspect/#devices

Screenshots davon sind wie folgt:

ChromeInspact

ChromeInspact

Ihre DB

Ihre DB

Hoffe das wird allen helfen! :) :)


0

Dies funktioniert, wenn Ihr Android-Gerät auf irgendeine Weise gerootet ist (nicht sicher, ob es für nicht gerootete Geräte funktioniert).

  1. adb shell - Zugriff auf die Shell
  2. su - werde der Superuser.

Sie können jetzt alle Dateien in allen Verzeichnissen lesen.


-3

Ohne das Gerät zu rooten, können Sie über den folgenden cmd-Screenshot auf die Dateien zugreifen:

  1. Starten Sie die ADB mit cmd aus dem Ordner "platform-tools" entsprechend Ihrem Benutzer

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

    Es kann sich in einem anderen Ordner befinden, je nachdem, wo Sie es installiert haben.

  2. Zeigen Sie die Arbeitsgeräte an.

    adb devices

    Zum Beispiel die Antwort auf den Befehl

    List of devices attached
    0123456789ABCDEF     device
  3. Schreiben Sie den Befehl

        adb -s 0123456789ABCDEF shell "su"

    es wird sich öffnen in

        root@theDeviceName:/ #

4. Wenn Sie auf Dateien zugreifen, listen Sie alle Dateien auf

ls

und so weiter Wechseln Sie das Verzeichnis zu einem anderen Ort wie dem Datenordner

cd data/data

1
C: \ Benutzer \ bruker \ AppData \ Local \ Android \ sdk \ Plattform-Tools> ADB-S Emulator-5554 Shell "su" / system / bin / sh: su: nicht gefunden
Solo

In meinem Fall war es Android 5.0.2. Ich weiß nicht, ob es sich von Version zu Version unterscheidet. @Koen
Mahmoud Ashraf

Der Pfad hängt davon ab, wo Sie Android Studio installiert haben und es sind SDKs @Solo
Mahmoud Ashraf

1
Das Problem ist nicht zu finden, wo adb ist. Es ist in meinem Pfad. Das Abrufen der Dateiliste (oder sogar das Ausführen su) funktioniert nicht / ist nicht zulässig. Testen mit Android 4.3.
Koen

su wird nicht gefunden
Brill Pappin

-5

Wenn Sie sich im Shell-Verzeichnis des Geräts befinden. Renn einfach

su - root

Dann sollten Sie auf die Daten / Ordner zugreifen können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.