Enforce monotonic household releases and staged APK integrity
This commit is contained in:
parent
c78a8dfa8d
commit
383802611c
10 changed files with 351 additions and 45 deletions
|
|
@ -72,11 +72,13 @@ make tv-release VERSION=1.1.1 VERSION_CODE=100001 \
|
|||
|
||||
Required: a clean committed source checkout, the existing persistent key, native
|
||||
package credentials through the existing secret mount, no local AAR overrides,
|
||||
and an explicit code above every entry in `docker/tv-version-codes`. Known Opt
|
||||
code 65 seeds that ledger; old production code 28 and Wholphin code 62 belong
|
||||
to different packages. Proposed first household code 100001 exceeds all three.
|
||||
No household code derives from tag counts. Direct optimized Gradle tasks also
|
||||
require `-PtvVersionCode`; the packaging command additionally enforces the ledger.
|
||||
and an explicit code above the committed ledgers at HEAD and freshly fetched
|
||||
`origin/main`, plus every local consumed-code reservation. Fetch failure refuses
|
||||
the build, including a dry-run. Known Opt code 65 seeds the ledger; old production
|
||||
code 28 and Wholphin code 62 belong to different packages. Proposed first household
|
||||
code 100001 exceeds all three. No household code derives from tag counts.
|
||||
Only `make tv-release` produces an installable household release; direct optimized
|
||||
Gradle builds bypass reservation and must never be installed on the household box.
|
||||
|
||||
The builder inspects final signed APKs with aapt2/apksigner and checks package,
|
||||
version/code, signer, non-debuggable flag, minimum SDK, native ABI inventory,
|
||||
|
|
@ -91,8 +93,13 @@ Manifest schema 1 contains `packageId`, `versionName`, `versionCode`,
|
|||
`signerSha256`, and `assets[]` with `abi`, `name`, `bytes`, `sha256`, `minSdk`.
|
||||
All ABI outputs share one code/signer/identity. The local source tag is
|
||||
`pwolfskin-opt-v<VERSION>`; the distribution tag is `wolfskin-opt-v<VERSION>`.
|
||||
Before building, the code is consumed in the local Git ref
|
||||
`refs/wolfskin-tv/version-codes/<code>`. This survives discarding a working-tree
|
||||
ledger append or checking out an older source commit. A failed real build also
|
||||
consumes its code: use a higher code rather than deleting the reservation.
|
||||
After successful packaging the builder appends the code to the tracked ledger.
|
||||
Commit that reservation and explicitly push the source tag before distribution.
|
||||
Commit that reservation and explicitly push the source tag before distribution;
|
||||
new producer checkouts obtain the committed floor by fetching `origin/main`.
|
||||
An existing output directory is refused to preserve previous evidence.
|
||||
|
||||
Keep `private/` private: build/dependency logs, R8 mapping/effective configuration,
|
||||
|
|
@ -120,6 +127,12 @@ and reverified. Upload/verification failures remain draft. Promotion requires
|
|||
the explicit flag; then anonymous latest/asset hash checks must pass. A failed
|
||||
post-promotion check attempts withdrawal to draft and reports failure, not
|
||||
success. Cross-origin credential forwarding and non-HTTPS URLs are refused.
|
||||
|
||||
Before creating/resuming a draft and immediately before promotion, the publisher
|
||||
anonymously reads latest and its manifest. The bundle code must be strictly newer.
|
||||
Only a latest 404 followed by a successful empty release list permits a first
|
||||
release; other errors fail closed. A channel advance during upload leaves the
|
||||
verified upload draft rather than publishing an equal or lower code.
|
||||
`--test-server` permits only a loopback HTTP fake Forgejo; production defaults
|
||||
cannot be redirected to a different repository by a CLI repository argument.
|
||||
Dry-run never fetches a credential or makes publication requests.
|
||||
|
|
@ -151,6 +164,8 @@ the installed Android signer is the installation boundary.
|
|||
|
||||
EOF never starts installation. Install requires a separate OK, per-package
|
||||
unknown-app permission and a confirmation-required PackageInstaller session.
|
||||
The bytes streamed into that session are checked again against the manifest length
|
||||
and hash; any mismatch abandons the session before commit and discards invalid Ready.
|
||||
Returning from permission settings requires another explicit Install press.
|
||||
Denial, cancellation and missing system handlers retain the verified download.
|
||||
No broad FileProvider, public Downloads write, silent install or automatic
|
||||
|
|
@ -228,13 +243,15 @@ monotonic versionCode; source commit identity is recorded separately.
|
|||
`make apk` remains the old `org.justinvisser.wolfskin.tv` production assembly and
|
||||
release signer. It must never publish to the household channel.
|
||||
|
||||
Build all four default-flavor outputs in one invocation through the container
|
||||
wrapper, without a release keystore. On a host whose Gradle cache already holds
|
||||
the pinned native extensions and their metadata:
|
||||
For build-only diagnostics, build all four outputs through the container wrapper
|
||||
with a deliberately non-release code. **Direct optimized builds must never be
|
||||
installed on the household box or published.** Use `make tv-release` for every
|
||||
household installation. On a host whose Gradle cache already holds the pinned
|
||||
native extensions and their metadata:
|
||||
|
||||
```sh
|
||||
bash docker/gradle.sh optimized --offline \
|
||||
-PtvVersion=1.1.1 -PtvVersionCode=100001 \
|
||||
-PtvVersion=1.1.1 -PtvVersionCode=1 \
|
||||
-PWholphinExtensionsUsername=JustinZeus \
|
||||
-PWholphinExtensionsPassword=unused \
|
||||
:app:assembleDefaultOptimized
|
||||
|
|
@ -247,7 +264,8 @@ through the existing `ORG_GRADLE_PROJECT_WholphinExtensionsUsername` and
|
|||
or securely seeded cached artifacts. No release signing inputs are needed.
|
||||
Without native extension configuration, the existing dependency selection uses
|
||||
the MPV stub and omits ffmpeg/AV1, just like `make apk-debug`; that is not a
|
||||
playback-complete comparison. Inspect native libraries before installing.
|
||||
playback-complete comparison. Inspect native libraries for diagnostic evidence;
|
||||
do not install these direct-build APKs on the household box.
|
||||
|
||||
Outputs are in `app/build/outputs/apk/default/optimized/`: universal, arm64-v8a,
|
||||
armeabi-v7a and x86_64. Keep
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue