CQM
En un dispositivo Android no rooteado, puedo navegar a la carpeta de datos que contiene la base de datos usando el run-as
comando 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 me gustaría extraerlos del dispositivo Android.
Hay un download
copy
o move
comando de 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 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 que se hace esto y se mueve a la máquina, lo que me deja muy desviado cuando podría haber una solución más directa para empezar.
alex p
Por diseño user
compilación de Android (eso es lo que tiene en su teléfono hasta que desbloquee el gestor de arranque y flashear el teléfono con userdebug
o eng
software) restringe el acceso al Almacenamiento interno – cada aplicación solo puede acceder a sus propios archivos. Afortunadamente para los desarrolladores de software que no están dispuestos a raíz sus teléfonos Google proporciona una manera de acceder a la Almacenamiento interno de depurable versiones de sus paquetes usando run-as
mando.
Para descargar el /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 bajo el /data/data/debuggable.app.package.name/
a la vez – uso 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
-
O simplemente usa
run-as
para copiar el archivo a un lugar en el almacenamiento externo y extraer el archivo de la base de datos desde allí, en lugar de perder el tiempo con los permisos del archivo.– CommonsWare
4 de julio de 2014 a las 11:02
-
Run-as no tiene permiso para escribir en la tarjeta SD; se agregó algo nuevo con la última actualización… 🙁
– ranura
13 de enero de 2015 a las 11:09
-
Cuando ejecuto adb shell “run-as package.name chmod 666 /data/data/package.name/databases/file” adb me termina el error –>run-as: exec falló para chmod666 Error: Permiso denegado. estoy en nexus 7 sin root
– Shudy
13 de enero de 2015 a las 12:02
-
El acceso de escritura a la tarjeta SD externa ya no es posible con adb.
– ranura
13 de enero de 2015 a las 13:40
-
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 ha sido 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 y vuelva a intentar el comando. Espero que esto ayude a alguien.
– Aonghus Shortt
14 de abril de 2017 a las 18:02
mármol
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 .
-
Esta debería ser la nueva respuesta correcta O @Alex P. Debe agregar esta respuesta para las versiones más nuevas 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
31 de marzo de 2015 a las 9:10
-
Mi dispositivo está rooteado, pero descubrí que todavía necesito ejecutar
su
para obtener elrun-as
mando funcionando.– ThomasW
9 de abril de 2015 a las 8:26
-
¿Qué pasa si no tienes una tarjeta SD?
– Zorro Gyum
23 de septiembre de 2015 a las 12:19
-
si no tiene una tarjeta SD, todavía hay un directorio “sdcard” de todos modos.
– los árboles están en todas partes
23/09/2015 a las 22:50
-
¡Genial!. funcionó para mí también. ¿Podemos hacer un archivo por lotes/shell? simplemente pasando el nombre del archivo db como parámetro y tenemos el archivo db.
– Qadir Hussein
18 de agosto de 2017 a las 11:09
Si alguien busca extraer la base de datos de aplicación de depuración puede usar el siguiente procedimiento:
- buscar y abrir el explorador de archivos del dispositivo
- Seleccione su teléfono y luego navegue hasta
data/data
directorio
- 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 derecho, obtendrá la opción de guardar esto en su disco.
-
Guau, mucho más fácil y seguro en comparación con el uso de adb-shell
– usuario1708860
10 de marzo de 2019 a las 12:43
-
En Android Studio 4.1.3 Ver->Herramientas de Windows->Explorador de archivos del dispositivo
– redocodificador
23 de marzo de 2021 a las 9:26
-
¡La manera más fácil! ¡Gracias!
– Joel Nieman
27 de agosto de 2021 a las 9:45
Pablo Lammertsma
He publicado un script de shell simple para volcar bases de datos:
Realiza dos métodos distintos descritos aquí:
- Primero, intenta hacer que el archivo sea accesible para otros usuarios e intenta extraerlo del dispositivo.
- Si eso falla, transmite el contenido del archivo a través de la terminal a la máquina local. Realiza un truco adicional para eliminar
\r
caracteres que algunos dispositivos envían al shell.
Desde aquí puede usar una variedad de aplicaciones CLI o GUI SQLite, como sqlite3
o sqlitebrowser
para navegar por el contenido de la base de datos.
Triplee121
No pude hacer que nada más funcionara para mí, excepto 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 de 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 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 útil. Este guión también está disponible en esencia.
El uso típico es
$ ./exec_out.sh -p com.example.myapplication -d databases
luego extraerá todos los archivos en el directorio de bases de datos de su aplicación, que es /data/data/com.example.myapplication/databases
en el directorio actual.
emre
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>
-
Bastante cerca, pero esto me saca una base de datos mal formada.
– No
15 de marzo de 2019 a las 13:13
-
Tuve que saltarme el
-d
en mi caso, de lo contrario, esta es la forma en que siempre busco (es decir, google) cuando intento extraer un archivo.– Krøllebølle
13 oct 2020 a las 10:47
Pruebe adb pull stackoverflow.com/questions/8650407/…
– Indoloro
27 de agosto de 2013 a las 17:28
stackoverflow.com/questions/13006315 Extracción de base de datos sin dispositivo de enraizamiento
– Príncipe Naveen P
20 de mayo de 2016 a las 6:56