"""Second pass: Compose UI version, launcher activity, GMS meta-data, uses-feature strings from AndroidManifest.xml (binary XML string pool). Resumable JSONL.""" import json, os, struct, sys, threading from concurrent.futures import ThreadPoolExecutor, as_completed import zipcd HERE = os.path.dirname(os.path.abspath(__file__)) IN = os.path.join(HERE, 'data', 'scan.jsonl') OUT = os.path.join(HERE, 'data', 'scan2.jsonl') FEATURES = ['android.hardware.touchscreen.multitouch', 'android.hardware.telephony', 'android.hardware.nfc', 'android.hardware.bluetooth_le', 'android.hardware.usb.host', 'android.hardware.camera', 'android.hardware.vr.high_performance', 'android.software.leanback', 'android.hardware.type.watch'] def axml_strings(b): # ResXMLTree_header (8) then string pool chunk off = struct.unpack('