Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c24020d
feat(loader): derive a typed snapshot identity from the header
caverav Aug 31, 2026
fb8e299
feat(adapter): add ProgramModel v4, protocol v1, and semantic validation
caverav Aug 31, 2026
4e4e446
test(loader): exercise snapshot identity through a real container load
caverav Aug 31, 2026
f7f9ba5
feat(adapter)!: cut every producer and consumer over to ProgramModel v4
caverav Aug 31, 2026
6d0aafe
docs(model): describe the v4 contract, protocol v1, and typed backend…
caverav Aug 31, 2026
ff15004
refactor(core): report model capabilities as a map and drop a dead sc…
caverav Aug 31, 2026
8a8278e
test(core): re-validate the model after every enrichment pass
caverav Aug 31, 2026
1ba735a
fix(adapter): give every backend one wire token
caverav Aug 31, 2026
698fb8e
docs(model): retire the v2/v3 model vocabulary
caverav Aug 31, 2026
3badf3c
feat(core)!: gate adapter selection on a header-derived FullAOT identity
caverav Aug 31, 2026
771bf2d
fix(core): keep three segments in a function descriptor
caverav Sep 1, 2026
646f66c
fix(adapter): pin the raw feature string to the host's
caverav Sep 1, 2026
1fa58dc
test(adapter): stop two backend tests reading the ambient environment
caverav Sep 1, 2026
616f0e4
docs(how-it-works): count the v4 properties correctly
caverav Sep 1, 2026
872e5cf
fix(core): stop the compatibility binding falling out of the report
caverav Sep 1, 2026
ca67229
fix(core): digest the profile by the fields that decide layout
caverav Sep 1, 2026
4c0cfdb
docs(user-guide): list identity_rejection among the info fields
caverav Sep 1, 2026
6506916
fix(adapter): normalize structured r2flutter superclass metadata for v4
caverav Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ regex = "1"
goblin = "0.10"
zip = { version = "8", default-features = false, features = ["deflate"] }
tempfile = "3"
sha2 = "0.10"
walkdir = "2"
capstone = "0.14"
cpp_demangle = "0.5"
Expand Down
30 changes: 20 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,11 @@ For APK inputs, `info` reports Android startup summary fields such as:
If adapter metadata is available, `info` also reports package and compatibility signals such as:

- `app_package_counts_top`
- `adapter_kind`
- `adapter_snapshot_hash_match`
- `requested_backend`, `resolved_backend`, `backend_fallback_reason`
- `producer_id`, `producer_trust`, `compatibility_record_sha256`
- `snapshot_identity_is_exact`
- `identity_rejection` (why no adapter could be selected, when none could)
- `model_capabilities`
- `compatibility_warnings`

2. Install the adapter for the detected Dart hash:
Expand Down Expand Up @@ -359,19 +362,26 @@ Adapter backend selection:
- `--adapter-backend internal`: force the internal adapter only
- `--adapter-backend blutter`: require the Blutter backend and fail if unavailable
- `--adapter-backend r2-flutter`: require the r2flutter backend and fail if unavailable
- `--require-snapshot-hash-match`: fail when the adapter-reported snapshot hash does not match the loader snapshot hash
- `--require-snapshot-hash-match`: fail unless the snapshot identity came from a real header

What the backends actually recover:

| Backend | Function names | Classes | ObjectPool |
| --- | --- | --- | --- |
| `internal` | none (`sub_<addr>` placeholders) | none | carved strings, no real index space |
| `blutter` | exact, from Blutter dumps | yes | Blutter `pp.txt` entries |
| `r2flutter` | exact, from the AOT instruction table | yes, with fields and methods | real slots, resolvable from `x27` displacements |
| `internal` | none at all; code ranges are unnamed | none | carved strings, ordinal index space |
| `blutter` | scraped from Blutter's rendered source, heuristic | yes | Blutter `pp.txt` entries, ordinal index space |
| `r2flutter` | exact, from the AOT instruction table | yes, library attribution unavailable | real slots, resolvable from `x27` displacements |

Only backends that recover the real `ObjectPool` layout report `pool_geometry`. Without
it `flutterdec` leaves pool references unresolved rather than attaching a value from an
unrelated index space, and says so in `report.json.pool_metadata.hints_suppressed_reason`.
The model says which of these it did: every domain carries a capability level
(`complete` / `partial` / `unavailable`) and every recovered fact carries a provenance
(`exact` / `derived` / `heuristic`). A function whose name was not recovered has no
name rather than a `sub_<addr>` placeholder, and `flutterdec` labels it from its entry
address at emit time.

Only a backend that recovers the real `ObjectPool` layout claims a hardware index
space. Without one, `flutterdec` leaves pool references unresolved rather than
attaching a value from an unrelated index space, and says so in
`report.json.pool_metadata.hints_suppressed_reason`.

r2flutter backend environment knobs:

Expand Down Expand Up @@ -424,7 +434,7 @@ Main outputs under `-o <OUT_DIR>`:
- `android_startup.dart_entrypoints` entries can carry `function_name`, `library_uri`, and `app_bundle_path` when those values are directly recoverable from APK bytecode or simple helper return propagation
- `android_startup.bootstrap_chain` summarizes observed Android embedder startup stages per source method, including ownership, stage ordering, completeness, and missing steps
- `engine_symbol_ingestion` for auto-loaded local engine symbol cache matches keyed by `libflutter.so` build id
- `bootflow_discovery` entries tagged by `source` (`adapter`, `manifest`, `apk_startup`)
- `bootflow_discovery` entries tagged by `source` (`android_manifest`, `apk_startup`, `model_name_pattern`) and by `provenance` (`derived` or `heuristic`, never exact)

## See The Pipeline

Expand Down
Loading