From 359e5506095dfbc424be97589027eda2c1438c1e Mon Sep 17 00:00:00 2001 From: DoubleGate Date: Tue, 25 Aug 2026 00:23:23 -0400 Subject: [PATCH 1/2] chore(deps): the Android tier, and the Kotlin version this build does not own Takes the Android dependency set to current, and settles a question the last refresh deferred on purpose. * AGP 9.2.1 -> 9.3.2, both `com.android.application` and `com.android.test` * Compose compiler plugin 2.3.10 -> 2.3.21 * androidx.baselineprofile 1.5.0-alpha06 -> 1.5.0-rc01, and the matching benchmark-macro-junit4 in :baselineprofile * compose-bom 2026.06.00 -> 2026.08.00 * material3.adaptive, adaptive-layout and adaptive-navigation 1.2.0 -> 1.3.0 * net.java.dev.jna 5.18.1 -> 5.19.1 * play-services-games-v2 21.0.0 -> 22.0.0 The previous refresh added the `gradle` Dependabot ecosystem specifically because this set could NOT be hand-bumped safely -- an interlocked group, each pin carrying a written reason, none verifiable without an Android SDK and NDK. Its first run opened five PRs. Two of the bumps here are NOT among those five. The Compose compiler plugin and `baselineprofile` are absent because `open-pull-requests-limit` is 5 and all five slots were taken, not because Dependabot judged them incompatible. A saturated limit looks exactly like "nothing else to update", which is why it is written down here rather than left to be inferred from an empty queue. AGP 9.2.1 and 9.3.2 declare the SAME `kotlin-gradle-plugin` coordinate (2.2.10) in their published POMs, so crossing that minor does not move the Kotlin requirement. Fetched from dl.google.com, not recalled. Asked directly: can `kotlin-gradle-plugin` be taken to 2.2.10+? It cannot, and the reason is a decision already recorded in this file. AGP 9 ships built-in Kotlin -- it bundles the Kotlin Gradle plugin -- so the standalone `org.jetbrains.kotlin.android` plugin was deliberately dropped from the root script and from :app. THERE IS NO `kotlin-gradle-plugin` VERSION IN THIS BUILD TO SET. AGP owns it, and to move Kotlin you move AGP. The obvious next move -- re-adding `org.jetbrains.kotlin.android` with an explicit version -- would reintroduce exactly the standalone plugin AGP 9 replaces, and two things applying Kotlin at once is the failure the drop avoided. One further distinction is recorded so it is not re-derived from the same POM: that 2.2.10 coordinate is AGP's OWN runtime dependency, not the Kotlin the build compiles user code with. The evidence is in the tree already -- AGP 9.2.1 has been pairing with a 2.3.x Compose compiler plugin and building. The Compose compiler plugin is the only Kotlin coordinate this build controls, and it moves here. `androidx.baselineprofile` moves within the SAME 1.5.0 line. The written reason for pinning that line -- 1.4.x's module-type guard rejects an AGP-9 application module, and 1.5.0 is the first to widen the supported-AGP window -- is unchanged; this is the same window with fewer unknowns, not a new dependency decision. Cargo, GitHub Actions and the pre-commit hooks were re-checked at the same time and are all already current from the previous refresh: `cargo update` proposes nothing, and every pinned action equals its newest release. Stated because "we also checked and there was nothing" is a different claim from "we did not look". `android.yml` runs on this PR because it triggers on `android/**`, and it is the only thing that can validate these -- there is no Android SDK or NDK here. It is also NOT a required check, so a red job blocks nothing: the job result is read before this is called green rather than inferred from the merge button. --- CHANGELOG.md | 30 ++++++++++++++ android/app/build.gradle.kts | 12 +++--- android/baselineprofile/build.gradle.kts | 4 +- android/build.gradle.kts | 51 ++++++++++++++++-------- 4 files changed, 72 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb42aabc..d9ccb3ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,36 @@ cycle-accurate core later replaced. accuracy-ledger entry below records. No `rustynes-*` crate changes, so AccuracyCoin and nestest are untouched by construction. + +- **Android dependency refresh.** AGP **9.2.1 → 9.3.2** (both + `com.android.application` and `com.android.test`), the Compose compiler plugin + **2.3.10 → 2.3.21**, `androidx.baselineprofile` and `benchmark-macro-junit4` + **1.5.0-alpha06 → 1.5.0-rc01**, `compose-bom` **2026.06.00 → 2026.08.00**, the + three `material3.adaptive` artifacts **1.2.0 → 1.3.0**, `jna` **5.18.1 → + 5.19.1**, and `play-services-games-v2` **21.0.0 → 22.0.0**. + + This is the `gradle` Dependabot ecosystem added in the previous refresh doing + exactly what it was added for: it opened five PRs on its first run, against a + set that could not be hand-bumped safely before because nothing proposed them + one at a time. Two of the bumps here are **not** among those five — the Compose + compiler plugin and `baselineprofile` — because the ecosystem's + `open-pull-requests-limit` is 5 and all five slots were taken. + + **The interlock was measured rather than assumed.** AGP 9.2.1 and 9.3.2 declare + the *same* `kotlin-gradle-plugin` coordinate (2.2.10) in their published POMs, + so crossing that minor does not move the Kotlin requirement. Recorded in + `android/build.gradle.kts` alongside a second fact worth not re-deriving: + **there is no `kotlin-gradle-plugin` version in this build to set at all.** + AGP 9 bundles it and the standalone `org.jetbrains.kotlin.android` plugin was + deliberately dropped, so the Compose compiler plugin is the only Kotlin + coordinate this build controls. To move Kotlin, move AGP. + + `androidx.baselineprofile` moves **alpha → rc within the same 1.5.0 line** — + the same supported-AGP window with fewer unknowns, not a new dependency + decision. + + Rust, GitHub Actions and the pre-commit hooks are unchanged: re-checked at the + same time and all already current from the previous refresh. - **Dependency and toolchain-adjacent refresh.** 17 crates moved to their newest semver-compatible versions (including `cc` 1.4.3 → 1.4.4 and `log` 0.4.33 → 0.4.34), `directories` 5 → 6, and four GitHub Actions advanced — diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 5a5aba94..016674db 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -291,7 +291,7 @@ dependencies { // 1.5.0-alpha line and are deliberately not pulled in here). Bumped from // 2024.12.01 so the adaptive APIs (Window Size Classes, ListDetailPaneScaffold) // and a current Compose runtime are available. - val composeBom = platform("androidx.compose:compose-bom:2026.06.00") + val composeBom = platform("androidx.compose:compose-bom:2026.08.00") implementation(composeBom) implementation("androidx.core:core-ktx:1.19.0") // v1.8.8 "Atlas" (Workstream B): per-app language. AppCompat 1.6.0+ supplies the @@ -312,9 +312,9 @@ dependencies { // currentWindowAdaptiveInfo()/WindowSizeClass (the single layout driver); // -layout carries ListDetailPaneScaffold; -navigation carries the predictive- // back-aware NavigableListDetailPaneScaffold for the expanded two-pane. - implementation("androidx.compose.material3.adaptive:adaptive:1.2.0") - implementation("androidx.compose.material3.adaptive:adaptive-layout:1.2.0") - implementation("androidx.compose.material3.adaptive:adaptive-navigation:1.2.0") + implementation("androidx.compose.material3.adaptive:adaptive:1.3.0") + implementation("androidx.compose.material3.adaptive:adaptive-layout:1.3.0") + implementation("androidx.compose.material3.adaptive:adaptive-navigation:1.3.0") // WindowInfoTracker / FoldingFeature for foldable-posture awareness. implementation("androidx.window:window:1.5.1") // v1.8.8 "Atlas" (Workstream K): Android-12+ system splash via the back-compat @@ -346,7 +346,7 @@ dependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.1") // UniFFI's generated Kotlin loads the cdylib through JNA; the `@aar` // classifier pulls the Android-native JNA dispatcher. - implementation("net.java.dev.jna:jna:5.18.1@aar") + implementation("net.java.dev.jna:jna:5.19.1@aar") // v2.0.1 (ADR 0025): the optional Google Play services below are PLAY-FLAVOR ONLY. // `playImplementation` keeps these proprietary Google-Play SDKs out of the `foss` // (F-Droid/sideload) artifact entirely — the `foss` variant links none of them (its @@ -364,7 +364,7 @@ dependencies { // PlayGames.kt). DISTINCT from RetroAchievements (rustynes-ra). The PGS sign-in // also reads the manifest , which is a maintainer-supplied // placeholder (@string/game_services_project_id) until the Play Games project lands. - "playImplementation"("com.google.android.gms:play-services-games-v2:21.0.0") + "playImplementation"("com.google.android.gms:play-services-games-v2:22.0.0") // v1.8.8 "Atlas" (Workstream L): Play Integrity API — the anti-tamper layer. 1.6.0 // (SafetyNet Attestation was turned down Jan 2025; this is the modern replacement). // Linked but DORMANT: no token is requested until behind the default-off diff --git a/android/baselineprofile/build.gradle.kts b/android/baselineprofile/build.gradle.kts index 50e0a72f..0c843669 100644 --- a/android/baselineprofile/build.gradle.kts +++ b/android/baselineprofile/build.gradle.kts @@ -91,7 +91,7 @@ dependencies { implementation("androidx.test.ext:junit:1.2.1") implementation("androidx.test.espresso:espresso-core:3.6.1") implementation("androidx.test.uiautomator:uiautomator:2.3.0") - // 1.5.0-alpha06 to match the AGP-9.2.1-compatible baselineprofile plugin (root + // 1.5.0-rc01 to match the baselineprofile plugin pinned in the root build // build.gradle.kts) — the 1.4.1 stable line's module guard rejects an AGP-9 app. - implementation("androidx.benchmark:benchmark-macro-junit4:1.5.0-alpha06") + implementation("androidx.benchmark:benchmark-macro-junit4:1.5.0-rc01") } diff --git a/android/build.gradle.kts b/android/build.gradle.kts index e54c56bd..858e9bd0 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,29 +1,46 @@ // Root build script — plugin versions only; modules apply them. // -// v1.8.8 "Atlas" (Workstream A): bumped to AGP 9.2.1 for official compileSdk 36 +// v1.8.8 "Atlas" (Workstream A): moved to AGP 9.x for official compileSdk 36 // (Android 16) support — AGP 8.x maxes out at API 35 (it would only build 36 via // the `android.suppressUnsupportedCompileSdk` escape hatch). AGP 9.2 requires // Gradle 9.4.1 OR LATER + JDK 17; the wrapper was moved to 9.7.1 in the v2.6.3 -// dependency refresh, which is a floor being cleared rather than a pin changing. AGP 9 ships *built-in -// Kotlin* (it bundles the Kotlin Gradle plugin), so the standalone -// `org.jetbrains.kotlin.android` plugin is dropped here and in :app — AGP applies -// Kotlin itself. The Compose compiler plugin is still a separate, explicitly -// versioned plugin (kept below, bumped to a Kotlin matching AGP 9.2's bundled KGP). +// dependency refresh, which is a floor being cleared rather than a pin changing. +// +// AGP 9 ships *built-in Kotlin* (it bundles the Kotlin Gradle plugin), so the +// standalone `org.jetbrains.kotlin.android` plugin is dropped here and in :app — +// AGP applies Kotlin itself. +// +// THERE IS THEREFORE NO `kotlin-gradle-plugin` VERSION IN THIS BUILD TO SET. +// AGP owns it. Asked directly during the v2.6.3 refresh, and worth recording +// because the obvious next move — re-adding `org.jetbrains.kotlin.android` with +// an explicit version — would reintroduce exactly the standalone plugin AGP 9 +// replaces, and the two applying Kotlin at once is the failure this drop +// avoided. To move Kotlin, move AGP. +// +// A related measurement, so it is not re-derived: AGP 9.2.1 and 9.3.2 declare +// the SAME `kotlin-gradle-plugin` coordinate (2.2.10) in their published POMs. +// That coordinate is AGP's OWN runtime dependency, not the Kotlin the build +// compiles user code with — the working pairing of AGP 9.2.1 with a 2.3.x +// Compose compiler plugin is the evidence that the two are different numbers. +// The Compose compiler plugin below is the version this build does control. plugins { - id("com.android.application") version "9.2.1" apply false + id("com.android.application") version "9.3.2" apply false // v1.8.8 "Atlas" (Workstream J): the Macrobenchmark `:baselineprofile` module is // a `com.android.test` module — declare that plugin id here so it resolves for - // the new module (it shares AGP's 9.2.1 version coordinate). - id("com.android.test") version "9.2.1" apply false - // The Compose compiler plugin must match AGP 9.2's built-in Kotlin (KGP 2.3.10). - id("org.jetbrains.kotlin.plugin.compose") version "2.3.10" apply false + // the new module (it shares AGP's version coordinate). + id("com.android.test") version "9.3.2" apply false + // The Compose compiler plugin tracks the Kotlin line AGP builds against, and + // it is the only Kotlin version coordinate this build sets (see the header). + // Moved 2.3.10 -> 2.3.21 within the same line at the v2.6.3 refresh. + id("org.jetbrains.kotlin.plugin.compose") version "2.3.21" apply false // v1.8.8 "Atlas" (Workstream J): the Baseline Profile Gradle plugin. The plan // named 1.4.1, but that stable line predates AGP 9 and its module-type guard - // rejects an AGP-9.2.1 `com.android.application` module ("not a supported android - // module"); the 1.5.0-alpha line is the first to widen the supported-AGP window to - // 9.x (ART-metric repackage handling + the bumped maxAgpVersion). So the build pins - // the 1.5.0-alpha06 benchmark/baseline-profile line to match AGP 9.2.1 (see the - // matching benchmark-macro-junit4 in :baselineprofile). It is applied on BOTH :app + // rejects an AGP-9.x `com.android.application` module ("not a supported android + // module"); the 1.5.0 line is the first to widen the supported-AGP window to + // 9.x (ART-metric repackage handling + the bumped maxAgpVersion). The pin has + // moved alpha06 -> rc01 within that same line, which is the same window with + // fewer unknowns rather than a new dependency decision (see the matching + // benchmark-macro-junit4 in :baselineprofile). It is applied on BOTH :app // (consume + bundle the generated profile) and :baselineprofile (generate it). - id("androidx.baselineprofile") version "1.5.0-alpha06" apply false + id("androidx.baselineprofile") version "1.5.0-rc01" apply false } From 34a3a42cba6f303819c247d63a0f805fa91bed1d Mon Sep 17 00:00:00 2001 From: DoubleGate Date: Tue, 25 Aug 2026 00:53:56 -0400 Subject: [PATCH 2/2] docs(android): settle the Compose/Kotlin coordinate question by building it Review raised, as a blocking issue, that the Compose compiler plugin must equal the Kotlin compiler version and that 2.3.21 against AGP's POM-declared 2.2.10 would break the build. The premise about Kotlin is right; the reading of that POM entry is not. Settled by measurement rather than argument: the release bundle job builds both flavours with AGP 9.3.2 and the plugin at 2.3.21 and reports BUILD SUCCESSFUL in 17m20s, Compose compilation and R8 included. The comment now records that instead of reasoning toward it. --- CHANGELOG.md | 1 - android/build.gradle.kts | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ccb3ed..acba1f8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,6 @@ cycle-accurate core later replaced. accuracy-ledger entry below records. No `rustynes-*` crate changes, so AccuracyCoin and nestest are untouched by construction. - - **Android dependency refresh.** AGP **9.2.1 → 9.3.2** (both `com.android.application` and `com.android.test`), the Compose compiler plugin **2.3.10 → 2.3.21**, `androidx.baselineprofile` and `benchmark-macro-junit4` diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 858e9bd0..a076c125 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -19,9 +19,20 @@ // // A related measurement, so it is not re-derived: AGP 9.2.1 and 9.3.2 declare // the SAME `kotlin-gradle-plugin` coordinate (2.2.10) in their published POMs. -// That coordinate is AGP's OWN runtime dependency, not the Kotlin the build -// compiles user code with — the working pairing of AGP 9.2.1 with a 2.3.x -// Compose compiler plugin is the evidence that the two are different numbers. +// +// THAT COORDINATE IS AGP'S OWN RUNTIME DEPENDENCY, not the Kotlin the build +// compiles user code with. The distinction matters because reading it the other +// way leads straight to a real-sounding conclusion — "the Compose compiler +// plugin must equal the Kotlin compiler version, so 2.3.x against 2.2.10 will +// break the build" — which is correct about Kotlin and wrong about what that +// POM entry means. It was raised in review on exactly those grounds. +// +// Settled by building rather than by argument: with AGP 9.3.2 and the Compose +// compiler plugin at 2.3.21, `bundleFossRelease` + `bundlePlayRelease` report +// BUILD SUCCESSFUL in 17m20s, Compose compilation and R8 included. The +// pre-existing pairing of AGP 9.2.1 with a 2.3.x plugin had been building for +// releases before that. +// // The Compose compiler plugin below is the version this build does control. plugins { id("com.android.application") version "9.3.2" apply false