Skip to main content

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

New apps and updates

Phone target
API 36

Android 16 for uploads

Extension
Nov 1, 2026

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

Upload and discovery are separate levers. An idle API 35 listing is fine until the first hotfix.

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 searchnew users on current devices. Those are the first to disappear.
  • Existing subscriber or logged-in basethey keep the install. Revenue from people already on the app does not vanish on August 31.
  • Reinstall after a device upgradeexisting Play users can still get you. A friend on a new Pixel who never had the app cannot.
  • Enterprise / private distributionout 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 factorNew app / update targetIdle existing floor (new-user reach on newer OS)Notes
Phone, tablet, foldable, Android AutoAPI 36 (Android 16)API 35The default catalog. An update from 35 still owes 36.
Wear OSAPI 35API 34Updates jump to 35. Idle 33 or lower loses newer-OS discovery.
Android Automotive OSAPI 35API 32 (12L)Not Android Auto. Idle 31 or lower is the cut.
Android TVAPI 34API 33Updates already required 34 as of August 31, 2025.
Android XRAPI 34API 34Idle 33 or lower loses newer-OS discovery.

Play upload target by form factor (Aug 31, 2026)

API

Android XR

34

New apps and updates.

010213141Required targetSdkVersion for new apps and updatesPhone / tablet /foldable / Auto36Wear OS35Automotive OS35Android TV34Android XR34

Source: Play Console Help target API requirements and developer.android.com/google/play/requirements/target-sdk.

Official Google Play floors. Phone / tablet / foldable / Android Auto sit at 36. Wear and Automotive OS sit at 35. TV and XR sit at 34.

Idle existing-app floor for new-user reach

API

Automotive OS

32

12L. API 31 or lower is the cut.

010203040Minimum target to stay listed for new users on newer OSPhone / Android Auto35Wear OS34Android XR34Android TV33Automotive OS32

Source: Play Console Help app availability tables, August 31, 2026.

Sit below these and Play keeps existing installers, then hides you from new users on a newer OS than your target. Updating still requires the upload floor in the chart above.

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-sprinttake it, keep the train, do not skip the Android 16 test matrix.
  • You are at API 35 and have no update on the calendaryou may not need it. Idle 35 is already on the availability floor.
  • You are at API 34 or below and still buying installstake it and staff the bump. The extension only covers the gap.
  • You were going to unpublishskip 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:

  1. Raise `compileSdk` / `targetSdk` to 36 on the Android host (the Gradle module Play actually reads).
  2. Move the Flutter or React Native SDK to a version that documents API 36 / Android 16.
  3. Pin every plugin that owns an Android manifest, a platform view, or an NDK library, and read its last OS-support date.
  4. Exercise edge-to-edge, predictive back, and `sw≥600dp` on a 16 emulator inside the shared UI — platform views are where chrome breaks first.
  5. 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

  1. 01

    Bump targetSdk to the floor

    36 phone / 35 Wear & Automotive / 34 TV & XR

  2. 02

    Test Android 16 behaviors

    Edge-to-edge, back, large screens, health

  3. 03

    Rebuild engines and .so files

    Flutter / RN / every NDK plugin

  4. 04

    Upload the update

    Play rejects a stale target after Aug 31

  5. 05 · loops

    Watch Policy status

    Extension form only appears if you are out of policy

The integer is step one. Play Console Policy status is step five. Skipping the middle is how 36 ships and back breaks.

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

  1. 01

    Inventory every Play artifact

    targetSdk, form factor, last upload date

  2. 02

    Classify idle vs must-ship

    35 can sit. 34− cannot sit and still grow.

  3. 03

    Price the Android 16 work

    Insets, back, large screens, health, intents

  4. 04

    Name the plugin blockers

    Engine version + each NDK / manifest owner

  5. 05

    Choose ship, extend, or unpublish

    Nov 1 is a date, not a strategy

  6. 06

    Upload and watch Policy status

    The form is for apps already noncompliant

If you cannot complete step 01, you are not ready to file an extension or promise a Friday upload.

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

  1. Xcode 26 / iOS 26 SDK

    Required for uploads since Apr 28, 2026

  2. Blocks the binary

    Connect rejects the package

  3. Idle listing still installs

    Until you try to replace it

so the miss looks like

Google Play

  1. API 36 to upload an update

    Aug 31, 2026 — phone default

  2. API 35 to keep new-user reach

    Idle phone listings below 35 shrink

  3. "Not available on your device"

    New users on newer OS, not existing installs

Same calendar year, different failure modes. Budget both or you will staff only the store that yells first.

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

  1. 01 · Ship 36

    Must-move apps

    Updates, new listings, anything still buying installs

  2. 02 · Sit at 35

    Truly idle

    No hotfix on the calendar; accept the next-update tax

  3. 03 · Extend or unpublish

    34 and below

    Nov 1 only if the bump is already staffed

Pick one per listing. "We'll see in September" is the fourth outcome, and Play picks it for you.

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.

Get an Austin estimate

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.