1*5a923131SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*5a923131SAndroid Build Coastguard Worker 3*5a923131SAndroid Build Coastguard Workerimport zipfile 4*5a923131SAndroid Build Coastguard Workerimport struct 5*5a923131SAndroid Build Coastguard Worker 6*5a923131SAndroid Build Coastguard Worker 7*5a923131SAndroid Build Coastguard Workerdef readPayloadMetadata(zfp: zipfile.ZipFile, entry): 8*5a923131SAndroid Build Coastguard Worker _MAGIC = b'CrAU' 9*5a923131SAndroid Build Coastguard Worker # 8 bytes for version, 8 bytes for manifest length, 4 bytes for metadata signature length 10*5a923131SAndroid Build Coastguard Worker HEADER_STRUCT = ">4sQQL" 11*5a923131SAndroid Build Coastguard Worker HEADER_LEN = struct.calcsize(HEADER_STRUCT) 12*5a923131SAndroid Build Coastguard Worker with zfp.open(entry) as fp: 13*5a923131SAndroid Build Coastguard Worker header = fp.read(HEADER_LEN) 14*5a923131SAndroid Build Coastguard Worker (magic, version, manifest_length, 15*5a923131SAndroid Build Coastguard Worker metadata_signature_len) = struct.unpack(HEADER_STRUCT, header) 16*5a923131SAndroid Build Coastguard Worker assert magic == _MAGIC 17*5a923131SAndroid Build Coastguard Worker assert version == 2, "Unsupported major payload version " + str(version) 18*5a923131SAndroid Build Coastguard Worker print(f"{manifest_length} {metadata_signature_len}") 19*5a923131SAndroid Build Coastguard Worker return header + fp.read(manifest_length + metadata_signature_len) 20*5a923131SAndroid Build Coastguard Worker 21*5a923131SAndroid Build Coastguard Worker 22*5a923131SAndroid Build Coastguard Workerdef main(argv): 23*5a923131SAndroid Build Coastguard Worker if len(argv) != 3: 24*5a923131SAndroid Build Coastguard Worker print("Usage:", argv[0], "<input file> <output file>") 25*5a923131SAndroid Build Coastguard Worker return 1 26*5a923131SAndroid Build Coastguard Worker infile = argv[1] 27*5a923131SAndroid Build Coastguard Worker outfile = argv[2] 28*5a923131SAndroid Build Coastguard Worker with zipfile.ZipFile(infile, "r") as inzfp, zipfile.ZipFile(outfile, "w") as outzfp: 29*5a923131SAndroid Build Coastguard Worker for entry in inzfp.infolist(): 30*5a923131SAndroid Build Coastguard Worker if entry.filename.startswith("META") or entry.filename.endswith(".map") or entry.filename.endswith(".prop"): 31*5a923131SAndroid Build Coastguard Worker outzfp.writestr(entry, inzfp.read(entry)) 32*5a923131SAndroid Build Coastguard Worker elif entry.filename == "payload.bin": 33*5a923131SAndroid Build Coastguard Worker outzfp.writestr(entry, readPayloadMetadata(inzfp, entry)) 34*5a923131SAndroid Build Coastguard Worker 35*5a923131SAndroid Build Coastguard Worker 36*5a923131SAndroid Build Coastguard Workerif __name__ == '__main__': 37*5a923131SAndroid Build Coastguard Worker import sys 38*5a923131SAndroid Build Coastguard Worker sys.exit(main(sys.argv)) 39