php小编子墨可以帮你解答关于adb备份的.ab文件解压并写入tar包的问题。adb备份是Android系统中的一种备份方式,生成的备份文件后缀名为.ab。如果你想解压和写入tar包,可以通过使用ADB工具和tar命令来完成。首先,使用ADB命令将.ab文件转换为tar包,然后再使用tar命令解压tar包。这样就可以将备份文件还原到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 文件已损坏还是处理方法错误?
很可能是 .ab 文件已损坏。
但是您的代码也存在问题。从 .ab 文件读取时应跳过前 24 个字节。否则,您应该看到此错误:zlib:无效的标头
。由于您看到其他内容,我会假设您的 .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://www.php.cn/link/6e67691b60ed3e4a55935261314dd534 a>,也得到了相同的结果。因此 backup.ab
文件应该已损坏。
$ java -jar ~/Downloads/abe.jar unpack backup.ab backup3.tar $ md5sum backup*.tar 3eff01578dec035367688e03b6ec7a72 backup2.tar 3eff01578dec035367688e03b6ec7a72 backup3.tar 3eff01578dec035367688e03b6ec7a72 backup.tar
以上是我想将adb备份的.ab文件解压并写入tar包的详细内容。更多信息请关注PHP中文网其他相关文章!