studio not how found emulator debug android database shell adb android-sqlite

android - not - use database sqlite



android adb, recupera la base de datos usando run-as (7)

En un dispositivo Android no rooteado, puedo navegar a la carpeta de datos que contiene la base de datos usando el comando run-as con mi nombre de paquete. La mayoría de los tipos de archivos me contentan con solo verlos, pero con la base de datos que quisiera extraer si provienen del dispositivo Android.

¿Hay algún comando de copy o move download desde esta parte del shell adb? Me gustaría descargar el archivo de base de datos y ver su contenido usando un navegador de base de datos.

Una respuesta aquí implica convertir todo el paquete de la aplicación en un archivo comprimido, pero no hay más respuestas sobre cómo extraer ese archivo una vez hecho y trasladado a la máquina, dejándome muy desviado cuando podría haber una solución más directa para comenzar.

gracias


Aquí hay una solución que funciona en un dispositivo con Android 5.1. El siguiente ejemplo es para Windows.

Necesita sed ([ https://www.gnu.org/software/sed/manual/sed.html] o sed.exe en Windows, p. Ej., De cygwin.) (En Unix, simplemente estará allí;)) . Para eliminar los malos caracteres "/ r", al menos en Windows.

Ahora solo ejecuta el siguiente comando:

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

El comando sed elimina los caracteres / r finales.

Por supuesto, debe reemplazar "com.yourcompany.yourapp" con el nombre del paquete de la aplicación y "YourDatabaseName" con el nombre de la base de datos en la aplicación.


La respuesta aceptada ya no funciona (¿bloqueada por Android?)

Entonces, en cambio, hice esto:

> 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 .


Método mucho más simple para descargar el archivo en su computadora local:

En el shell de tu PC ejecuta:

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


No pude conseguir nada más para trabajar para mí, pero esto:

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

La primera salida es salir del run-as, la segunda salida es salir de adb shell para hacer el pull.


Para la versión de depuración de la aplicación, es muy conveniente usar el comando adb exec-out run-as xxx.yyy.zzz cat somefile > somefile para extraer un solo archivo. Pero tienes que hacerlo varias veces para múltiples archivos. Aquí hay un script simple que utilizo para extraer el directorio.

#!/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

Espero que sea útil. Este script también está disponible en gist .

El uso típico es

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

luego extraerá todos los archivos del directorio de bases de datos de aplicaciones, que es /data/data/com.example.myapplication/databases , en el directorio actual.


Por diseño, user compilación del user de Android (eso es lo que tienes en tu teléfono hasta que desbloquees el gestor de arranque y userdebug el teléfono con el software userdebug o eng ) restringe el acceso al almacenamiento interno : cada aplicación solo puede acceder a sus propios archivos. Afortunadamente para los desarrolladores de software que no desean rootear sus teléfonos, Google proporciona una forma de acceder al Almacenamiento interno de las versiones de sus paquetes depurables mediante el comando run-as .

Para descargar /data/data/debuggable.app.package.name/databases/file desde un dispositivo Android 5.1+, ejecute el siguiente comando:

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

Para descargar varios archivos en una carpeta en /data/data/debuggable.app.package.name/ de una vez, use 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


Publiqué un script de shell simple para las bases de datos de volcado:

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

Realiza dos métodos distintos que se describen aquí:

  1. En primer lugar, intenta hacer que el archivo sea accesible para otros usuarios e intentar extraerlo del dispositivo.
  2. Si eso falla, transmite los contenidos del archivo sobre la terminal a la máquina local. Realiza un truco adicional para eliminar los caracteres que algunos dispositivos generan en el shell.

Desde aquí puede usar una variedad de aplicaciones CLI o GUI SQLite, como sqlite3 o sqlitebrowser , para explorar los contenidos de la base de datos.