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

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

Por diseño, user comstackció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 

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 . 

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.

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.

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  cat /data/data//databases/' >  

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%5D 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.

Si alguien está buscando otra respuesta que pueda usarse para recuperar la Database y las Shared Preferences , siga este paso:

En su archivo build.gradle de su aplicación, agregue línea

debugCompile ‘com.amitshekhar.android:debug-db:1.0.0’

ahora, cuando ejecutas tu aplicación en modo non-release , tu aplicación abrirá automáticamente el puerto 8080 desde la IP address de tu dispositivo. Asegúrate de que tu dispositivo esté conectado a través de wifi y que tu laptop esté compartiendo la misma red. Ahora simplemente visite la url

http: // your_mobile_device_ip: 8080 /

para ver todos los datos de la base de datos junto con las preferencias compartidas.

Si alguien está buscando extraer la base de datos de la aplicación de depuración puede usar el siguiente procedimiento:

  1. buscar y abrir el explorador de archivos del dispositivo

buscar y abrir el explorador de archivos del dispositivo

  1. Seleccione su teléfono y luego navegue hasta el directorio de data/data

ir al directorio de datos / datos

  1. Ahora encuentra tu paquete de aplicaciones y ve a la carpeta de bases de datos. Puede ver las bases de datos allí y al hacer clic derecho, obtendrá la opción de guardar esto en su disco.

enter image description here