Я хочу распаковать файл .ab, зарезервированный adb, и записать его в пакет tar

Я лечусь следующим образом

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 поврежден, или это неправильный способ его обработки?

Вы уверены, что резервная копия не зашифрована (пароль резервной копии не установлен? Что произойдет, если вы попытаетесь извлечь файл tar с помощью github.com/nelenkov/android-backup-extractor

Robert 24.04.2023 16:34

После того, как я использую abe.jar для распаковки, файл можно открыть в обычном режиме, а файл .ab не зашифрован.

YuSheng 25.04.2023 04:11
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Скорее всего, файл .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 и обнаружил, что его можно нормально открыть.

YuSheng 25.04.2023 07:19

Это интересно. Можете ли вы поделиться файлом .ab?

Zeke Lu 25.04.2023 07:28

Я поместил файл .ab на свой GitHub. github.com/manguanghui/File/blob/main/backup.ab

YuSheng 25.04.2023 08:08

Файл tar, сгенерированный из «backup.ab», недействителен. Но zlib-flate дает тот же результат. Смотрите мой обновленный ответ.

Zeke Lu 25.04.2023 08:47

То есть этот файл .ab должен быть поврежденным файлом.

YuSheng 25.04.2023 09:20

Согласно nelenkov.blogspot.com/2012/06/unpacking-android-backups.html автора android-backup-extractor, кажется, что Java Deflater особенный и его реализация на другом языке несовместима.

Zeke Lu 25.04.2023 09:24

Только что проверил с github.com/nelenkov/android-backup-extractor, тоже получил тот же результат. Таким образом, кажется, что файл «backup.ab» поврежден. Смотрите обновленный ответ.

Zeke Lu 25.04.2023 09:38

Другие вопросы по теме