xref: /aosp_15_r20/system/update_engine/scripts/trim_ota_package.py (revision 5a9231315b4521097b8dc3750bc806fcafe0c72f)
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