wake-up-neo.com

android ADB, Datenbank mit Run-as abrufen

Auf einem nicht gerooteten Android-Gerät kann ich mithilfe des Befehls run-as mit meinem Paketnamen zum Datenordner mit der Datenbank navigieren. Die meisten Dateitypen, mit denen ich nur zufrieden bin, sind mit der Datenbank zufrieden, aber mit der Datenbank möchte ich sie vom Android-Gerät abrufen.

Gibt es einen downloadcopy- oder move-Befehl aus diesem Teil der Adb-Shell? Ich möchte die Datenbankdatei herunterladen und ihren Inhalt mit einem Datenbankbrowser anzeigen.

Eine Antwort hier ist die Umwandlung des gesamten Anwendungspakets in ein komprimiertes Archiv. Es gibt jedoch keine weitere Antwort darauf, wie das Archiv extrahiert wird, sobald es fertiggestellt und auf die Maschine verschoben wurde. Das würde mich sehr ablenken, wenn es vielleicht eine direktere Lösung gibt

93
CQM

Von Design user build von Android (das haben Sie auf Ihrem Telefon, bis Sie den bootloader entsperren und das Telefon mit der Software userdebug oder eng flashen) beschränkt den Zugriff auf Internal Storage - jede App kann nur auf sie zugreifen eigene Dateien. Zum Glück für Softwareentwickler, die nicht bereit sind, root ihre Handys zu verwenden. Google bietet eine Möglichkeit, auf die Internal Storage - Version von debuggable der Pakete mit dem Befehl run-as zuzugreifen. 

Um den /data/data/debuggable.app.package.name/databases/file von einem Android 5.1-Gerät herunterzuladen, führen Sie den folgenden Befehl aus:

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

Um mehrere Dateien gleichzeitig in einem Ordner unter /data/data/debuggable.app.package.name/ herunterzuladen, verwenden Sie 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
205
Alex P.

Die akzeptierte Antwort funktioniert für mich nicht mehr (von Android blockiert?)

Also stattdessen habe ich das 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 .
63
marmor

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

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

Es führt zwei verschiedene hier beschriebene Methoden aus:

  1. Zunächst wird versucht, die Datei für andere Benutzer zugänglich zu machen, und versucht, sie vom Gerät abzurufen.
  2. Wenn dies fehlschlägt, werden die Inhalte der Datei über das Terminal an den lokalen Computer übertragen. Es führt einen zusätzlichen Trick aus, um \r-Zeichen zu entfernen, die von einigen Geräten an die Shell ausgegeben werden.

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

8
Paul Lammertsma

Wenn jemand, der nach einer Datenbank aus der debug-Anwendung sucht, die folgende Vorgehensweise verwenden kann

  1. suchen und öffnen Sie den Gerätedatei-Explorer

 search and open device file Explorer

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

 go to data/data directory

  1. Finden Sie jetzt Ihr Anwendungspaket und gehen Sie zum Datenbankordner. Sie können die Datenbanken dort sehen und bei einem Rechtsklick erhalten Sie die Option um dies in Ihrem Laufwerk zu speichern.

 enter image description here

7
Ifta

Ich konnte nichts anderes für mich bekommen, außer dies:

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

Die erste Ausfahrt ist das Beenden des Run-as. Die zweite Ausfahrt ist das Beenden von adb Shell, um den Pull auszuführen.

5
Triplee121

Für die Debug-Version der App ist es sehr praktisch, den Befehl adb exec-out run-as xxx.yyy.zzz cat somefile > somefile zum Extrahieren einer einzelnen Datei zu verwenden. Für mehrere Dateien müssen Sie jedoch mehrere Male machen. 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

Ich hoffe es wäre hilfreich. Dieses Skript ist auch unter Gist verfügbar. 

Typische Verwendung ist 

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

dann werden alle Dateien im Verzeichnis Ihrer Apps-Datenbanken (/data/data/com.example.myapplication/databases) in das aktuelle Verzeichnis extrahiert.

2
alijandro

Einfacher geht es beim Herunterladen der Datei auf Ihren lokalen Computer:

In Ihrer PC-Shell ausführen:

adb -d Shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
1
Emre

Wenn jemand nach einer anderen Antwort sucht, die verwendet werden kann, um Database sowie Shared Preferences abzurufen, gehen Sie wie folgt vor:

Fügen Sie in Ihrer build.gradle-Datei Ihrer App eine Zeile hinzu

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

wenn Sie nun Ihre App im non-release-Modus ausführen, öffnet Ihre App automatisch den 8080-Port von Ihrem Gerät IP address. Stellen Sie sicher, dass Ihr Gerät über wifi verbunden ist und dass laptop dasselbe Netzwerk verwendet. Besuchen Sie jetzt einfach die URL 

http: // your_mobile_device_ip: 8080/

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

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 ([ https://www.gnu.org/software/sed/manual/sed.html] oder sed.exe unter Windows, z. B. von cygwin.) (Unter Unix ist es einfach so Dort ;) ). Entfernen Sie fehlerhafte '\ r'-Zeichen, zumindest unter Windows.

Führen Sie 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 nachfolgende/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 lautet emtpy , wenn adb run-as verwendet wird. 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, die die Datenbankverbindung auf Anfrage schließt:

über GIPHY

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

0
Eimert
#!/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 zum Abrufen der Realm-Datenbank verwenden.

0
dralexnumber