我想使用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有zlib
,gzip
和tarfile
,好像它们应该可用。无论如何,如果可以做到,怎么办?
tarfile.open('filename.tar', 'r:')
会在第二步工作吗?
我在窗户上,顺便说一句。
答案 0 :(得分:4)
如果文件不是太大,以至于在标准库中需要导入后,所有内容都可以舒适地放入内存中:
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中所述,因此您可以获取其内容列表,提取一个或多个成员,&amp; c。< / p>
如果备份太大而无法将所有这些位舒适地放入内存中,您当然可以将任何或所有中间结果写入磁盘;但如果它足够小,那么将所有内容保存在内存中会导致执行速度加快。
答案 1 :(得分:1)
请记住,.ab文件格式上有一个(UTF-8文本)标题,可以是可变长度,标准CRLF对用于行尾。它并不总是24个字节。标题的最后一行始终为空,二进制存档数据紧随其后开始。这意味着您应该从归档文件的开头进行扫描,直到找到CRLFCRLF序列,然后归档数据本身从此后的下一个字节开始。
如果您实际解析标题,则说明数据是否已压缩[技术上是可选的]以及加密参数(如果有),等等。
.ab文件中的存档格式本身基本上是 tar ,具有现代 ustar / pax 扩展名,但使用元数据编码的文件命名而不是严格的物理路径等。特别是通常会有 pax 扩展标头块,而不仅仅是旧式 tar 文件标头,以支持大文件或长文件名。如果您正在尝试创建.ab文件,那么每个应用程序的数据和文件本身的清单元数据文件之间也会有一些排序要求,但是词法排序应该为您处理。请务必查看Android的BackupManagerService.java文件中的存档构造代码以供参考。