Rufen Sie die Datenbank oder eine andere Datei mit run-as aus dem internen Speicher ab


113

Auf einem nicht gerooteten Android-Gerät kann ich mit dem run-asBefehl mit meinem Paketnamen zum Datenordner navigieren, der die Datenbank enthält . Die meisten Dateitypen, mit denen ich nur zufrieden bin, aber mit der Datenbank, die ich vom Android-Gerät ziehen möchte.

Gibt es einen download copyoder moveBefehl von diesem Teil der ADB-Shell? Ich möchte die Datenbankdatei herunterladen und ihren Inhalt mit einem Datenbankbrowser anzeigen.

Eine Antwort besteht darin, das gesamte Anwendungspaket in ein komprimiertes Archiv umzuwandeln. Es gibt jedoch keine weitere Antwort darauf, wie dieses Archiv extrahiert werden kann, sobald dies erledigt und auf den Computer verschoben wurde. Daher bin ich sehr abgelenkt, wenn es zunächst eine direktere Lösung geben könnte



Antworten:


230

Durch den Entwurf uservon Android (das haben Sie auf Ihrem Telefon, bis Sie den Bootloader entsperren und das Telefon mit userdebugoder mit der engSoftware flashen) wird der Zugriff auf den internen Speicher eingeschränkt - jede App kann nur auf ihre eigenen Dateien zugreifen. Zum Glück für Software - Entwickler nicht bereit zu verankern ihre Telefone Google bietet eine Möglichkeit , die für den Zugriff auf interne Speicher von debug Versionen ihrer Pakete mit run-asBefehl.

/data/data/debuggable.app.package.name/databases/fileFühren Sie den folgenden Befehl aus, um das Gerät von einem Android 5.1+ herunterzuladen :

adb exec-out run-as debuggable.app.package.name cat databases/file > file

Mehrere Dateien in einem Ordner unter dem zum Download /data/data/debuggable.app.package.name/auf einmal - Verwendung tar:

adb exec-out run-as debuggable.app.package.name tar c databases/ > databases.tar
adb exec-out run-as debuggable.app.package.name tar c shared_prefs/ > shared_prefs.tar

8
Oder run-askopieren Sie die Datei einfach an einen Ort im externen Speicher und ziehen Sie die Datenbankdatei von dort ab, anstatt mit den Dateiberechtigungen herumzuspielen.
CommonsWare

5
Der Run-As hat keine Erlaubnis, auf die SD-Karte zu schreiben - mit dem neuesten Update wurde etwas Neues hinzugefügt ... :(
Slott

4
Wenn ich die adb-Shell "run-as package.name chmod 666 /data/data/package.name/databases/file" ausführe, beendet adb den Fehler -> run-as: exec fehlgeschlagen für chmod666 Fehler: Berechtigung verweigert. Ich bin in Nexus 7 ohne root
Shudy

2
Schreibzugriff auf externe SD-Karte ist mit adb nicht mehr möglich.
Slott

3
Wenn Sie feststellen, dass Sie eine leere oder fast leere Datei zurückerhalten, ist die Datei möglicherweise einfach ein Fehler von der Konsole, die zu dieser von Ihnen erstellten Datei umgeleitet wurde. Ein häufiges Problem hierbei ist, dass Sie versuchen, eine Datenbank aus der Release-Variante Ihrer App zu kopieren. Sie können DBs nur aus der Debug-Variante Ihrer App kopieren . Installieren Sie in diesem Fall einfach die Debug-Variante und wiederholen Sie den Befehl. Hoffe das hilft jemandem.
Aonghus Shortt

72

Die akzeptierte Antwort funktioniert bei mir nicht mehr (von Android blockiert?)

Also habe ich stattdessen folgendes gemacht:

> adb shell
shell $ run-as com.example.package
shell $ chmod 666 databases/file
shell $ exit                                               ## exit out of 'run-as'
shell $ cp /data/data/package.name/databases/file /sdcard/
shell $ run-as com.example.package
shell $ chmod 600 databases/file
> adb pull /sdcard/file .

3
Dies sollte die neue richtige Antwort sein ODER @Alex P. Sie sollten diese Antwort für neuere Android-Versionen hinzufügen. Auch in meinem Fall musste ich 777 verwenden und es zuerst / auch auf das Datenbankverzeichnis anwenden, bevor ich auf die Datenbankdatei zugreifen konnte.
Muetzenflo

1
Mein Gerät ist gerootet, aber ich habe festgestellt, dass ich noch ausgeführt werden muss su, damit der run-asBefehl funktioniert.
ThomasW

Was ist, wenn Sie keine SD-Karte haben?
Gyum Fox

1
Wenn Sie keine SD-Karte haben, gibt es sowieso noch ein "SD-Karte" -Verzeichnis.
BäumeAreEverywhere

1
Toll!. es hat auch bei mir funktioniert. Können wir eine Batch- / Shell-Datei erstellen? Übergeben Sie einfach den Namen der Datenbankdatei als Parameter und wir haben die Datenbankdatei.
Qadir Hussain

22

Wenn jemand nach einer Datenbank aus der Debug-Anwendung suchen möchte, kann er das folgende Verfahren anwenden:

  1. Suchen und öffnen Sie den Gerätedateiexplorer

Suchen und öffnen Sie den Gerätedateiexplorer

  1. Wählen Sie Ihr Mobilteil aus und navigieren Sie zum data/dataVerzeichnis

Gehen Sie zum Daten- / Datenverzeichnis

  1. Suchen Sie nun Ihr Anwendungspaket und gehen Sie zum Datenbankordner. Sie können die Datenbanken dort sehen und mit einem Rechtsklick erhalten Sie die Option, diese auf Ihrem Laufwerk zu speichern.

Geben Sie hier die Bildbeschreibung ein


1
Wow, so viel einfacher und sicherer im Vergleich zur Verwendung von adb-shell
user1708860

9

Ich habe ein einfaches Shell-Skript zum Dumping von Datenbanken veröffentlicht:

https://github.com/Pixplicity/humpty-dumpty-android

Es führt zwei verschiedene Methoden aus, die hier beschrieben werden:

  1. Zunächst wird versucht, die Datei für andere Benutzer zugänglich zu machen und sie vom Gerät abzurufen.
  2. Wenn dies fehlschlägt, wird der Inhalt der Datei über das Terminal an den lokalen Computer gestreamt. Es führt einen zusätzlichen Trick aus, um \rZeichen zu entfernen , die einige Geräte an die Shell ausgeben.

Von hier aus können Sie eine Vielzahl von CLI- oder GUI-SQLite-Anwendungen verwenden, z. B. sqlite3oder sqlitebrowser, um den Inhalt der Datenbank zu durchsuchen.


Dieses Skript ist für debuggbare Anwendungen gedacht. Wie wäre es, wenn die App nicht debuggbar ist?
Blueware

Ihre einzigen Optionen sind wahrscheinlich Sicherungstools, wenn die betreffende App diese Daten als Teil einer Sicherung verfügbar macht. Darüber hinaus befürchte ich, dass dafür erhöhte Berechtigungen erforderlich sind.
Paul Lammertsma

7

Ich konnte nichts anderes für mich arbeiten lassen als das:

adb shell
run-as package.name
cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db
exit
exit
adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/

Der erste Ausgang ist das Verlassen des Run-As, der zweite Ausgang ist das Verlassen der ADB-Shell, um den Pull auszuführen.


3

Für die Debug-Version der App ist es sehr praktisch, einen Befehl adb exec-out run-as xxx.yyy.zzz cat somefile > somefilezum Extrahieren einer einzelnen Datei zu verwenden. Sie müssen jedoch mehrere Male für mehrere Dateien arbeiten. Hier ist ein einfaches Skript, mit dem ich das Verzeichnis extrahiere.

#!/bin/bash
P=
F=
D=

function usage()
{
    echo "$(basename $0) [-f file] [-d directory] -p package"
    exit 1
}

while getopts ":p:f:d:" opt
do
    case $opt in
        p)
            P=$OPTARG
            echo package is $OPTARG
            ;;
        f)
            F=$OPTARG
            echo file is $OPTARG
            ;;
        d)
            D=$OPTARG
            echo directory is $OPTARG
            ;;
        \?)
            echo Unknown option -$OPTARG
            usage
            ;;
        \:)
            echo Required argument not found -$OPTARG
            usage
            ;;
    esac
done

[ x$P == x ] && {
    echo "package can not be empty"
    usage
    exit 1
}

[[ x$F == x  &&  x$D == x ]] && {
    echo "file or directory can not be empty"
    usage
    exit 1
}

function file_type()
{
    # use printf to avoid carriage return
    __t=$(adb shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"")
    echo $__t
}

function list_and_pull()
{
    t=$(file_type $1)
    if [ $t == d ]; then
        for f in $(adb shell run-as $P ls $1)
        do
            # the carriage return output from adb shell should
            # be removed
            mkdir -p $(echo -e $1 |sed $'s/\r//')
            list_and_pull $(echo -e $1/$f |sed $'s/\r//')
        done
    else
        echo pull file $1
        [ ! -e $(dirname $1) ] && mkdir -p $(dirname $1)
        $(adb exec-out run-as $P cat $1 > $1)
    fi
}

[ ! -z $D ] && list_and_pull $D
[ ! -z $F ] && list_and_pull $F

Hoffe es wäre hilfreich. Dieses Skript ist auch bei gist verfügbar .

Typische Verwendung ist

$ ./exec_out.sh -p com.example.myapplication -d databases

Anschließend werden alle Dateien im Verzeichnis Ihrer Apps-Datenbanken /data/data/com.example.myapplication/databasesin das aktuelle Verzeichnis extrahiert .


1
Selbst für mehrere Dateien ist es immer noch nur ein einziger Befehl. Überprüfen Sie das Update stackoverflow.com/a/18472135/1778421, wenn Sie möchten, dass Sie auch eine weitere Pipe auf der Hostseite hinzufügen können, um die Dateien zu entpacken
Alex P.

2

Viel einfacherer Ansatz zum Herunterladen der Datei auf Ihren lokalen Computer:

Führen Sie in Ihrer PC-Shell Folgendes aus:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>

Ziemlich nah dran, aber das zieht eine missgebildete Datenbank für mich heraus.
Nae

1
#!/bin/bash
#export for adb
export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools

adb -d shell 'run-as com.android.app  cp /data/data/com.android.app/files/db.realm /sdcard'
adb pull sdcard/db.realm /Users/userMe/Desktop/db

Sie können dieses Skript verwenden, um die Realm-Datenbank abzurufen.


0

Wenn jemand nach einer anderen Antwort sucht, die sowohl zum Abrufen Databaseals auch zum Abrufen verwendet werden kann, gehen Sie folgendermaßen vor Shared Preferences:

Fügen Sie in Ihrer build.gradleDatei Ihrer App eine Zeile hinzu

debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

Wenn Sie Ihre App jetzt im non-releaseModus ausführen, öffnet Ihre App automatisch den 8080-Port Ihres Geräts. IP addressStellen Sie sicher, dass Ihr Gerät über verbunden ist wifiund Sie laptopdasselbe Netzwerk gemeinsam nutzen. Besuchen Sie jetzt einfach die URL

http: // your_mobile_device_ip: 8080 /

um alle Daten der Datenbank zusammen mit gemeinsamen Einstellungen zu sehen.


0

Hier ist eine Lösung, die auf einem Gerät mit Android 5.1 funktioniert. Das folgende Beispiel ist für Windows.

Sie benötigen sed (oder sed.exe unter Windows, z. B. von cygwin.) (Unter Unix ist es einfach da;)). Um schlechte '\ r' Zeichen zu entfernen, zumindest unter Windows.

Führen Sie nun einfach den folgenden Befehl aus:

adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db

Der Befehl sed entfernt nachgestellte / r-Zeichen.

Natürlich sollten Sie "com.yourcompany.yourapp" durch den Paketnamen der App und "YourDatabaseName" durch den Namen der Datenbank in der App ersetzen.


0

Die Datenbankdatei ist bei Verwendung leeradb run-as . Dies kann durch Aufrufen von close () in der RoomDatabase-Instanz behoben werden. Rufen Sie close () auf, damit SQLite sein Journal auf die Festplatte schreibt. Ich habe diese Schaltfläche erstellt, mit der die Datenbankverbindung auf Anfrage geschlossen wird:

über GIPHY

So rufen Sie close für die RoomDatabase-Instanz auf.

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.