Recupere la base de datos o cualquier otro archivo del almacenamiento interno mediante ejecutar como

113

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

¿Existe un comando download copyor movede esta parte de adb shell? Me gustaría descargar el archivo de la base de datos y ver su contenido usando un navegador de base de datos.

Una respuesta aquí implica convertir el paquete completo de la aplicación en un archivo comprimido, pero no hay más respuesta sobre cómo extraer ese archivo una vez que esto se hace y se mueve a la máquina, dejándome muy desviado cuando podría haber una solución más directa para empezar.

CQM
fuente
Prueba adb pull stackoverflow.com/questions/8650407/…
Sin dolor
stackoverflow.com/questions/13006315 Extraer la base de datos sin dispositivo de enraizamiento
Naveen Prince P

Respuestas:

230

Por diseño userde construcción de Android (que es lo que tiene en su teléfono hasta que desbloquee el gestor de arranque y el flash del teléfono con userdebugo engsoftware) restringe el acceso al almacenamiento interno - cada aplicación sólo puede acceder a sus propios archivos. Afortunadamente para los desarrolladores de software que no están dispuestos a rootear sus teléfonos, Google proporciona una forma de acceder al almacenamiento interno de versiones depurables de sus paquetes mediante run-ascomando.

Para descargar el /data/data/debuggable.app.package.name/databases/filedesde 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 de una /data/data/debuggable.app.package.name/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
Alex P.
fuente
8
O simplemente use run-aspara copiar el archivo a un lugar en el almacenamiento externo y extraiga el archivo de la base de datos desde allí, en lugar de jugar con los permisos del archivo.
CommonsWare
5
El run-as no tiene permiso para escribir en la sdcard; se agregó algo nuevo con la última actualización ... :(
slott
4
Cuando ejecuto adb shell "run-as package.name chmod 666 /data/data/package.name/databases/file" adb termina error -> run-as: exec falló para chmod666 Error: Permiso denegado. Estoy en Nexus 7 sin root
Shudy
2
El acceso de escritura a la tarjeta sd externa ya no es posible con adb.
slott
3
Si encuentra que está recuperando un archivo en blanco o casi en blanco, es posible que el archivo sea simplemente un error de la consola que se ha redirigido a este archivo que ha creado. Un problema frecuente aquí es que está intentando copiar una base de datos de la variante de lanzamiento de su aplicación. Solo puede copiar bases de datos de la variante de depuración de su aplicación . Si esto sucede, simplemente instale la variante de depuración e intente el comando nuevamente. Espero que esto ayude a alguien.
Aonghus Shortt
73

La respuesta aceptada ya no me 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 .
marmor
fuente
3
Esta debería ser la nueva respuesta correcta O @Alex P. Deberías agregar esta respuesta para las versiones más recientes de Android. También en mi caso tuve que usar 777 y aplicarlo al directorio de la base de datos primero / también antes de poder acceder al archivo db.
muetzenflo
1
Mi dispositivo está rooteado, pero descubrí que todavía necesito ejecutarlo supara que el run-ascomando funcione.
ThomasW
¿Qué pasa si no tienes una tarjeta SD?
Gyum Fox
1
si no tiene una tarjeta SD, todavía hay un directorio "sdcard" de todos modos.
treesAreEverywhere
1
¡Excelente!. también funcionó para mí. ¿Podemos hacer un archivo por lotes / shell? simplemente pasando el nombre del archivo db como param y tenemos el archivo db.
Qadir Hussain
22

Si alguien que busca 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 busque el data/datadirectorio

ir al directorio de datos / datos

  1. Ahora busque su paquete de aplicación y vaya a la carpeta de bases de datos. Puede ver las bases de datos allí y al hacer clic con el botón derecho, tendrá la opción de guardar esto en su disco.

ingrese la descripción de la imagen aquí

Ifta
fuente
1
Vaya, mucho más fácil y seguro en comparación con el uso de adb-shell
user1708860
9

He publicado un script de shell simple para volcar bases de datos:

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

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

  1. Primero, intenta hacer que el archivo sea accesible para otros usuarios e intenta extraerlo del dispositivo.
  2. Si eso falla, transmite el contenido del archivo a través del terminal a la máquina local. Realiza un truco adicional para eliminar los \rcaracteres que algunos dispositivos envían al shell.

Desde aquí puede utilizar una variedad de aplicaciones CLI o GUI SQLite, como sqlite3o sqlitebrowser, para explorar el contenido de la base de datos.

Paul Lammertsma
fuente
Este script es para aplicaciones depurables, ¿qué tal si la aplicación no se puede depurar?
blueware
Es probable que sus únicas opciones usen herramientas de respaldo, si la aplicación en cuestión expone esos datos como parte de un respaldo. Más allá de eso, me temo que requeriría permisos elevados.
Paul Lammertsma
7

No pude hacer que nada más funcionara 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 del adb shell para hacer la extracción.

Triplee121
fuente
3

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 > somefilepara extraer un solo archivo. Pero tienes que hacerlo varias veces para varios archivos. Aquí hay un script simple que uso 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 de ayuda. 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 su aplicación, es decir /data/data/com.example.myapplication/databases, al directorio actual.

alijandro
fuente
1
incluso para varios archivos, sigue siendo un solo comando. consulte la actualización stackoverflow.com/a/18472135/1778421 si prefiere que también pueda agregar otra tubería en el lado del host para descomprimir los archivos
Alex P.
2

Un enfoque mucho más simple para descargar el archivo en su computadora local:

En el shell de su PC, ejecute:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
Emre
fuente
Bastante cerca, pero esto me saca una base de datos mal formada.
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

Puede utilizar este script para obtener la base de datos de Realm.

dralexnumber
fuente
0

Si alguien está buscando otra respuesta que se pueda usar para recuperar Databasey Shared Preferencesluego siga este paso:

En su build.gradlearchivo de su aplicación, agregue una línea

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

ahora, cuando ejecute su aplicación en non-releasemodo, su aplicación abrirá automáticamente el puerto 8080 desde su dispositivo, IP addressasegúrese de que su dispositivo esté conectado a través de wifiy laptopesté compartiendo la misma red. Ahora simplemente visite la URL

http: // ip_su_dispositivo_móvil: 8080 /

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

Pradeep Kumar Kushwaha
fuente
0

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

Necesita sed (o sed.exe en Windows, por ejemplo, de cygwin.) (En Unix, simplemente estará allí;)). Para eliminar los caracteres '\ r' incorrectos, al menos en Windows.

Ahora simplemente ejecute 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.

árbolesAreEverywhere
fuente
0

El archivo de la base de datos está vacío cuando se usa adb run-as. Esto se puede resolver llamando a close () en la instancia de RoomDatabase. Llame a close () para permitir que SQLite escriba su diario en el disco. Creé este botón que cierra la conexión de la base de datos a pedido:

vía GIPHY

A continuación, se explica cómo realizar una llamada de cierre en la instancia de RoomDatabase.

Eimert
fuente