Skip to content

Fix Mobile Installation parsing and Biome App.Install decoding - #2059

Merged
abrignoni merged 3 commits into
mainfrom
fix/app-install-history
Aug 26, 2026
Merged

Fix Mobile Installation parsing and Biome App.Install decoding#2059
abrignoni merged 3 commits into
mainfrom
fix/app-install-history

Conversation

@abrignoni

Copy link
Copy Markdown
Owner

Fixes Mobile Installation log parsing and Biome App.Install decoding.

  • Mobile Installation: matches the lowercase "Install successful for" written on iOS 26, stops the bundle ID at the first ")" so a trailing "[Distributor: (null)]" is not swallowed, reads the newer "with persona" container destruction form, and parses Parallel and ParallelWithArchives patch attempts plus the installable-bundle lines.
  • Installed and uninstalled state now comes only from an installer-reported outcome. Container activity moves to a new Apps - Container Activity Only artifact.
  • Biome: App.Install and _DKEvent.App.Install carry different record layouts, so the stream directory selects the layout. App.Installation pins the field types for its version and 16 byte values.
  • Adds an artifact for UninstalledApplications.plist.

Undocumented integers are reported as stored. Row counts in sample_data are from runs against sixteen registered images.

abrignoni and others added 3 commits August 25, 2026 21:02
Mobile Installation log:

- Match "Install successful for" as well as "Install Successful for". The
  tested iOS 26 images write only the lowercase form, so every explicit
  successful install was being missed on those images.
- Stop the bundle ID capture at the first ")". A greedy match swallowed a
  trailing "[Distributor: (null)]", which put a malformed bundle ID in the
  report on 542 of 2510 successful-install lines across the test corpora.
- Read the "Destroying container <id> with persona <persona> at <path>" form
  used from iOS 16 on. The previous pattern only read the older "with
  identifier" form and returned an empty bundle ID for the newer one.
- Parse Parallel and ParallelWithArchives patch attempts alongside Delta.
- Parse the "Installing <MIInstallableBundle ...>" lines, which carry the
  bundle ID, version and short version.
- Set installed and uninstalled state only from an installer-reported
  outcome. Container bookkeeping stays in the historical artifact. A new
  Source Event column names the line that set the state.
- Add Persona, Version, Short Version and From Version columns to the
  historical artifact.

Biome:

- App.Install and _DKEvent.App.Install carry different record layouts. One
  typedef was applied to both, so no App.Install record had ever decoded.
  The stream directory now selects the layout, and a Stream column names the
  source stream for each row.
- Pin the field types for the version and 16 byte values in App.Installation.
  An inferring decode read some of those as nested messages and reported the
  column as empty.

Also adds an artifact for UninstalledApplications.plist, and records in the
Application State notes that an application identifier with no
compatibilityInfo is left out of that table.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bundle IDs that the log mentions only through container or patch activity,
with no "Install successful", "Uninstalling identifier" or "Destroying
container" line anywhere in the retained window.

These used to be listed under Apps - Installed on the strength of a container
event, which does not record an installation. They are now reported
separately, with the line that last mentioned them in a Source Event column.

Parent Bundle ID (by prefix) is filled in when another bundle ID in the same
log is a dotted prefix of this one, which is Apple's convention for an
extension and its host app. Across the sixteen test images 2631 of 2957 rows
carry a parent, so an examiner can sort the extensions away from the 326
standalone bundle IDs.

Apps - Historical Combined is unchanged and still carries every container
event; this artifact aggregates it per bundle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both artifacts skip paths containing "tombstone". The notes now say what is
in those files, so the question does not have to be re-answered: across the
tested images they hold the Biome daemons' own record of retired stream
files, naming the file, a byte size and a record count. No record carried a
bundle identifier or an application event.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@abrignoni
abrignoni merged commit 36a1c0e into main Aug 26, 2026
10 checks passed
@abrignoni
abrignoni deleted the fix/app-install-history branch September 12, 2026 18:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant