DEV Community

alican akyol
alican akyol

Posted on

Google Play's API 36 extension ends Nov 1. Here's what actually changes in a React Native app

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">
Enter fullscreen mode Exit fullscreen mode

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" />
Enter fullscreen mode Exit fullscreen mode

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 SafeAreaView only works on iOS, so on Android those screens slide under the status bar. Use react-native-safe-area-context (its SafeAreaView or useSafeAreaInsets).
  • StatusBar backgroundColor is 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. windowOptOutEdgeToEdgeEnforcement was 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. onBackPressed is 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
Enter fullscreen mode Exit fullscreen mode

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)

Collapse
 
davekurian profile image
Dave Kurian •

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.

Collapse
 
keel_alican_akyol profile image
alican akyol •

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.