Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
55 lines
3.6 KiB
Plaintext
55 lines
3.6 KiB
Plaintext
android: the boot chain goes out in one round, and a census that holds it there
|
|
|
|
Thirty rounds of onMount had never been read end to end, and read end to end
|
|
it was a queue: two dozen commands with a critical path ten deep, because
|
|
Tauri's `listen` is an invoke like any other. loadLibrary asked for five
|
|
independent SQLite reads one behind the other, bindSlsk registered eight
|
|
listeners one behind the other, and watchLibrary and the player's bindEvents
|
|
did two each. None of them depended on anything before them. They go out in
|
|
one round now — the same commands, critical path 10 to 3, and ten of them
|
|
used to leave in the shell's own first turn where twenty-three do now — and
|
|
in a rig that runs the real store modules with the bridge instrumented,
|
|
lib.loaded lands at 53 ms instead of 85 at a 6 ms round trip and 62 instead
|
|
of 148 at 20 ms. Those are a desktop rig's milliseconds with the round trip
|
|
swept rather than measured; the phone's own numbers are unproven until the
|
|
walk prints bootMs and bootLibMs.
|
|
|
|
The behaviour is meant to be identical. loadLibrary's only movable part was
|
|
lib.error, which has two writers and used to be decided by the order they were
|
|
awaited in; the two messages are now carried out of the round and applied in
|
|
that same order, so a failing library still shows the library's message. Every
|
|
combination of which of the five reads fails, over six latency shapes, comes
|
|
out identical to the old code. bindSlsk still does not return until every
|
|
handler is up, so connectStored cannot let a fast connected state land with
|
|
nobody listening, and bindEvents still hands back the transport's unlisten and
|
|
still rejects only when the transport is the one that failed.
|
|
|
|
src/lib/boot.js is the project's first launch instrument — one counter every
|
|
invoke and every listen passes, sealed at the first frame the shell paints and
|
|
never re-opened, so a probe landing a second and a half later still reads the
|
|
launch. perf.mjs measures frames; nothing measured the launch. The mock walk's
|
|
Home step now holds a budget against it and both walks print bootCalls,
|
|
bootSync, bootMs and bootLibMs on every step. bootSync is the clause with no
|
|
clock in it: a call that waits on the one before it can only issue its first
|
|
in the shell's own turn, so a chain put back in a queue falls under the floor
|
|
whatever the machine is doing. A bootCalls of -2 means __ss.boot is not there
|
|
at all, which is the census itself being broken rather than the app.
|
|
|
|
One import line goes with it: Sheet.svelte's `import * as api`, the only one
|
|
of the ten dead imports this round turned up whose reason is the bundle at
|
|
all. Rollup already drops an unreferenced NAMED import, so a dead name on an
|
|
import line is hygiene rather than bytes; a namespace import is the one shape
|
|
tree-shaking cannot see through, and this one was dead. It frees nothing on
|
|
its own — twenty-nine other files in the phone's graph hold the same module
|
|
the same way, so api.js is pinned into the chunk whatever Sheet.svelte does —
|
|
but it is the only one of the ten that belongs to a round about weight. The
|
|
nine that are drift go out with the sweep in the round after this one.
|
|
|
|
Two things were looked at and left alone, both written down in ANDROID.md
|
|
rather than half-done. Home's per-artist catalog walk is the deepest chain in
|
|
the app, and that serial walk is the Deezer and MusicBrainz pacing, not an
|
|
oversight. And the follows really are read twice at launch, but the obvious
|
|
guard does not work: Home's effect calls loadHome with force the first time
|
|
they land, so the guard would never fire. One small local read, left for a
|
|
round that can do it properly.
|