MobileCodeCross Team
Google Play Target API 36 in 2026: What Happens If You Miss August 31
New apps and updates must target Android 16 (API 36) from August 31, 2026. Existing apps below API 35 lose new-user discovery on newer devices. Here's the operator checklist, Android 16 behavior changes that break uploads, and how to use the Nov 1 extension without burning the release train.
Mobile
13 min
- Hard date
- Aug 31, 2026
- Phone target
- API 36
- Extension
- Nov 1, 2026
New apps and updates
Android 16 for uploads
Play Console Policy status
Starting August 31, 2026, new apps and app updates submitted to Google Play must target Android 16 (API level 36) on phone, tablet, foldable, and Android Auto. Wear OS and Android Automotive OS may target API 35. Android TV and Android XR may target API 34. That is the upload floor. If you need to ship a build after that date, you are on Android 16 behavior — not a Gradle integer.
There is a second floor. Existing apps that sit still must target API 35 or higher (phone and Android Auto) to remain available to new users on devices running an OS newer than the app's target. Miss that, and Play keeps serving people who already installed you. It stops showing you to everyone else on a newer device. Those are different bills. Mixing them up is how a team burns a week "just bumping Gradle" and then discovers they cannot ship a hotfix without eating the Android 16 work they deferred.
This piece is the operator checklist for that clock — not a recap of App Store rejection patterns, stack cost, build timelines, Austin cost and ROI, or monetization models. Those already exist. The question here is narrower: what actually breaks on August 31, what a naive `targetSdkVersion` bump detonates, and when the November 1, 2026 extension is a tool instead of a delay.
Two floors, one August 31 clock
Google's target API requirement has always been two policies sharing a date. 2026 is the year the gap between them is large enough to wreck a release train.
New app or app update. After August 31, Play will not accept the upload unless the binary targets the form-factor floor: API 36 for phone / tablet / foldable / Android Auto; API 35 for Wear OS and Android Automotive OS; API 34 for Android TV and Android XR. An existing listing at API 35 is compliant until you try to replace it. The moment you submit a version, you owe 36.
Idle existing app. If you do not plan to update, the availability floor is lower. Phone and Android Auto must target API 35+ to stay discoverable to new users on newer OS versions. Sit on API 34 or below and Play restricts you to devices running that target or lower. Existing installers are not kicked off. New users on Android 15 and 16 stop seeing a store page that will install.
Permanently private apps restricted to one organization are excepted. Everything else on the public catalog is in scope. Google says you can request an extension to November 1, 2026 from Play Console Policy status or the warning in Notifications. The form is for noncompliant apps. It does not change the fact that the next uploaded version still has to meet the update floor.
Who the August 31 floors actually hit
New Play listing
Upload
API 36
New-user reach
Requires 36
Existing users
None yet
Store update
Upload
API 36
New-user reach
Keeps catalog
Existing users
Get the build
Idle at API 35
Upload
Not required
New-user reach
Still listed
Existing users
Unchanged
Idle at API 34−
Upload
Blocked if you try
New-user reach
Newer OS cut
Existing users
Keep / reinstall
Private / org-internal
Upload
Excepted
New-user reach
Excepted
Existing users
Internal only
What "not available on your device" actually means
Operators hear "delisted" and picture the listing vanishing. That is not what Play does. Google's own FAQ is specific: users who already installed from Play can still discover, reinstall, and use the app on any OS version the binary supports. The cut is new-user discovery and install on a newer OS than your target.
If a new user on a newer device hits a deep link to your store page, Play tells them the app is not available to install on their device because it was made for an older version of Android. Direct traffic, ads, QR codes, and influencer links all land on that message. Search and browse on those devices stop surfacing you. Downloads can fall without a single crash in Crashlytics, because the people who would have installed never got a binary.
Read that against your acquisition mix before you decide to sit still:
- Paid UA and store search → new users on current devices. Those are the first to disappear.
- Existing subscriber or logged-in base → they keep the install. Revenue from people already on the app does not vanish on August 31.
- Reinstall after a device upgrade → existing Play users can still get you. A friend on a new Pixel who never had the app cannot.
- Enterprise / private distribution → out of scope if the app is permanently restricted to one organization.
The expensive case is a consumer app that is "done" at API 33 or 34, still running ads, and treating Play as a free install pipe. The cheap case is an internal tool whose users already have the package, or a listing you were going to unpublish anyway. Unpublishing is the other official option if you want to stop serving new users even on older devices.
Form-factor floors: phone is not Wear is not TV
Do not paste `targetSdk = 36` across every module and call the catalog done. Play's form-factor tables split upload from idle availability, and they split Android Auto (a phone app) from Android Automotive OS (the car OS). The numbers below are the official floors for August 31, 2026.
| Form factor | New app / update target | Idle existing floor (new-user reach on newer OS) | Notes |
|---|---|---|---|
| Phone, tablet, foldable, Android Auto | API 36 (Android 16) | API 35 | The default catalog. An update from 35 still owes 36. |
| Wear OS | API 35 | API 34 | Updates jump to 35. Idle 33 or lower loses newer-OS discovery. |
| Android Automotive OS | API 35 | API 32 (12L) | Not Android Auto. Idle 31 or lower is the cut. |
| Android TV | API 34 | API 33 | Updates already required 34 as of August 31, 2025. |
| Android XR | API 34 | API 34 | Idle 33 or lower loses newer-OS discovery. |
Play upload target by form factor (Aug 31, 2026)
APIAndroid XR
34
New apps and updates.
Source: Play Console Help target API requirements and developer.android.com/google/play/requirements/target-sdk.
Idle existing-app floor for new-user reach
APIAutomotive OS
32
12L. API 31 or lower is the cut.
Source: Play Console Help app availability tables, August 31, 2026.
If one Play listing serves more than one form factor, inventory each artifact. A phone APK at 36 does not bless a Wear module still targeting 33. The catalog will apply the Wear table to the Wear package.
Android 16 behavior changes that break a naive targetSdk bump
Raising `targetSdkVersion` to 36 is how you opt into Android 16 behavior changes. The compiler will accept the integer. QA on an Android 16 device is where the product changes. These are the breaks that show up as a failed Play upload, a rejected screenshot set, or a support ticket — not as a red Gradle line.
Edge-to-edge is no longer optional on API 36 devices. Android 15 already forced edge-to-edge for apps targeting 35, with an escape hatch: `windowOptOutEdgeToEdgeEnforcement`. On apps targeting 36, that attribute is deprecated and disabled when the device itself is API 36. It still works if you target 36 and run on an Android 15 device. That is a trap. Test on 16. Handle insets in Compose or Views and delete the opt-out so Android 15 and 16 match.
Predictive back is on by default. For apps targeting 36 on Android 16+, the system back-to-home, cross-task, and cross-activity animations run. `onBackPressed` is not called and `KeyEvent.KEYCODE_BACK` is not dispatched. Custom "press back to close the sheet / double-back to exit" code goes silent. Migrate to the predictive back APIs, or temporarily set `android:enableOnBackInvokedCallback=false` on the application or activity. Temporary is the word Google used. Do not ship the flag as a product strategy.
Large screens ignore your orientation lock. On displays with smallest width ≥ 600 dp — tablets, inner foldables, desktop windowing — orientation, resizability, and aspect-ratio restrictions are ignored for apps targeting 36. `screenOrientation`, `resizeableActivity`, `minAspectRatio`, `maxAspectRatio`, and `setRequestedOrientation()` stop doing what your phone QA assumed. Games (`android:appCategory`) and screens under `sw600dp` are excepted. Everyone else can temporarily declare `PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY`. Google is explicit: that property does not survive targeting API 37.
Health permissions get granular. Targeting 36 replaces `BODY_SENSORS` / `BODY_SENSORS_BACKGROUND` with `android.permissions.health` — the same family Health Connect uses. Heart rate, SpO2, and skin temperature become `READ_HEART_RATE` (and siblings). Background access becomes `READ_HEALTH_DATA_IN_BACKGROUND`. Mobile apps must declare a privacy-policy activity. Google says missing rationale revokes the permission. Fitness, Wear, and anything with `FOREGROUND_SERVICE_TYPE_HEALTH` should treat this as a product ticket, not a manifest tidy-up.
Safer Intents is opt-in — this year. Android 16 lets the receiving app enforce stricter intent matching with `intentMatchingFlags`. Explicit intents must match the target filter; intents with no action match nothing. It does not flip on just because you targeted 36. It is on the roadmap to become default later. If you own exported components or a plugin that starts activities by class name with a blank action, schedule the audit now so the next mandate is not a surprise.
A bump that only changes one line in `build.gradle` and skips those five is not a Play-ready 36. It is a 35 app with a new integer and a broken back stack on the device your next reviewer is holding.
The November 1 extension: when to take it
Google will let noncompliant apps request an extension to November 1, 2026. The form lives on the warning's detail page under Policy status, and impacted apps get the link in Notifications. Only apps that are already out of policy see it. You cannot pre-file it as a comfort blanket in July.
Take the extension when the work is scheduled and the date is the problem: a native module that is not 36-clean, a Wear companion that still targets 33, or a health-permission rewrite that needs a store screenshot pass. Sixty-two days is enough to finish a scoped bump. It is not enough to start one if you also have an iOS train and a holiday freeze.
Do not take it when you have no funded owner. The November 1 date is the same bill with a later invoice. Idle apps below the availability floor keep losing new users on newer devices until you either bump or unpublish. An update you planned for October still has to target 36. The extension keeps distribution alive; it does not let you upload a 34 hotfix "just this once."
Price the extension as a release-train decision, not a compliance checkbox:
- You already have a 36 branch in QA, and August 31 is mid-sprint → take it, keep the train, do not skip the Android 16 test matrix.
- You are at API 35 and have no update on the calendar → you may not need it. Idle 35 is already on the availability floor.
- You are at API 34 or below and still buying installs → take it and staff the bump. The extension only covers the gap.
- You were going to unpublish → skip the form. Unpublish is cleaner than a two-month zombie listing.
Flutter, React Native, and the SDK graph
Cross-platform engines are native binaries. Flutter's engine and React Native's Hermes / JSI stack are NDK code. So is every camera kit, maps SDK, ads SDK, and "drop-in" BLE plugin that ships a `.so`. Play's target API is a property of the app you upload. You meet it from the engine version and the plugin graph you ship. The stack-cost piece is about when that graph costs more than two native apps. This section is about whether the graph can hit 36 before the date.
The operator sequence is the same on Flutter, React Native, and native:
- Raise `compileSdk` / `targetSdk` to 36 on the Android host (the Gradle module Play actually reads).
- Move the Flutter or React Native SDK to a version that documents API 36 / Android 16.
- Pin every plugin that owns an Android manifest, a platform view, or an NDK library, and read its last OS-support date.
- Exercise edge-to-edge, predictive back, and `sw≥600dp` on a 16 emulator inside the shared UI — platform views are where chrome breaks first.
- Rebuild the native objects. One stale `.so` fails the whole binary.
Related, and easy to mash into this deadline: 16 KB memory page sizes. Google's current Play rule is that apps targeting Android 15 (API 35)+ must support 16 KB pages on 64-bit devices, and that starting February 1, 2027, updates that do not will be rejected. That is a different clock than August 31. Do not tell the board they are the same mandate. Do tell the board that Flutter and React Native cannot hide from it — the engine is NDK. If a plugin is already blocking 16 KB, it is also a 36 risk, because the person who would rebuild it is the same person you need this month.
A shop that quotes "we'll bump targetSdk on Friday" without naming the Android host, the engine version, and the plugin that wraps billing or camera is selling a template. Ask which of those five steps they have already run on an API 36 emulator. If they cannot answer, they have not priced the upload.
Bump, test, upload — then watch Console
01
Bump targetSdk to the floor
36 phone / 35 Wear & Automotive / 34 TV & XR
02
Test Android 16 behaviors
Edge-to-edge, back, large screens, health
03
Rebuild engines and .so files
Flutter / RN / every NDK plugin
04
Upload the update
Play rejects a stale target after Aug 31
05 · loops
Watch Policy status
Extension form only appears if you are out of policy
Operator checklist
Treat this as a release, not a chore. The timeline piece already priced honest QA. A target-API bump that touches back, insets, and foldables is a slice of that QA — usually days, not a new build — unless health permissions or a dead plugin are in the graph.
Decide the bump against the catalog, not the slogan
01 →
Inventory every Play artifact
targetSdk, form factor, last upload date
02 →
Classify idle vs must-ship
35 can sit. 34− cannot sit and still grow.
03 →
Price the Android 16 work
Insets, back, large screens, health, intents
04 →
Name the plugin blockers
Engine version + each NDK / manifest owner
05 →
Choose ship, extend, or unpublish
Nov 1 is a date, not a strategy
06
Upload and watch Policy status
The form is for apps already noncompliant
Write the inventory as a table your PM can read. One row per package. Columns: current `targetSdkVersion`, form factor, whether a store update is on the calendar before November 1, whether the binary uses NDK, and who owns the Android host. If two rows share a repo and disagree on target, you have been shipping a monorepo myth.
Then fund the work in the same three lines you should already use for stack cost: shared UI (usually cheap), native modules (the tax), store / SDK mandates (this article). The Austin ROI piece is about whether an app is the right spend. This bump is a line on that spend you do not get to skip because the product is "done." Play does not care that the feature freeze was in March.
How this sits next to Apple's Xcode 26 gate
Apple already moved. Since April 28, 2026, App Store Connect uploads must be built with Xcode 26 using an SDK for iOS 26, iPadOS 26, tvOS 26, visionOS 26, or watchOS 26. Miss it and the build never reaches a reviewer. That is an upload gate. It is the shape most mobile teams already understand.
Play's 2026 rule is that gate plus a discovery gate for idle listings. You can leave a stale iOS binary in the store; new users on new iPhones can still download last year's build until you replace it (review issues aside — covered in why apps get rejected). You cannot leave a stale Android target in the catalog without losing new users on newer OS versions. Apple punishes the next binary. Play also punishes the listing that never ships one.
Apple's upload gate vs. Play's two floors
App Store
Xcode 26 / iOS 26 SDK
Required for uploads since Apr 28, 2026
Blocks the binary
Connect rejects the package
Idle listing still installs
Until you try to replace it
so the miss looks like ↓so the miss looks like
Google Play
API 36 to upload an update
Aug 31, 2026 — phone default
API 35 to keep new-user reach
Idle phone listings below 35 shrink
"Not available on your device"
New users on newer OS, not existing installs
If you run one release train across both stores, put the Android 16 behavior matrix on the same sprint as the Xcode 26 pin you already survived. Predictive back and edge-to-edge are the Android rhyme for the iOS chrome you already paid for. Billing, privacy manifests, and the next SDK mandate do not choose Flutter versus native — they punish a stale plugin graph. That is also where subscription plumbing meets the store: a paywall you cannot upload is a paywall that does not bill.
Next steps: treat the bump as a release
Three honest outcomes by August 31
01 · Ship 36
Must-move apps
Updates, new listings, anything still buying installs
02 · Sit at 35
Truly idle
No hotfix on the calendar; accept the next-update tax
03 · Extend or unpublish
34 and below
Nov 1 only if the bump is already staffed
Bring the inventory — current targets, form factors, plugin blockers, and whether you are sitting or shipping — to the estimate. We will tell you whether this is a Gradle-and-QA week or a native-module month, and whether the November 1 form is buying you time or just moving the same crash into Q4.
If the product conversation is still open, start with what the first year actually costs and how long a build takes when the stack is honest. Then schedule the 36 bump as part of that year, not as a surprise the week Play locks the console.
Directional range in a few questions — not a binding quote.
Ready to price an Austin build?
Bring the problem, the users, and a budget ceiling. We’ll tell you whether an app is the right next spend — and what the first year actually costs.
Prefer writing? Send project details on the contact page.