You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解压adb备份的.ab文件转tar包遇EOF错误,求原因排查

解决adb .ab文件解压转tar时的Unexpected EOF错误

你的处理方式有误,这是导致Unexpected EOF错误的核心原因——adb生成的.ab文件并非纯zlib压缩数据,它开头带有24字节的固定备份头,直接用zlib读取整个文件会让压缩解析逻辑出错。

.ab文件的结构说明

-.ab文件前24字节是备份头,包含:

  • 8字节的魔数字符串ANDROID BACKUP
  • 4字节的版本号(一般为1)
  • 4字节的压缩标识(1代表启用zlib压缩,0代表未压缩)
  • 8字节的SHA-1校验和(用于验证备份完整性)
  • 头部之后才是zlib压缩的tar格式数据(如果压缩标识为1)

修正后的Go代码

需要先跳过前24字节的头部,再处理后续的压缩数据:

package main

import (
	"compress/zlib"
	"fmt"
	"io"
	"os"
)

func convertABtoTar(backupFilePath, tarFilePath string) error {
	bf, err := os.Open(backupFilePath)
	if err != nil {
		return fmt.Errorf("打开备份文件失败: %w", err)
	}
	defer bf.Close()

	// 跳过24字节的.ab文件头部
	if _, err := bf.Seek(24, io.SeekStart); err != nil {
		return fmt.Errorf("定位到头部末尾失败: %w", err)
	}

	tarFile, err := os.Create(tarFilePath)
	if err != nil {
		return fmt.Errorf("创建tar文件失败: %w", err)
	}
	defer tarFile.Close()

	// 初始化zlib读取器处理压缩数据
	zf, zerr := zlib.NewReader(bf)
	if zerr != nil {
		return fmt.Errorf("初始化zlib读取器失败: %w", zerr)
	}
	defer zf.Close()

	// 拷贝解压后的数据到tar文件
	if _, err := io.Copy(tarFile, zf); err != nil {
		return fmt.Errorf("拷贝数据失败: %w", err)
	}

	return nil
}

func main() {
	if err := convertABtoTar("backup.ab", "backup.tar"); err != nil {
		fmt.Println(err)
	}
}

额外说明

  1. 如果修改代码后仍然出现Unexpected EOF,再考虑.ab文件是否损坏——比如备份过程被中断、文件传输时丢包等情况。
  2. 若你的.ab文件未启用压缩(压缩标识为0),跳过头部后直接将剩余内容拷贝到tar文件即可,无需使用zlib读取器。

内容的提问来源于stack exchange,提问作者YuSheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:07:20