diff options
| author | Claude <noreply@anthropic.com> | 2026-09-25 07:23:58 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-09-25 07:23:58 +0000 |
| commit | e5608851415ec04a8450678e6399441467194ddd (patch) | |
| tree | 3e9a399d939b8daaef557a827e4fa9533700736d /CLAUDE.md | |
| parent | 0b45924bfb78557ce207f10ffd3ceccd55df2485 (diff) | |
Sign debug builds with a shared, checked-in keystore
"App not installed" when updating. Android generates a debug keystore per
machine, so tungsten's build and the laptop's build are signed differently and
each refuses to install over the other. Reproduced exactly:
INSTALL_FAILED_UPDATE_INCOMPATIBLE, "signatures do not match newer version".
The published APKs show the collision plainly -- 0930d0 on the 21st, 106ecafe
in between, 0930d0 again after my last publish -- so an update had roughly a
coin-flip chance of being installable depending on which machine built it.
The checked-in key is tungsten's existing debug keystore, stock alias and
password, not a freshly generated one. That matters: a new key would have been
just as unusable as the mismatch, forcing a second uninstall and a second loss
of every playback position, right after Peter had already done one. Verified by
installing the currently-published APK and updating in place over it.
Safe to commit -- it signs debug builds of a personal sideloaded app. It must
never sign a release, where the key is the app's identity.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -155,6 +155,14 @@ skipping. `skipIntroMs`/`skipOutroMs` exist on `SubscriptionEntity` and nothing Twice the better answer was restructuring instead: `Screens.kt` was split per screen and `ListenViewModel` was split into library and player halves rather than raising a limit again. +- **Debug builds are signed with the checked-in `keystore/listen-debug.keystore`**, not the + per-machine one Android generates. Two machines build this app, and differently-signed APKs + refuse to install over each other: "App not installed", or + `INSTALL_FAILED_UPDATE_INCOMPATIBLE`, with the only remedy an uninstall that destroys every + playback position. The checked-in file is tungsten's original debug keystore, with the stock + alias and password, because that is the key already on the phone. Never swap it for a fresh + one — that costs another uninstall. Never use it for a release. + - **Feeds are big.** A real subscription in testing produced 2753 episodes in one refresh. Any per-episode work — a query in a loop, an O(n²) match — needs to be considered at that scale. |
