Google Play’s 2026 target API mandate is turning “simple” Android releases into time sinks: your CI says it’s targeting API 36, but Play Console still warns that it isn’t.
From 31 August 2026, Google Play requires new apps and updates to target Android 16 (API level 36), with an extension path only until 1 November 2026. (developer.android.google.cn)
The rule you’re actually being measured against
Google is not asking what you compile against. It’s asking what you declare you’re targeting in the artefact you upload.
- Play checks the uploaded APK/AAB’s manifest value for
android:targetSdkVersion(in modern toolchains, this is typically generated from Gradle). (developer.android.google.cn) - The submission requirement is: target Android 16 (API 36) or higher for new apps and updates from 31 August 2026. (developer.android.google.cn)
- If you can’t make that date, Google says you can request an extension until 1 November 2026. (developer.android.google.cn)
- There are exceptions by form factor (Wear OS / Automotive / TV / XR have different target requirements), which matters if you ship multiple artefacts/tracks or use device-specific delivery. (developer.android.google.cn)
If you take nothing else: Play evaluates what’s in the uploaded bundle, not what’s in your repository, not what Gradle sync shows locally, and not what a build job prints.
Why “I uploaded targetSdk 36” can still show as failing
This is where teams waste days. The common failure mode is assuming there’s a single source of truth and a single UI status.
1) You fixed one track, but Play is warning on another
If production is still on an older release (or staged rollout is incomplete), Play can keep warning because the “latest” artefact it considers for policy checks is not the one you just uploaded.
- If you upload to internal testing only, the policy banner may still reflect production.
- If you uploaded a new bundle but it’s not fully rolled out, you can see a warning until that rollout completes.
2) You fixed the app module, but a library/plugin still forces a lower target
Most modern builds set target in one place, but multi-module builds, convention plugins, or legacy manifest overrides can mean you’re looking at one module while Play inspects another manifest in the final bundle.
Android’s own guidance still reflects that the value ultimately comes from either Gradle configuration or the manifest attribute. (developer.android.google.cn)
3) Play Console warnings aren’t perfectly synchronous
Developer threads in 2026 show a consistent theme: people upload a compliant build, and the warning persists for a while, or clears in one section but not another. Treat this as a UI/processing lag until proven otherwise — but verify the artefact itself rather than guessing. (reddit.com)
If you can’t prove the uploaded AAB’s manifest contains targetSdkVersion=36, you haven’t actually fixed anything.The checklist: prove what you’re shipping (before Play tells you)
This is the checklist we use to stop arguments between “the pipeline” and “the console”.
- Build a release AAB from CI (don’t trust a local debug build).
- Inspect the bundle’s manifest target SDK.
- Confirm the Play Console track you’re rolling out from is the one policy checks are based on.
- Only then chase Play UI propagation.
How to inspect targetSdkVersion in the built artefact
Use whatever tool your team already has in CI; the goal is deterministic evidence.
- Extract and inspect the manifest from the AAB with
bundletool(or use Android Studio’s APK Analyzer locally for spot checks). - Confirm the generated manifest shows targetSdkVersion 36.
If your organisation can’t currently inspect AAB contents as part of CI, add it. It’s a small step that removes an entire class of “we think we shipped X” failures.
Where targetSdk actually lives, by toolchain
Everyone knows “change targetSdk”. The pain is that it’s not always obvious where that value is coming from once wrappers get involved.
Native Android (Gradle)
In a typical AGP project, you’ll set:
compileSdkto 36 so you can compile against Android 16 APIs.targetSdkto 36 when you’re ready to opt into Android 16 runtime behaviour.
Android’s Android 16 setup guidance explicitly distinguishes compile SDK from target SDK and shows updating both in Gradle. (developer.android.google.cn)
Failure modes:
- You updated
compileSdkbut lefttargetSdkbehind. - A convention plugin (or shared Gradle script) overrides your module-level value.
- You have multiple application modules (white-label builds) and updated the wrong one.
Do not do this:
- Do not “patch” the manifest directly in a way that diverges from Gradle; you’ll lose the next time the build regenerates the manifest.
React Native
React Native’s Android build is Gradle-based underneath, but teams often have:
- A top-level
android/build.gradle(or a version catalog) defining SDK values. - Module-level overrides in
android/app/build.gradle. - Third-party native modules with their own Gradle assumptions.
Failure modes:
- You updated one place (e.g., root ext variables) but
appstill overrides. - A native dependency pins an older Android Gradle Plugin/compile SDK and you “fix” targetSdk in one file but the build system never actually uses it.
Practical advice:
- Make one file authoritative for
compileSdk/targetSdkand have modules consume it. - As part of your CI job, print the resolved
targetSdkfrom Gradle (not just your source value), then inspect the AAB manifest anyway.
Flutter
Flutter generates and/or templates a Gradle Android project. You still end up with the same truth:
- The Play requirement is met only if the produced AAB manifest declares target 36.
Failure modes:
- You changed a template file but your generated Android project (or a plugin’s configuration) remains out of date.
- You updated
targetSdkbut the build environment doesn’t have the required platform/build-tools installed.
Android’s Android 16 setup doc calls out installing the relevant SDK and Build Tools for API 36.x alongside updating compileSdk/targetSdk. (developer.android.google.cn)
PWA via TWA (Trusted Web Activity)
This is where “simple” becomes brittle fast.
If you’re using tooling like PWABuilder to generate a TWA wrapper, your upload is still an Android app bundle, and it still needs to target 36.
Failure modes:
- Your wrapper generator lags behind the new target requirement and emits a project targeting 35.
- You assume “it’s a web app” so policy doesn’t apply. It does: Play evaluates the Android wrapper’s target SDK.
This confusion is visible in developer discussions specifically around TWAs and PWABuilder emitting a target SDK below 36 while Play demands 36. (reddit.com)
Do not do this:
- Do not treat a generated wrapper as a black box once Play policy deadlines start. If the generator hasn’t caught up, you need to take ownership of the Android project (or switch tooling).
The ‘false positive’ trap during rollouts (and how to avoid it)
There are real cases where the warning persists even after a compliant build is published, and teams panic and ship unnecessary changes.
The trap looks like this:
- You upload a compliant AAB.
- You see “must target API 36” warning remains.
- You assume your fix didn’t work.
- You rush another release, introducing risk, and now you’ve got two moving parts.
Instead, use a controlled decision tree:
- Confirm which track/release Play is evaluating.
- Confirm the rollout state of the compliant release.
- Inspect the actual AAB manifest of the release that Play is complaining about.
- If the artefact is correct, wait a defined window for console propagation (and document that window internally).
- Only if the artefact is wrong do you change code.
Developer threads suggest that policy warnings can be asynchronous or slow to clear, and that different warning types clear at different times. That’s not a licence to ignore the warning; it’s a reason to verify the artefact and avoid churn. (reddit.com)
What changes when you actually target 36
Raising targetSdk is not just a “bump a number” task. It opts you into behaviour changes, permission rules, background execution constraints, and OEM-specific quirks.
Google’s rationale for target API requirements is that behaviour changes and platform improvements are often gated behind the app’s declared target SDK. (developer.android.google.cn)
What this means for a release pipeline:
- Treat “target 36” as a feature branch with explicit QA scope, not a Friday afternoon config tweak.
- Expect dependency upgrades (AndroidX libraries, Play services, build tooling). Sometimes the only safe path is upgrading the Android Gradle Plugin and Gradle itself before touching target.
A pragmatic plan for teams with multiple apps and limited bandwidth
If you’re running a portfolio (or a mono-repo with multiple flavours), the organisational risk is not “can we set targetSdk”. It’s “can we do it without blocking releases for weeks”.
Use a two-track plan:
- Track A (compliance): upgrade build tooling, bump compile/target, fix build breaks, ship minimal behavioural fixes.
- Track B (product): keep shipping features, but behind a branch cut that can be rebased once Track A lands.
Operationally:
- Freeze Android build system changes outside the compliance branch.
- Add an AAB manifest inspection step to CI as a gate.
- Add a release checklist item: “verify production track is on target 36 release” before the deadline.
The deadline that matters is 31 August 2026 for submissions (with extension only until 1 November 2026). Plan backwards from those fixed dates. (developer.android.google.cn)
Where codeversols fits (briefly)
If you’re trying to hit API 36 while keeping a release train moving across native Android plus React Native/Flutter or a TWA wrapper, the hard part is rarely the code change — it’s coordinating build tooling, dependencies, testing scope, and the Play Console release mechanics.
At codeversols we help teams untangle these cross-toolchain release constraints (and, importantly, add the CI guardrails so the next annual target bump is routine rather than a fire drill).
Close
The API 36 mandate is not conceptually hard, but it’s operationally sharp-edged: the target SDK lives in your built artefact, and Play Console feedback can lag or reflect a different track than the one you just uploaded.
If you treat “targetSdk 36” as a verified artefact property (not a Gradle file edit), add AAB inspection to CI, and control rollouts with a simple decision tree, you can keep shipping through the 31 August 2026 cutoff without getting trapped in warning-chasing.



