|
| 1 | +<!-- SPDX-License-Identifier: MIT --> |
| 2 | +<!-- Part of PyBLE (https://pyble.dev) — see /LICENSE. --> |
| 3 | + |
| 4 | +# C1-S1 — physical Android channel verification |
| 5 | + |
| 6 | +| Field | Observed result | |
| 7 | +|---|---| |
| 8 | +| Date | 25 September 2026, UTC / Asia/Bangkok | |
| 9 | +| Task | C1-S1-T02; Android part of PYB-001.2 | |
| 10 | +| Device | Physical Lenovo TB-J616X, Android 12; connected and unlocked | |
| 11 | +| Channel | Google Play, existing beta membership; listing explicitly describes open testing | |
| 12 | +| Installed application | `dev.pyble.pyble`, version `0.2.0`, version code `8` | |
| 13 | +| Result | **Done for the existing-installation verification scope:** official channel, installed identity, launch and About checked; payload-to-historical-artifact mapping established below | |
| 14 | +| Evidence author | Codex, through ADB and the actual device UI; no independent participant or second-operator attestation | |
| 15 | +| Related records | [Channel ledger](01_Channel_and_Artifact_Ledger.md), [execution record](00_Execution_Record.md), [historical build-8 handoff](../../../testing/google-play/0.2.0-build-8.md) | |
| 16 | + |
| 17 | +This retry supersedes the earlier “no connected Android device” finding. An |
| 18 | +existing, working Play installation was present. There was no Update or Install |
| 19 | +action offered, so no fresh enrollment, fresh installation or upgrade event was |
| 20 | +performed. The ledger's existing-app/update branch permits this nondestructive |
| 21 | +verification; it does not require uninstalling a user's app to manufacture a |
| 22 | +fresh-install result. PYB-001.2 still needs the separate iPad result. |
| 23 | + |
| 24 | +## Actual channel and launch observations |
| 25 | + |
| 26 | +| Check | Actual evidence | Interpretation | |
| 27 | +|---|---|---| |
| 28 | +| Official listing | Opened `market://details?id=dev.pyble.pyble` explicitly in `com.android.vending`; the corresponding public listing is [Google Play](https://play.google.com/store/apps/details?id=dev.pyble.pyble) | The actual device's Play Store was used, not third-party indexing or a sideload | |
| 29 | +| App identity | Listing displayed PyBLE: MicroPython IDE (Beta), publisher SciLabPro | Correct product listing | |
| 30 | +| Testing state | Play showed existing beta-tester membership and said future updates would include beta versions; its update notes stated open testing for PyBLE 0.2.0 | This account/device can access the installed beta; no new opt-in was exercised | |
| 31 | +| Available action | Open; no Update or Install action observed | Already installed/current for the offer shown to this account/device; not a global rollout claim | |
| 32 | +| Installation source | Android package metadata reported `installerPackageName=com.android.vending`; exact package was installed, enabled, not hidden or suspended | Consistent with the observed Play-managed installation | |
| 33 | +| Recorded installation dates | Device package metadata: first installed 22 August 2026; last updated 17 September 2026 | Historical package timestamps, not events performed during this retry | |
| 34 | +| Play → app | Tapped Open in the actual listing; PyBLE's disconnected home screen rendered | Successful nondestructive launch from the channel | |
| 35 | +| About | Opened About PyBLE; UI displayed `Version 0.2.0 (8)` | UI and package-manager version/build agree | |
| 36 | +| Return | Returned from About to the app; did not initiate a BLE scan or board connection | About navigation completed without modifying editor or board content | |
| 37 | + |
| 38 | +No country, new-account or age eligibility test was performed. There was no |
| 39 | +invitation prompt for this already-enrolled account. That observation does not |
| 40 | +prove every account/country can enroll. No uninstall, clear-data, force-stop, |
| 41 | +local build installation, rating, store submission or account-setting change |
| 42 | +occurred. |
| 43 | + |
| 44 | +## Installed artifact and source provenance |
| 45 | + |
| 46 | +The device supplied a base APK and an `arm64-v8a` configuration split. Both were |
| 47 | +copied read-only into the ignored evidence directory and verified with Android |
| 48 | +SDK `apksigner`. Their package version code is `8`; the base reports version |
| 49 | +name `0.2.0`. Both signatures verify under the same delivered-app signer. |
| 50 | + |
| 51 | +| Artifact / field | Actual value | |
| 52 | +|---|---| |
| 53 | +| Installed base APK | `1,221,421` bytes; SHA-256 `d34417d31d8c8d08fa52458f34657b5b1961cdcacb6b239bf78b8bfafa738e6a` | |
| 54 | +| Installed `config.arm64_v8a` APK | `19,714,340` bytes; SHA-256 `f211bc7be13509a4084f4596dda010e0c39e73fb6ad8bdceefc717c6f14b748a` | |
| 55 | +| Delivered-app signer certificate | SHA-256 `e3c1334dc7aad1ae20fe043b52c2d5638584a67a66e6a5255a87bf89f56f06d0` | |
| 56 | +| Retained historical AAB | Rehashed during this retry: SHA-256 `ee2439589e2c2195ef4c861b524f871b0e5168e84fbea60a1cd379319c6eb5d7`, matching the 10 September handoff | |
| 57 | +| Historical source binding | Commit `768fafe45beee7731d1a38480cc0463a2f5680cd`; app tree `27fd1a264a576e68126c38f966db328559660249`, as recorded in that handoff | |
| 58 | +| Compiled Dart application | Installed `lib/arm64-v8a/libapp.so` SHA-256 `77108c759dc7f1668f4a1a787663629062dd6bea0db824a0eda145f17982db9a`; byte-identical to the historical AAB entry | |
| 59 | +| Android DEX code | Installed `classes.dex` SHA-256 `6baa7d569a6ba4507f4acc52af0a98abd858ae6a3c14dabff8e1c61df73f2f4c`; byte-identical to historical `base/dex/classes.dex` | |
| 60 | +| Compared payload set | **38/38 identical:** 35 Flutter asset files, two native libraries (`libapp.so` and `libflutter.so`) and one DEX file; none of these installed payloads lacked a historical AAB counterpart | |
| 61 | + |
| 62 | +The comparison hashes the uncompressed ZIP-entry bytes. Installed asset/native |
| 63 | +paths map to the AAB's `base/` paths; `classes.dex` maps to |
| 64 | +`base/dex/classes.dex`. This establishes a concrete payload link to the retained |
| 65 | +build-8 artifact and its recorded source, stronger than matching a version |
| 66 | +label alone. |
| 67 | + |
| 68 | +It is not a whole-artifact equality or a reproducible-build result. Play creates |
| 69 | +and signs delivery splits, so their digests differ from the upload AAB and local |
| 70 | +APK. Android manifests, resource tables and signing records are outside the |
| 71 | +38-payload comparison. The delivered base/split manifests report minimum SDK |
| 72 | +`29` and the base targets SDK `36`; the historical AAB handoff reports minimum |
| 73 | +SDK `24`. This device-specific observation does not redefine the product's |
| 74 | +universal OS requirement or explain the manifest transformation. Console upload |
| 75 | +history, country targeting and the signer certificate shown in Console were |
| 76 | +not inspected. |
| 77 | + |
| 78 | +## Repeatable read-only procedure |
| 79 | + |
| 80 | +Use the selected connected device, keep personal device/account identifiers out |
| 81 | +of published logs, and retain complete outputs privately. |
| 82 | + |
| 83 | +```sh |
| 84 | +adb -s '<device>' shell dumpsys package dev.pyble.pyble |
| 85 | +adb -s '<device>' shell am start \ |
| 86 | + -a android.intent.action.VIEW \ |
| 87 | + -d 'market://details?id=dev.pyble.pyble' \ |
| 88 | + -p com.android.vending |
| 89 | +adb -s '<device>' shell uiautomator dump /sdcard/pyble-c1-ui.xml |
| 90 | +adb -s '<device>' exec-out cat /sdcard/pyble-c1-ui.xml |
| 91 | +adb -s '<device>' exec-out screencap -p |
| 92 | +adb -s '<device>' shell pm path dev.pyble.pyble |
| 93 | +adb -s '<device>' pull '<returned-apk-path>' '<private-evidence-apk>' |
| 94 | +apksigner verify --print-certs '<private-evidence-apk>' |
| 95 | +aapt dump badging '<private-evidence-apk>' |
| 96 | +``` |
| 97 | + |
| 98 | +Capture the channel UI before using its Open action; then inspect About and |
| 99 | +capture the displayed identity. Resolve each returned APK separately. Compare |
| 100 | +only like-for-like uncompressed payload entries against the rehashed historical |
| 101 | +AAB. The temporary device UI XML was removed after the private capture; device |
| 102 | +coordinates and serials are intentionally omitted from this reusable procedure. |
| 103 | + |
| 104 | +## Retained evidence |
| 105 | + |
| 106 | +Raw UI XML/screenshots, package output, APKs, certificate checks and comparison |
| 107 | +details remain under the main workspace's ignored |
| 108 | +`local/c1-s1/2026-09-25-retry/android/`. They are not committed. Account/device |
| 109 | +identifiers are excluded from this report. These hashes identify the actual |
| 110 | +private captures, which may contain metadata beyond the selected public fields. |
| 111 | + |
| 112 | +| Capture | SHA-256 | What it establishes | |
| 113 | +|---|---|---| |
| 114 | +| `play-listing-first.xml` | `4ef1211ff53b935d28781d5b74fcc18c014cc734e7d6f1b06607c111c4b31934` | Actual listing, beta membership, open-testing notes and Open action | |
| 115 | +| `play-listing.png` | `cac6d520c23637e256ed09d7086b717b6fb406c034d5db50aa2c368d6096d9b3` | Retained device screenshot of the listing | |
| 116 | +| `app-open.xml` | `993a74964fcef3b2b57b5d50590345918d97660c3f2fd988a91fe9c4832a7ff1` | App rendered after Play's Open action | |
| 117 | +| `app-about.xml` | `66142bb0ad9271a347ef5fbf6221872914f54e512b3dbf622561bf2a3d687266` | About identity `0.2.0 (8)` | |
| 118 | +| `app-about.png` | `f9a07e3f092c45758a03351c755978c3cc1135f09969c07dbfdc94bea4904ad7` | Retained device screenshot of About | |
| 119 | +| `package-dump.txt` | `fbc9d1689ca2dc590f69846e5a7dc15b862ccded5785808cbd25fa4876d57b4e` | Initial installed package/build and installer metadata | |
| 120 | +| `package-dump-after.txt` | `2d20c4416aeced749a679d4eeb5342bf039926065aabb549ff3ba53162709639` | Package observation after the UI check | |
| 121 | +| `payload-comparison.json` | `d6535850c912c974ba4804f90818a7c9c561682c035614181f12fc7afd533476` | All 38 entry-by-entry comparisons and artifact digest | |
| 122 | +| `installed-00-signer.txt`, `installed-01-signer.txt` | `ad8012fcd96316866cfc8ff7a772d3e84933a2ebf15392dca54896704a9ec03f` each | Successful signature verification and identical signer output | |
| 123 | + |
| 124 | +The result closes Android device access and installed-channel verification for |
| 125 | +C1-S1-T02. It does not qualify BLE behavior, firmware/profile compatibility, |
| 126 | +draft persistence, first-install or upgrade behavior, or participant usability. |
| 127 | +No pilot activation, human observation or PyBLE Ready reproduction is inferred. |
0 commit comments