Heim  >  Artikel  >  Backend-Entwicklung  >  Ich möchte die von adb gesicherte .ab-Datei dekomprimieren und in ein TAR-Paket schreiben

Ich möchte die von adb gesicherte .ab-Datei dekomprimieren und in ein TAR-Paket schreiben

WBOY
WBOYnach vorne
2024-02-10 08:15:171071Durchsuche

Ich möchte die von adb gesicherte .ab-Datei dekomprimieren und in ein TAR-Paket schreiben

Der PHP-Editor Zimo kann Ihnen bei der Beantwortung der Frage helfen, wie Sie die von adb gesicherte .ab-Datei dekomprimieren und in ein TAR-Paket schreiben können. adb backup ist eine Sicherungsmethode im Android-System. Das Suffix der generierten Sicherungsdatei ist .ab. Wenn Sie einen Tarball dekomprimieren und schreiben möchten, können Sie dies mit dem ADB-Tool und dem Befehl tar tun. Verwenden Sie zunächst den ADB-Befehl, um die .ab-Datei in ein TAR-Paket zu konvertieren, und dekomprimieren Sie dann das TAR-Paket mit dem Befehl tar. Auf diese Weise können Sie die Sicherungsdatei im Tarball wiederherstellen. Ich hoffe, diese Antwort ist hilfreich für Sie!

Frageninhalt

Ich werde wie folgt damit umgehen

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()

Fehler aufgetreten: io.copy backup.ab -> backup.ab.tar fehlgeschlagen: unerwartetes eof

Liegt das daran, dass die .ab-Datei beschädigt ist oder die Verarbeitungsmethode falsch ist?

Lösung

Höchstwahrscheinlich ist die .ab-Datei beschädigt.

Aber es gibt auch ein Problem mit Ihrem Code. Beim Lesen aus .ab-Dateien sollten die ersten 24 Bytes übersprungen werden. Andernfalls sollte dieser Fehler angezeigt werden: zlib:无效的标头. Da Sie etwas anderes sehen, gehe ich davon aus, dass Ihre .ab-Datei beschädigt ist.

Übrigens ist kein rd := bufio.newreader(bf) nötig.

Das ist die Demo, die für mich funktioniert:

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)
    }
}

Update:

Testete die Demo mit backup.ab und es wurden keine Fehler gemeldet. Aber die generierte TAR-Datei ist ungültig:

$ tar tvf backup.tar
<...list of files truncated...>
tar: unexpected eof in archive
tar: error is not recoverable: exiting now

Habe es mit zlib-flate versucht und habe das gleiche Ergebnis erhalten:

$ dd if=backup.ab ibs=24 skip=1 | zlib-flate -uncompress > backup2.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72  backup2.tar
3eff01578dec035367688e03b6ec7a72  backup.tar

Versucht https://www.php.cn/link/6e67691b60ed3e4a55935261314dd534 a> und habe das gleiche Ergebnis erhalten. Daher backup.ab sollte die Datei beschädigt sein.

$ java -jar ~/Downloads/abe.jar unpack backup.ab backup3.tar
$ md5sum backup*.tar
3eff01578dec035367688e03b6ec7a72  backup2.tar
3eff01578dec035367688e03b6ec7a72  backup3.tar
3eff01578dec035367688e03b6ec7a72  backup.tar

Das obige ist der detaillierte Inhalt vonIch möchte die von adb gesicherte .ab-Datei dekomprimieren und in ein TAR-Paket schreiben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen