Можно ли восстановить резервную копию раздела данных на телефоне Android на лету с помощью только оболочки adb?

adb shell dd if=/dev/block/mmcblk0p7 > backup.bin

работает для резервного копирования раздела телефона Android на компьютер, но когда я хочу восстановить с помощью

резервная копия кота.bin | Оболочка adb dd =/dev/block/mmcblk0p7

это не сработало. оболочка продолжает ожидать ввода вместо немедленной записи в цель, как я ожидал.

Что-то не так с командой?

Можно ли перенести файл на телефон Android с помощью только оболочки adb и внутренних команд на лету (без предварительной загрузки файла резервной копии на телефон)?


Я нашел еще одну проблему, которую создает оболочка adb (дополнительный 0x0D) https://stackoverflow.com/questions/11689511/transferring-binary-data-over-adb-shell-ie-fast-file-transfer-using-tar

Кажется, команда оболочки adb переводит LF в CRLF:

Таким образом, adb shell cat для локального компьютера кажется не таким уж хорошим. Но я все еще хочу знать, как обращаться напрямую к удаленной оболочке.

Решение push to sdcard неприменимо при восстановлении раздела данных на телефоне без поддержки внешнего хранилища.

Ответы (2)

Это будет работать в Linux:

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

В MacOS это тоже можно заставить работать, вам просто нужно сделать это с помощью Perl:

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

Предположим, что файл находится на вашем компьютере, но вы хотите восстановить его на своем устройстве:

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

должен к трюку. Объяснение: Первая команда копирует backup.binфайл на вашу SDCard, а во второй строке ddчитает его оттуда и потом записывает на указанное устройство. Возможно, вы захотите объединить это с однострочным:

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

Это означает: «Скопируйте файл на устройство и выполняйте ddтолько после успешного завершения процесса копирования».

Чтобы ответить на другую часть вашего вопроса (что не так с вашей командой): вы передаете файл локальному adbпроцессу на вашем компьютере, а не удаленному ddпроцессу на вашем устройстве. adbне умеет "сдавать". Так почему это работает наоборот? Потому что там вы фиксируете вывод, отображаемый на вашем локальном компьютере, который, конечно же, вы можете перенаправить локально.