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 download
copy
- 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
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
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 .
Ich habe ein einfaches Shell-Skript zum Ablegen von Datenbanken veröffentlicht:
Es führt zwei verschiedene hier beschriebene Methoden aus:
\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.
Wenn jemand, der nach einer Datenbank aus der debug-Anwendung sucht, die folgende Vorgehensweise verwenden kann
- suchen und öffnen Sie den Gerätedatei-Explorer
- Wählen Sie Ihr Mobilteil aus und navigieren Sie zum Verzeichnis
data/data
- 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.
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.
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.
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>
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
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.
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:
So rufen Sie close für die RoomDatabase-Instanz auf.
#!/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.