If you asked Google Play for more time on the target SDK rule, that time runs out on 1 November 2026. After that, an app update has to target Android 16 (API 36) or Play Console won't accept it.
Changing one number in build.gradle takes a minute. The work is everything Android changes for apps that target each new level, and if you are coming from 33 or 34, you skip several of them at once.
The rule
- Since 31 August 2026, new apps and app updates must target API 36.
- Apps that requested an extension have until 1 November 2026.
- Already published apps must target at least API 35 to stay available to new users on newer Android versions.
Source: Google Play target API level requirements.
How many apps are behind?
I checked 900 open-source React Native and Expo apps from GitHub with NativeKeel, reading targetSdkVersion the same way the tool does (root ext block or app/build.gradle). For 172 of them the value is in the repository; the rest are mostly Expo apps without an android/ folder, where the Expo SDK decides.
| Target SDK | Apps |
|---|---|
| 36 or higher | 58 |
| 35 | 9 |
| 34 | 18 |
| 33 or lower | 87 |
114 of 172 (66%) are below API 36, so they can't ship an update after Nov 1, and 105 (61%) are below 35, so new users on newer Android versions already can't find them. Many open-source apps aren't actively released, so treat this as a picture of how far behind codebases drift, not of the Play Store.
What changes at each level you skip
Target 31: android:exported
Every activity, service or receiver with an <intent-filter> must say whether other apps can start it. Without it, the build fails with "android:exported needs to be explicitly specified".
<activity android:name=".MainActivity" android:exported="true">
Use true for the launcher activity and anything other apps must reach, false for the rest.
Target 34: foreground service types
A foreground service must declare its type in the manifest, with the matching permission, or the app crashes when the service starts. This usually comes from a library (audio, location, calls, uploads), so check that each one is on a version that declares it.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<service android:name=".PlaybackService" android:foregroundServiceType="mediaPlayback" />
Target 35: edge-to-edge on Android 15
The app is drawn behind the status bar and navigation bar. Two things show up right away in React Native apps:
- React Native's own
SafeAreaViewonly works on iOS, so on Android those screens slide under the status bar. Usereact-native-safe-area-context(itsSafeAreaVieworuseSafeAreaInsets). -
StatusBarbackgroundColoris ignored: the bar is transparent, and what you see is your own content behind it.
Target 36: Android 16
From Android 16 behavior changes:
-
The edge-to-edge opt-out is gone.
windowOptOutEdgeToEdgeEnforcementwas the quick way to postpone the work above. On Android 16 it is ignored, so screens that relied on it slide under the system bars too. -
Large screens ignore orientation and resize locks. On screens at least 600dp wide (tablets, foldables),
screenOrientation,resizeableActivity="false"and aspect ratio limits are ignored, so a portrait-only app rotates and resizes. Games are exempt. -
Predictive back is on by default.
onBackPressedis no longer called. Test the back button and the back gesture on every screen that overrides back behaviour.
While you're in there: 16 KB pages
Separate rule, same release: apps targeting Android 15+ must support 16 KB memory pages, and Google Play blocks updates without it from 1 February 2027 (source). React Native supports it from 0.77, but every native library in the app has to be built for it too.
Check your app before you bump it
npx nativekeel
It's free, MIT licensed and runs locally (your code isn't uploaded). It reports the target SDK and the follow-on problems it can see in the project: components missing android:exported, screens using core SafeAreaView, the edge-to-edge opt-out, native libraries without 16 KB support. npx nativekeel plan puts them in order.
Per-level details with links: nativekeel.com/fix/google-play-target-api-level
If you hit something on the way to API 36 that isn't covered here, tell me in the comments. Every check in the tool started as a real upgrade problem.
Top comments (2)
One gap for the Expo half of that 900: in managed apps there is no android/ folder to grep, so the target SDK comes from the Expo SDK version plus any expo-build-properties override, and a stale pin there can silently hold an app below 36 after you upgrade. Worth reading the resolved value from the built manifest (aapt dump badging on the release AAB/APK) rather than from config. Also the 600dp rule bites hardest on apps that only ever got phone QA: running a release build on a tablet or foldable emulator for 10 minutes catches the rotating, resizing portrait-only screens before Play review does.
Good catch, and it was a real gap: managed Expo apps had no target SDK check at all. NativeKeel 0.1.130 now reads a targetSdkVersion pinned in expo-build-properties and flags it below 36, with the fix pointing at the plugin options. 15 of the managed Expo apps in the same corpus pin a value below 36.
Agreed on checking the built artifact as the final word. One note for anyone trying it: aapt dump badging works on an APK; for an AAB use bundletool dump manifest --bundle app.aab. And +1 on the 10-minute tablet/foldable emulator run, it's the cheapest way to catch the 600dp change.