Skip to content

targetSdk 35 + signed AAB for a Play closed beta#20

Merged
xroche merged 2 commits into
masterfrom
beta/targetsdk-35
Jul 19, 2026
Merged

targetSdk 35 + signed AAB for a Play closed beta#20
xroche merged 2 commits into
masterfrom
beta/targetsdk-35

Conversation

@xroche

@xroche xroche commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Makes the app uploadable to a Play closed-testing track so Phase 4 and the audit fixes can finally be exercised on a real device.

Raises targetSdk 25 to 35, which is Play's upload floor (it rejects anything lower at upload time, on any track). Everything this crosses is already handled on master: notification channels and POST_NOTIFICATIONS, scoped storage, and predictive back. The one thing 35 forces that the layouts do not yet handle is edge-to-edge, so it is opted out with android:windowOptOutEdgeToEdgeEnforcement in values-v35. That opt-out works at 35 and is ignored at 36, so the inset work is still owed before a 36 bump, but it is not needed for this beta. versionCode goes to 64.

Release builds gain a signingConfig that reads a gitignored keystore.properties (a sample is committed), so ./gradlew bundleRelease produces a signed AAB locally. Without that file the release stays unsigned, so CI is unchanged. The shipped .so remain 16 KB aligned (checked in the produced AAB), which 35 makes mandatory.

Verified: build and unit tests green, the built APK reports targetSdkVersion 35, bundleRelease produces an AAB, and all six .so in it read p_align 0x4000. What it does at runtime on a device is exactly what the beta is for; nothing here has been observed on hardware yet.

To publish: create keystore.properties from the sample pointing at the upload keystore, run bundleRelease, and upload the AAB to a closed-testing track. Confirm the versionCode exceeds whatever is live on the listing, and confirm the upload-key cert is registered in the Console.

Not for production promotion.

xroche and others added 2 commits July 19, 2026 07:56
Raises targetSdk 25 -> 35, Play's upload floor. The behaviour changes this
crosses are already handled on master: notification channels and
POST_NOTIFICATIONS, scoped storage, predictive back. Edge-to-edge, enforced at
35, is opted out via android:windowOptOutEdgeToEdgeEnforcement in values-v35
until the layouts handle window insets (36 removes that opt-out). versionCode
bumped to 64.

Release builds gain a signingConfig reading a gitignored keystore.properties
(sample committed), so bundleRelease produces a signed AAB locally; without the
file CI still builds an unsigned release as before. The shipped .so stay 16 KB
aligned, verified in the AAB, which 35 makes mandatory.

This is the closed-beta vehicle to device-verify Phase 4 and the audit fixes,
which have never run on hardware. Not intended for production promotion.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Review follow-up (doubled signing review, sonnet leg, live-probed). A
keystore.properties present but missing a key produced a SILENTLY unsigned
release AAB — AGP skips signing when the config is not ready — which Play then
rejects with a confusing error. The config now throws at once, naming the
missing key, so presence-but-incomplete fails at build rather than at upload.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
@xroche
xroche merged commit f228cec into master Jul 19, 2026
5 checks passed
xroche added a commit that referenced this pull request Jul 20, 2026
Wires the Play upload so a version tag produces a signed AAB on a test track. This is the automation half of the closed-beta path; #20 was the code half.

On a `v*` tag (or a manual run), it builds `bundleRelease` in the SDK container, reusing the release `signingConfig` from #20 by writing `keystore.properties` from repository secrets, then uploads the AAB with `r0adkll/upload-google-play`. The upload is a Docker action, which cannot run inside a `container:` job, so it lives in a separate runner-native job that consumes the AAB as an artifact. It asserts 16 KB `.so` alignment in the AAB before uploading, so a misaligned bundle fails here rather than at the Console.

Safe by default and inert until you act:
- It does nothing until the five secrets exist and a `v*` tag is pushed. Merging it changes no existing job.
- No key material is committed; `keystore.properties` is written on the runner (gitignored, `umask 077`) and GitHub masks the secret values in logs.
- Track defaults to `internal` and status to `draft`, so a run uploads the bundle but does not release it to testers until you promote it in the Console. Override both via the manual-dispatch inputs.
- `permissions: contents: read` only.

Required repository secrets (Settings → Secrets and variables → Actions), also listed at the top of the workflow:
- `UPLOAD_KEYSTORE_BASE64` — `base64 -w0 httrack-upload.jks`
- `UPLOAD_KEYSTORE_PASSWORD`, `UPLOAD_KEY_ALIAS`, `UPLOAD_KEY_PASSWORD`
- `PLAY_SERVICE_ACCOUNT_JSON` — a Play Console service account with publishing rights, scoped to `com.httrack.android`

Before the first tag: bump `versionCode` above whatever is live on the listing, confirm the upload-key cert is registered, and grant the service account release permissions in the Console.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant