¿Es posible restaurar la copia de seguridad de la partición de datos en un teléfono Android sobre la marcha con solo adb shell?

adb shell dd if=/dev/block/mmcblk0p7 > copia de seguridad.bin

funciona para hacer una copia de seguridad de la partición del teléfono Android en la computadora, pero cuando quiero restaurar usando

gato copia de seguridad.bin | adb shell dd of=/dev/block/mmcblk0p7

no funcionó el shell continúa esperando la entrada en lugar de escribir en el destino inmediatamente como esperaba.

¿Hay algo mal con el comando?

¿Es posible enviar un archivo a un teléfono Android con solo adb shell y comandos internos sobre la marcha (sin enviar primero el archivo de copia de seguridad al teléfono)?


Encontré algo más problemático que hace adb shell (el 0x0D adicional) https://stackoverflow.com/questions/11689511/transferring-binary-data-over-adb-shell-ie-fast-file-transfer-using-tar

Parece que el comando adb shell traduce LF a CRLF:

Entonces adb shell cat a la computadora local no parece tan bueno. Pero todavía quiero saber cómo conectar directamente al shell remoto.

La solución push to sdcard no es aplicable mientras se restaura la partición de datos en un teléfono sin soporte de almacenamiento externo.

Respuestas (2)

Esto funcionará en un linux:

adb shell dd if=/dev/block/mmcblk0p7|sed 's/\r$//' > backup.bin

En MacOS también se puede hacer que funcione, solo necesita hacerlo con Perl:

adb shell dd if=/dev/block/mmcblk0p7|perl -pe 's/\x0D\x0A/\x0A/g' > backup.bin

Suponiendo que el archivo se encuentra en su computadora, pero desea restaurarlo en su dispositivo:

adb push /usr/local/backup/backup.bin /sdcard/backup.bin
adb shell dd if=/sdcard/backup.bin of=/dev/block/mmcblk0p7

debe al truco. Explicación: el primer comando copia el backup.binarchivo en su tarjeta SD, y en la segunda línea ddlo lee desde allí y luego lo escribe en el dispositivo especificado. Es posible que desee combinar esto con una sola línea:

adb push /usr/local/backup/backup.bin /sdcard/backup.bin && adb shell dd if=/sdcard/backup.bin of=/dev/block/mmcblk0p7

Esto significa: "Copie el archivo en el dispositivo y ejecútelo ddsolo cuando el proceso de copia se haya realizado correctamente".

Para responder a la otra parte de su pregunta (qué tiene de malo su comando): envía el archivo al adbproceso local en su computadora, no al ddproceso remoto en su dispositivo. adbno sabe cómo "entregarlo". Entonces, ¿por qué funciona al revés? Porque allí captura la salida que se muestra en su computadora local, que por supuesto puede redirigir localmente.