Heim >Backend-Entwicklung >Golang >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!
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?
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
$ 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!