11 votos

La extracción de ADB se detiene tras el primer error

Estoy tratando de hacer una copia completa de /sdcard de mi OnePlus 3T no rooteado a mi PC con Windows.

Hasta ahora lo he intentado:

  • adb pull /sdcard/ C:\mylocalfolder\

    Funciona bien, pero en cuanto hay un error detiene el proceso, por lo que el proceso de copia se ha truncado. El error se debe a un archivo que contiene ":" en el nombre, por lo que no se puede copiar en Windows.


  • adb exec-out tar c sdcard > sdcard_backup.tar

    No funciona, se detiene inmediatamente y crea un archivo corrupto de 4kb.


  • Copiar los archivos utilizando Windows a través del modo de transferencia de datos

    Windows se detiene calculando el tiempo para copiar archivos.


Adb pull sería la solución ideal hasta ahora si hay una manera de saltar/ignorar los errores para que pueda seguir copiando los archivos, o tal vez tratar de saltar los archivos con ciertos caracteres.

He probado tanto la versión 1.0.32 de Adb como la 1.0.41 (última versión de julio de 2020).

¿Alguna sugerencia?

1 votos

Mantenga una pequeña distro de Linux instalada en el PC como sistema operativo secundario (incluso en un USB). Haz la vida más fácil. // tar es la mejor manera de manejar los problemas de nombres de archivos entre plataformas. Debería funcionar. Prueba con adb shell tar c sdcard > sdcard_backup.tar . Además, a diferencia de exec-out esto no fusionará STDERR con SRDOUT.

1 votos

Intente adebar o adb-sync

0 votos

@alecxs ¿hay alguna forma de saber cuánto ha avanzado este comando? Me parece que el objetivo tar el tamaño del archivo no se actualiza

12voto

alecxs Puntos 29

Se recomienda citar para dejar más claro qué comandos se ejecutarán en el cliente y qué tuberías/redirecciones se designan para ejecutarse en el lado del host. Básicamente este comando debería funcionar:

adb exec-out "tar -c /sdcard" > sdcard_backup.tar

Mira el archivo corrupto de 4 kb. Verás la cabecera del tar y el contenido del archivo. hay una cadena inicial antes del comienzo del archivo tar:

eliminar la "/" inicial de los nombres de los miembros

$ hexdump -C sdcard_backup.tar
00000000  72 65 6d 6f 76 69 6e 67  20 6c 65 61 64 69 6e 67  |removing leading|
00000010  20 27 2f 27 20 66 72 6f  6d 20 6d 65 6d 62 65 72  | '/' from member|
00000020  20 6e 61 6d 65 73 0a 73  64 63 61 72 64 00 00 00  | names.sdcard...|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  00 00 00 00 00 00 00 00  00 00 00 30 30 30 30 37  |...........00007|
00000090  37 37 00 30 30 30 30 30  30 30 00 30 30 30 30 30  |77.0000000.00000|
000000a0  30 30 00 30 30 30 30 30  30 30 30 30 30 30 00 30  |00.00000000000.0|
000000b0  30 30 30 30 30 30 30 30  30 30 00 30 31 34 37 35  |0000000000.01475|
000000c0  37 00 20 32 2f 73 74 6f  72 61 67 65 2f 73 65 6c  |7. 2/storage/sel|
000000d0  66 2f 70 72 69 6d 61 72  79 00 00 00 00 00 00 00  |f/primary.......|

problemática exec-out redirigirá stdin y stderr. al menos evitará los mensajes de error, o incluso mejor atrapará stderr completamente

adb exec-out "tar -c sdcard" > sdcard_backup.tar
adb exec-out "tar -c sdcard 2> /dev/null" > sdcard_backup.tar

Obsérvese la omisión del encabezamiento / Dir root en la línea de comandos. Esta vez se produce un archivo tar de 4 kb

$ hexdump -C sdcard_backup.tar
00000000  73 64 63 61 72 64 00 00  00 00 00 00 00 00 00 00  |sdcard..........|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000060  00 00 00 00 30 30 30 30  37 37 37 00 30 30 30 30  |....0000777.0000|
00000070  30 30 30 00 30 30 30 30  30 30 30 00 30 30 30 30  |000.0000000.0000|
00000080  30 30 30 30 30 30 30 00  30 30 30 30 30 30 30 30  |0000000.00000000|
00000090  30 30 30 00 30 31 34 37  35 37 00 20 32 2f 73 74  |000.014757. 2/st|
000000a0  6f 72 61 67 65 2f 73 65  6c 66 2f 70 72 69 6d 61  |orage/self/prima|
000000b0  72 79 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |ry..............|

parece un archivo de alquitrán saludable. deja tar hace su trabajo. Revela que el archivo es un enlace simbólico

$ tar -vtf sdcard_backup.tar
lrwxrwxrwx root/root         0 1970-01-01 01:00 sdcard -> /storage/self/primary

En modo de arranque /sdcard es sólo un enlace simbólico a /storage/emulated/0
mientras que en el modo de recuperación /sdcard es un bind-mount de /data/media/0

tar no atraviesa los enlaces simbólicos por defecto, por lo que el comando funciona en modo de recuperación. para el modo de arranque utilice tar -h o proporcionar la ruta del directorio en lugar de su enlace simbólico.

Además, en Windows cmd.exe puede añadir más \r retorno de carro para cada \n Por lo tanto, evite la transmisión de datos planos y utilice un algoritmo de compresión que no produzca ningún salto de línea. gzip

adb exec-out "tar -ch sdcard | gzip" > sdcard_backup.tar.gz
adb exec-out "tar -c storage/emulated/0 | gzip" > sdcard_backup.tar.gz

Este archivo tarball puede extraerse de tar ya que la mayoría de las implementaciones de tar detectarán e invocarán automáticamente gzip automáticamente.

$ tar -vtf sdcard_backup.tar.gz
drwxrwx--x root/sdcard_rw    0 2018-01-01 01:00 storage/emulated/0/
drwxrwx--x root/sdcard_rw    0 2018-01-01 01:00 storage/emulated/0/Samsung/
drwxrwx--x root/sdcard_rw    0 2018-01-01 01:00 storage/emulated/0/Samsung/Music/

Para Windows podemos usar 7-Zip como programa alternativo de desempaquetado, que manejará la mayoría de los algoritmos de compresión.

0 votos

Una respuesta muy completa, ¡gracias! Espero poder volver a probarlo durante la noche

0 votos

¡Santo! Eso fue más rápido de lo esperado... oh cierto, tomé la tarjeta sd equivocada. Pero para la tarjeta sd interna puedo confirmar que este método funciona :D crear una copia de seguridad de 3GB de la tarjeta sd interna sólo me llevó unos minutos.

0 votos

En el momento de escribir esto, 9 horas después, mi tarjeta SD externa aún no ha terminado de hacer la copia de seguridad con ese comando (desde el recovery, pantalla desbloqueada). He abortado y he obtenido un archivo de 7GB. Parece que ha sido muy lento.. 7zip informa de una tasa de compresión del 95% pero no consigue abrir el archivo (abortado) ya que aparentemente está defectuoso. Creo que voy a seguir el camino de sacar la tarjeta y leerla en otro dispositivo para copiarla.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X