Google Play is adding memory and code-optimization thresholds. Apps that exceed the "bad behavior"
thresholds face reduced Play visibility and restricted publishing. Enforcement starts February 2027.
Announced 2026-08 on the Android Developers blog:
https://android-developers.googleblog.com/2026/08/app-quality-memory-optimization-secure-onboarding.html
Three tracked metrics:
- Dynamic memory usage (anonymous RSS + swap)
- Bitmap memory usage
- DEX code optimization coverage, 25% minimum
New tooling: memory metrics in Android vitals, an out-of-memory crash filter, and DEX
optimization insights in Play Console.
Our exposure
- DEX optimization: likely fine already.
release runs R8 with isMinifyEnabled = true and
isShrinkResources = true (app/build.gradle.kts). Confirm against the Play Console figure
rather than assuming.
- Bitmap memory: the real risk. Cover art plus the browse artwork cache, inside a foreground
playback service that stays resident for hours during a listening session. That is exactly the
shape that trips a long-lived-RSS threshold. The browse artwork cache already had one eviction
bug (#89), so the code path is known-touchy.
- Dynamic memory: same service-lifetime concern.
Next action
No code work yet. Once v2.1.0 is live and accumulating field data, read the new Android vitals
memory metrics and the Play Console DEX insight, and record our actual numbers here. Optimizing
against guessed thresholds with no field data is wasted work.
Google Play is adding memory and code-optimization thresholds. Apps that exceed the "bad behavior"
thresholds face reduced Play visibility and restricted publishing. Enforcement starts February 2027.
Announced 2026-08 on the Android Developers blog:
https://android-developers.googleblog.com/2026/08/app-quality-memory-optimization-secure-onboarding.html
Three tracked metrics:
New tooling: memory metrics in Android vitals, an out-of-memory crash filter, and DEX
optimization insights in Play Console.
Our exposure
releaseruns R8 withisMinifyEnabled = trueandisShrinkResources = true(app/build.gradle.kts). Confirm against the Play Console figurerather than assuming.
playback service that stays resident for hours during a listening session. That is exactly the
shape that trips a long-lived-RSS threshold. The browse artwork cache already had one eviction
bug (#89), so the code path is known-touchy.
Next action
No code work yet. Once v2.1.0 is live and accumulating field data, read the new Android vitals
memory metrics and the Play Console DEX insight, and record our actual numbers here. Optimizing
against guessed thresholds with no field data is wasted work.