Python: 解压缩 android 备份?

Python: unpack android backup?

我想使用 python 解压缩一个 Android 备份文件。

根据 http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html 可以使用

解压缩未加密的 adb 文件
dd if=mybackup.ab bs=24 skip=1|openssl zlib -d > mybackup.tar

tar xvf mybackup.tar

这些可以在python中完成吗? Python 有 zlibgziptarfile,看起来应该可以用。无论如何,如果可以做到,怎么做?

第二步 tarfile.open('filename.tar', 'r:') 可行吗?

我在 windows,顺便说一句。

如果文件不是太大以至于所有内容都无法轻松放入内存,则在从标准库中导入所需内容后:

with open('mybackup.ab', 'rb') as f:
    f.seek(24)  # skip 24 bytes
    data = f.read()  # read the rest

tarstream = zlib.decompress(data)
tf = tarfile.open(fileobj=io.BytesIO(tarstream))

现在,在 tf 中,您有一个 TarFile 实例,如 https://docs.python.org/2/library/tarfile.html#tarfile-objects 中所述,因此您可以获取其内容列表、提取一个或多个成员等。

如果备份太大以至于所有这些位都无法轻松地放入内存,您当然可以将任何或所有中间结果写入磁盘;但如果它足够小,将所有内容保存在内存中应该会导致执行速度更快。

请记住,.ab 文件格式上有一个(UTF-8 文本)header,它可以是可变长度的,带有 end-of-line 的标准 CRLF 对。它并不总是 24 个字节。 header 的最后一行始终为空,二进制存档数据 star 紧随其后。这意味着您应该从存档文件的 start 开始扫描,直到找到 CRLFCRLF 序列,然后存档数据本身从其后的下一个字节开始。

如果您实际解析 header,它会说明数据是否被压缩 [技术上是可选的] 以及加密参数是什么(如果有)等等。

.ab 文件中的存档格式本身本质上是 tar 与现代 ustar/ pax 扩展名,尽管使用 metadata-encoded 文件命名而不是严格的物理路径等。特别是经常会有 pax 扩展 header 块,而不仅仅是 old-style tar 文件 headers,以支持大文件或长文件名。如果您尝试创建 .ab 文件,每个应用程序数据的清单元数据文件和文件本身之间也有一些排序要求,但词法排序应该为您解决。请务必查看 Android 的 BackupManagerService.java 文件中的存档构造代码以供参考。