Skip to content

Commit 94faf65

Browse files
committed
[docs] verify C1-S1 Android Play installation and provenance
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent cf3b262 commit 94faf65

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
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

Comments
 (0)