07 · APK harvest & identification (140 apps, 2026-06-28)
How the app cohort was re-enumerated from the live device and pulled byte-for-byte as APKs — the foundation for the integration scan (
08) and the live-config audit (09). This supersedes the static 114-app inventory: the device now carries 140 Appmiral/Appstrakt apps, and all of them were harvested with their full split-APK sets.
Evidence header & raw package list:
logs/evidence_header_2026-06-28.txt (in the
evidence snapshot) ·
data/installed_apps_2026-06-28.csv ·
data/apk_files_manifest_2026-06-28.csv.
Harvester: ../../tools/apk-harvest/harvest-apks.ps1.
Cohort: 140 installed apps
Enumerated with adb shell pm list packages -3 and filtered to the Appmiral
namespace (appmiral.*, be.appstrakt.*, pl.mysticfestival,
com.triple.verstappen). Reconciled against the old 114-app inventory
(00-app-inventory.md):
| Status | Count |
|---|---|
| Installed now | 140 |
| Still present (in the old 114 inventory) | 114 |
| New since the 114 inventory | 26 |
| Removed | 0 |
The 26 newly-installed apps
appmiraldemo bbcradio2 clamotterock
creamfieldsasia curacaonorthseajazz deopening
designerssaturday fckngserious fiftylabmusicfestival
folkemoedet fvdedinthepark honkbalweekhaarlem
hotelnachtamsterdam ilosaarirockfestival klimafolkemodet
mexicogp musicweekpoland rhythmnvines
rogersstadium sailamsterdam sparkarena
szeneopenair tonderfestival vitaeglobal
vlissingenmaritiem cphoperafestival (com.appmiralm.*, typo'd demo)
(All com.appmiral.* unless noted.) The full machine-readable reconciliation,
including which old apps are still installed, is in
installed_apps_2026-06-28.csv.
Harvest: 375 split-APK files, ~7.08 GB
Modern Appmiral apps ship as split APKs (an App Bundle install): a base.apk
plus split_config.* for the device’s ABI and screen density. For each package
the harvester resolves every split with adb shell pm path <pkg> and pulls the
exact installed bytes with adb pull — no root required for APKs, and the
bytes are identical to what Google Play delivered.
| Metric | Value |
|---|---|
| Packages | 140 |
| APK files pulled | 375 (base.apk + split_config.*) |
| Total size | ~7.08 GB |
| Per-file integrity | SHA-256 recorded at pull time |
The harvester is parameterized (-Serial, -OutDir, -ManifestCsv,
-Force), idempotent/resumable (a per-package marker skips already-pulled
apps), and writes a row per file to
apk_files_manifest_2026-06-28.csv:
package, versionName, versionCode, file, size_bytes, sha256, on_device_path, captured_ts
The on_device_path (e.g. /data/app/~~…/com.appmiral.ttfestival-…/base.apk)
records exactly where on the device each byte came from. The APK bytes live in
the private repo (apks_2026-06-28_154246/<pkg>/); the public
apk-manifest.sha256 is
byte-for-byte identical to the private folder’s SHA256SUMS.txt, so the public
record attests precisely which APKs were captured.
Identification
Each app was identified from its manifest (via androguard) — see
integration_matrix_2026-06-28.identify.csv:
package, label, versionName, versionCode, minSdk, targetSdk, abis,
loc_fine, loc_coarse, loc_background
- Label / festival name (the user-visible app name),
versionName+versionCode. minSdk/targetSdkand the native ABIs present (most apps arearm64-v8aor no-native).- Location permissions flagged: every app requests fine + coarse location; 30 also request background location.
Demo/typo’d packages (com.appmiral.appmiraldemo,
com.appmiralm.cphoperafestival) are kept in the cohort and flagged as such —
they are part of what is actually installed.
Reproduce
# pulls every split of every Appmiral app + writes the manifest CSV
pwsh tools/apk-harvest/harvest-apks.ps1 `
-OutDir <private>/apks_2026-06-28_154246 `
-ManifestCsv docs/appmiral-comparison/data/apk_files_manifest_2026-06-28.csv
Prerequisites, pinned tool versions, expected output and checksum verification:
10-apk-harvest-reproduction.md.