2010-01-16 6 views
31

Kann mir jemand sagen, ist es möglich, die ADB zu verwenden, um eine Datenbank von einer App zu ziehen und zu schieben, ohne root privaliges auf dem Telefon?Android ADB Zugriff auf Anwendungsdatenbanken ohne Root

Zum Beispiel, ich weiß, die Lage auf meine rooted Magie und Traum ist:

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

Ich weiß, dass Sie ADB ohne root verwenden, aber wenn die Schale zu verwenden versuchen - Sie können das nicht sehen Standort ohne Wurzelgut. Aber mir wurde gesagt, dass Sie Push und Pull verwenden können, wenn Sie die gewünschte Datei kennen?

Grundsätzlich möchte ich eine Datenbank aus meiner App auf einem nicht verwurzelten Telefon ziehen, ändern Sie es und drücken Sie es wieder an.

Nur Ärger, die ich habe, ist, die zwei Telefone, die ich habe, sind beide Wurzel und ich habe keinen Zugang zu einem Nicht-Wurzel, um es auszuprobieren.

+0

verwenden, bitte erwägen, Ihre Annahme zu Pilot_51's Antwort zu ändern. –

Antwort

72

Während Nilhcems Antwort für mich nicht funktionierte, führte sie mich in die richtige Richtung (dafür habe ich upgestimmt) und ich habe jetzt eine funktionierende Lösung.

alte Antwort, die mit neueren Versionen von Android möglicherweise nicht:

#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 

Alternative Methode externe Speicher verwendet (bestätigt mit 6.0.1 arbeiten):

#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 
+1

Dies ist eine richtige Antwort für die Frage, wo die Person, die dies tun möchte, ist der Entwickler von Die App kann eine Debug-Version installieren (die Debug-Version ist Voraussetzung für Run-as). Andere Optionen beinhalten, dass die App selbst die Berechtigung ändert oder die Datei zum/vom externen Speicher kopiert. –

+0

adb zurück mit Nachricht run-as: Paket 'com.instagram.android' ist unbekannt, was soll ich tun? Ich versuche auch, su dann adb pull zu verwenden /data/data/package.name/databases/dbname.db ~/Desktop/aber es gibt Fehler zurück: Gerät nicht gefunden? – UmAnusorn

+1

@ um.anusorn Es gibt ein Problem in 4.3, das Run-As unterbricht und in 4.4 behoben werden sollte. Siehe: https://code.google.com/p/android/issues/detail?id=58373 Wenn Sie root haben, können Sie es beheben, indem Sie die Berechtigung UID setzen für/system/bin/run-as aktivieren, aber das Art besiegt den Zweck. –

13

Eine schnelle Abhilfe ist, den run-as Befehl verwenden, um die Datenbank in einem Ordner zu kopieren, in dem Sie den Zugriff, wie /sdcard und dann haben können, macht eine normalen adb pull

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

Mehr Informationen über den Lauf als Befehl here

Beachten Sie, dass der Befehl run-as seit API Level 8 (Android 2.2) verfügbar ist und nur verwendet werden kann, wenn die Anwendung debbugable ist.

+0

auf meiner Version (vielleicht etwas mit 4,4 zu tun, oder ein Update im letzten Jahr?) Ich kann nicht zu/sdcard "cp" bei der Verwendung von 'run-as'. Ich muss die 'chmod' Lösung von @ Pilot_51 –

+0

Das ist wahr - die SD-Karte ist nicht mehr schreibbar, wenn adb shell – slott

0

Wir den Dateiberechtigungen gesetzt für alle Nutzer innerhalb der App lesbar.

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

Dann einfach die .db mit adb normalerweise abziehen.

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

HINWEIS: Ich habe entdeckt, dass dies jedes Mal getan werden muss, die Datenbank-Datei geöffnet wird, zum Beispiel in onCreate sowie den Konstruktor Ihres SQLiteOpenHelper Wrapper (wenn Ihre Datenbank ist nicht null) oder vielleicht onOpen. Wenn nur in onCreate, dann das nächste Mal, wenn Sie Ihre App ausführen und die .db bereits vorhanden ist, wurden die Berechtigungen aus irgendeinem Grund zurück geändert. Dies könnte etwas damit zu tun haben, wie Android seine Daten verwaltet.

1

Auf OxygenOS (basierend auf Android 5.2) Ich habe die beiden von Pilot_51 zur Verfügung gestellten Lösungen durcheinander gebracht.

Zuerst habe ich run-as verwendet, um Zugriff auf /data/data/package.name/databases von hier zu bekommen konnte ich nicht direkt auf /sdcard/ kopieren daher änderte ich die Erlaubnis der Datei. Danach habe ich aus run-as Modus beendet und cp verwendet, um die Datei in /sdcard/ Speicher zu kopieren.Schließlich konnte ich

$ 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