Я лечусь следующим образом
bf, err := os.Open(backupFilePath)
if err != nil {
fmt.Println("os.Open: ", err)
return
}
defer bf.Close()
rd := bufio.NewReader(bf)
tarFile, err := os.Create(tarFilePath)
if err != nil {
fmt.Println("os.Create: ", err)
return
}
defer tarFile.Close()
zf, zerr := zlib.NewReader(rd)
if zerr != nil {
return "", zerr
}
_, err = io.Copy(tarFile, zf)
if err != nil {
fmt.Println("io.Copy backup.ab -> backup.ab.tar failed: ", err)
}
zf.Close()
Произошла ошибка: ошибка io.Copy backup.ab -> backup.ab.tar: непредвиденный EOF
Это связано с тем, что файл .ab поврежден, или это неправильный способ его обработки?
После того, как я использую abe.jar для распаковки, файл можно открыть в обычном режиме, а файл .ab не зашифрован.

Скорее всего, файл .ab поврежден.
Но в вашем коде тоже есть проблема. Вы должны пропустить первые 24 байта при чтении из файла .ab. В противном случае вы должны увидеть эту ошибку: zlib: invalid header. Поскольку вы видите что-то еще, я бы предположил, что ваш файл .ab поврежден.
Кстати, rd := bufio.NewReader(bf) не нужен.
Вот демо, которое работает для меня:
package main
import (
"compress/zlib"
"io"
"os"
)
func main() {
bf, err := os.Open("temp.ab")
if err != nil {
panic(err)
}
defer bf.Close()
if _, err := bf.Seek(24, 0); err != nil {
panic(err)
}
zf, err := zlib.NewReader(bf)
if err != nil {
panic(err)
}
defer zf.Close()
tarFile, err := os.Create("temp.tar")
if err != nil {
panic(err)
}
defer tarFile.Close()
_, err = io.Copy(tarFile, zf)
if err != nil {
panic(err)
}
}
Обновлять:
Протестировал демо с помощью backup.ab, ошибок не было. Но сгенерированный файл tar недействителен:
$ tar tvf backup.tar
<...list of files truncated...>
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Пробовал с zlib-flate, получил тот же результат:
$ dd if=backup.ab ibs=24 skip=1 | zlib-flate -uncompress > backup2.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72 backup2.tar
3eff01578dec035367688e03b6ec7a72 backup.tar
Пробовал с https://github.com/nelenkov/android-backup-extractor, тоже получил тот же результат. Таким образом, файл backup.ab должен быть поврежден.
$ java -jar ~/Downloads/abe.jar unpack backup.ab backup3.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72 backup2.tar
3eff01578dec035367688e03b6ec7a72 backup3.tar
3eff01578dec035367688e03b6ec7a72 backup.tar
Я использовал github.com/nelenkov/android-backup-extractor для извлечения файла .ab и обнаружил, что его можно нормально открыть.
Это интересно. Можете ли вы поделиться файлом .ab?
Я поместил файл .ab на свой GitHub. github.com/manguanghui/File/blob/main/backup.ab
Файл tar, сгенерированный из «backup.ab», недействителен. Но zlib-flate дает тот же результат. Смотрите мой обновленный ответ.
То есть этот файл .ab должен быть поврежденным файлом.
Согласно nelenkov.blogspot.com/2012/06/unpacking-android-backups.html автора android-backup-extractor, кажется, что Java Deflater особенный и его реализация на другом языке несовместима.
Только что проверил с github.com/nelenkov/android-backup-extractor, тоже получил тот же результат. Таким образом, кажется, что файл «backup.ab» поврежден. Смотрите обновленный ответ.
Вы уверены, что резервная копия не зашифрована (пароль резервной копии не установлен? Что произойдет, если вы попытаетесь извлечь файл tar с помощью github.com/nelenkov/android-backup-extractor