Как использовать adb для резервного копирования более 2 ГБ?

Я пытаюсь сделать резервную копию своего Nexus 7 перед установкой нового заводского образа. (Существует проблема, препятствующая успешному обновлению OTA .) Но когда я запускаю

adb backup -f android-nosystem-backup.ab -apk -shared -all -nosystem

резервная копия зависает после записи 2147483647 байт. Это число равно 2^31 минус 1, и я узнаю, что проблема заключается в отсутствии где-то поддержки больших файлов. Я использую тот adb, который поставляется с моим текущим дистрибутивом Debian Linux «Jessie». Проблема возникает независимо от того, пытаюсь ли я выполнить резервное копирование в локальный файл или на удаленный файловый сервер, подключенный к NFS, поэтому я подозреваю, что что-то в adbцепочке инструментов было скомпилировано без поддержки больших файлов.

Nexus 7 сообщает, что общий объем используемого хранилища составляет 4,2 ГБ, поэтому я ожидаю файл резервной копии такого размера. Есть ли обходной путь, который я должен использовать? Есть ли способ разделить резервную копию на части?

Я этого не пробовал, но, поскольку вы говорите о NFS, я предполагаю, что вы используете Linux на своем компьютере. Сырая идея заключается в использовании именованных каналов (также известных как «fifos», см., например, mkfifoвопросы по SU ). По сути, вы создаете fifo и указываете его как «файл» для adb backup. Параллельно вы запускаете второй процесс, читающий из этого fifo, например, создаете tar-архив, разделенный на блоки максимального размера . Если вы попробуете это, пожалуйста, сообщите нам, как это сработало.
Я использую Linux, как указано в вопросе. Я попробовал файловую систему, отличную от NFS, с той же проблемой. Не знаю, поможет ли именованный канал; Я понял, что другие программы могут занимать больше 2 ГБ в файловой системе NFS, и что у меня были проблемы с моим собственным кодом и большими файлами, которые были решены путем перекомпиляции.
В этом случае это не будет ограничением файловой системы (как было предложено в вашем исходном вопросе). Спасибо за редактирование: я поддерживаю ваше предположение об отсутствии поддержки LFS в двоичном файле. Насколько мне известно, возможности разделения нет. Но поскольку использование канала отличается от записи файла, я бы сказал, что стоит попробовать. Может также оказаться, что это вообще не работает, поскольку обычно вы перенаправляете вывод/ввод при использовании каналов (которые затем действуют как «буфер»), например writerproc > mypipeи readerproc < mypipe.
Я скомпилировал GNU tar, который, в отличие от обычного Android tar, поддерживает файлы размером более 2 ГБ. Мой веб-сайт в данный момент не работает, но у меня есть статически связанный двоичный файл armv7-a для 4.4 и выше (5.0, 5.1, 6.0 и т. д.) здесь . Вы можете поместить это где-нибудь, где вы можете использовать chmod, например, /data/local/tmp, и сделать tarball таким образом, и adb pushвсе.

Ответы (1)