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:
Realiza dos métodos distintos que se describen aquí:
- En primer lugar, intenta hacer que el archivo sea accesible para otros usuarios e intentar extraerlo del dispositivo.
- 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.