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包的详细内容,更多请关注编程网其它相关文章!