""" Distill XABA/XALZ assemblies.blob into individual .NET assemblies. Format ref (reverse-engineered): https://github.com/dotnet/android/blob/main/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyStore.cs """ import struct, sys, pathlib, lz4.block if len(sys.argv) != 3: print("Usage: unpack_xaba.py ") sys.exit(1) blob_path = pathlib.Path(sys.argv[1]) out_dir = pathlib.Path(sys.argv[2]) out_dir.mkdir(parents=True, exist_ok=True) data = blob_path.read_bytes() assert data[:4] == b"XABA", f"not a XABA blob, got {data[:4]!r}" # Scan for XALZ markers (each = one compressed assembly) i = 0 extracted = 0 while True: idx = data.find(b"XALZ", i) if idx == -1: break # XALZ: 4 magic + 4 descriptor_index + 4 uncompressed_size + N lz4_data desc_idx = struct.unpack_from(" {out_file.name}") i = payload_start print(f"\nExtracted {extracted} assemblies into {out_dir}")