ZERO-UPLOAD SANDBOX
.aab Tier 1 · Deep AST Parser

Android App Bundle

Google Play publishing format packaging `BundleConfig.pb`, Protocol-Buffer encoded `base/manifest/AndroidManifest.xml`, and DEX bytecode inside a modular ZIP container.

Unlike installable `.apk` files (which place binary-XML `AndroidManifest.xml` at root), `.aab` stores Protobuf-serialized manifests under `<module>/manifest/AndroidManifest.xml` plus root `BundleConfig.pb`. MIME note: `application/x-authorware-bin` seen in legacy MIME databases refers to Adobe Authorware (a historical extension collision), NOT Android App Bundle—serve `.aab` as `application/vnd.android.aab` or fall back to `application/octet-stream`.

MIME Types application/vnd.android.aab, application/octet-stream, application/zip
Byte Endianness little
Container Family zip
0xFF

Drop any .aab file (even 100 GB+) to inspect locally

Reads tiny File.slice() header/footer pages in a sandboxed Web Worker · 0 Bytes Uploaded

Binary Signature & Wire Layout

.aab Magic Bytes & Header Offset Map

Offset: 0x00 (0 B) ASCII: PK..
50 4B 03 04

PKZIP bundle containing BundleConfig.pb & base/manifest/AndroidManifest.xml

Byte Offset Length Data Type Field Name Engineering Description
0x00 - 0x03 4 B uint32_le zip_magic PKZIP Local File Header
0x1E+ var utf8 bundle_config 'BundleConfig.pb' protobuf descriptor
Upload Gateway & AppSec Advisory

.aab Security & Polyglot Risk Matrix

Risk Level: medium
Arbitrary Code / Macros
YES (Active Risk)
Pickle Deserialization
SAFE (No Pickle VM)
XML External Entity (XXE)
NONE
Polyglot Prepend Risk
YES (Check Tail/Offsets)
Backend Upload Validation Recommendation

Distinguish .aab from .apk by requiring root BundleConfig.pb and verifying JAR/APK signature blocks (META-INF/) in release pipelines.

Compiler-Verified Reference Code

Read .aab Header & Metadata Without Heavy Dependencies

import sys, zipfile
with zipfile.ZipFile(sys.argv[1], "r") as zf:
    names = set(zf.namelist())
    assert "BundleConfig.pb" in names, "Missing BundleConfig.pb"
    print(f"Valid Android AAB ({len(names)} entries)")
CI/CD & Unit Test Fixtures

Deterministic .aab Sample Files & Edge Cases

Open Full .aab Sample Matrix & Mutator →
minimalexpect: valid

minimal-base.aab

UNSIGNED container-structure fixture: real ZIP with BundleConfig.pb, base/manifest/AndroidManifest.xml and dex\n039 header stub. NOT a Play-signed publishable bundle.

↓ Download (450 B)
SHA-256: 2564e236b066e8187c9c16be9d3e13332ce02e5d69a7171cf91372d96ebf16f8
Exact: 450 bytes
curl -fsSL https://fileformat.co/fixtures/v1/aab/minimal-base.aab -o minimal-base.aab \
  && echo "2564e236b066e8187c9c16be9d3e13332ce02e5d69a7171cf91372d96ebf16f8  minimal-base.aab" | shasum -a 256 -c
realisticexpect: valid

release-module.aab

UNSIGNED fixture adding base/resources.pb alongside BundleConfig.pb and classes.dex to distinguish .aab from legacy .apk.

↓ Download (572 B)
SHA-256: 875c6a215d912e50d0274d36512ef9c5b9564b5c10f1822e631636234fe3016d
Exact: 572 bytes
curl -fsSL https://fileformat.co/fixtures/v1/aab/release-module.aab -o release-module.aab \
  && echo "875c6a215d912e50d0274d36512ef9c5b9564b5c10f1822e631636234fe3016d  release-module.aab" | shasum -a 256 -c
edge-caseTruncated Central Directoryexpect: parser_error

truncated-bundle.aab

AAB archive truncated inside the ZIP Central Directory — zipfile must raise.

↓ Download (436 B)
SHA-256: af8a9755a801d6c9890cbf897fe1cc1314cfc39a5769e1d56d8418fc8a63883c
Exact: 436 bytes
curl -fsSL https://fileformat.co/fixtures/v1/aab/truncated-bundle.aab -o truncated-bundle.aab \
  && echo "af8a9755a801d6c9890cbf897fe1cc1314cfc39a5769e1d56d8418fc8a63883c  truncated-bundle.aab" | shasum -a 256 -c

Related Specifications & Alternatives