Add a script to trim OTA package for go/otaanalyzer
Test: th
Change-Id: Id3b5cdc0095c6b398e402e2165729cb9cb67b257
diff --git a/scripts/trim_ota_package.py b/scripts/trim_ota_package.py
new file mode 100644
index 0000000..df7f170
--- /dev/null
+++ b/scripts/trim_ota_package.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+
+import zipfile
+import struct
+
+
+def readPayloadMetadata(zfp: zipfile.ZipFile, entry):
+ _MAGIC = b'CrAU'
+ # 8 bytes for version, 8 bytes for manifest length, 4 bytes for metadata signature length
+ HEADER_STRUCT = ">4sQQL"
+ HEADER_LEN = struct.calcsize(HEADER_STRUCT)
+ with zfp.open(entry) as fp:
+ header = fp.read(HEADER_LEN)
+ (magic, version, manifest_length,
+ metadata_signature_len) = struct.unpack(HEADER_STRUCT, header)
+ assert magic == _MAGIC
+ assert version == 2, "Unsupported major payload version " + str(version)
+ print(f"{manifest_length} {metadata_signature_len}")
+ return header + fp.read(manifest_length + metadata_signature_len)
+
+
+def main(argv):
+ if len(argv) != 3:
+ print("Usage:", argv[0], "<input file> <output file>")
+ return 1
+ infile = argv[1]
+ outfile = argv[2]
+ with zipfile.ZipFile(infile, "r") as inzfp, zipfile.ZipFile(outfile, "w") as outzfp:
+ for entry in inzfp.infolist():
+ if entry.filename.startswith("META") or entry.filename.endswith(".map"):
+ outzfp.writestr(entry, inzfp.read(entry))
+ elif entry.filename == "payload.bin":
+ outzfp.writestr(entry, readPayloadMetadata(inzfp, entry))
+
+
+if __name__ == '__main__':
+ import sys
+ sys.exit(main(sys.argv))