Skip to content
chornous.dev

Type two or more letters. Esc closes.

Index of sheets
Theme

Sheet 03 · Writing

All notes

React Native 0.81: Android 16 forces edge-to-edge, and iOS builds compile up to 10x faster

React Native 0.81 shipped on August 12, 2025. It targets Android 16 by default, which removes the edge-to-edge opt-out and turns on predictive back, deprecates SafeAreaView, drops built-in JavaScriptCore and adds experimental precompiled iOS builds.

Pl. 27 · device drawing generated from the slug “react-native-0-81-android-16-ios-builds”

The React Native team released 0.81 on August 12, 2025. Moti Zilberman and Vitali Zaidman from Meta wrote the post with Gabriel Donadel Dall'Agnol and Christian Falch from Expo. More than 1,110 commits from 110 contributors went in. Two changes matter most: Android apps now target Android 16 (API level 36), and iOS gets an experimental precompiled build that the team says cuts compile time by up to 10x.

The Android change looks like a version bump. In practice it changes how your screens draw and how your back button behaves.

Android 16 takes away two choices

Android 16 requires edge-to-edge rendering with no opt-out. Your app draws behind the status bar and the navigation bar, and your layout handles the insets. If you haven't tested that, your headers will slide under the clock.

Android 16 also turns on the predictive back gesture for apps that target it. The team says BackHandler keeps working for most uses. Code that overrides onBackPressed() in native Android needs a migration, or a temporary opt-out through Android's own flag. Walk through the screens that intercept back, including modals, forms with unsaved data and WebViews.

Two more Google requirements ride along:

  1. November 1, 2025

    Google Play requires 16 KB memory page support for new apps and updates that target Android 15 and up. React Native complies. Your native code and third-party libraries must comply too.
  2. Before Android 17

    Google expects adaptive layouts on large screens, whatever orientation or size limits you set. You can opt out for now.

To get one layout across Android versions, the new edgeToEdgeEnabled Gradle property turns on edge-to-edge below Android 16 as well:

# android/gradle.properties
edgeToEdgeEnabled=true

SafeAreaView is on its way out

The built-in <SafeAreaView> only handled iOS, only allowed padding, and breaks under edge-to-edge on Android. In 0.81 the team deprecated it, DevTools warns when you render it, and a future release removes it. The team points you to react-native-safe-area-context:

import { SafeAreaView } from "react-native-safe-area-context";

export function Screen({ children }: { children: React.ReactNode }) {
  return <SafeAreaView edges={["top", "bottom"]}>{children}</SafeAreaView>;
}

If you use React Navigation, you already depend on that library, and the switch costs an import change per screen. Do it in the same PR that turns on edgeToEdgeEnabled, and test both on a device with a notch and one with gesture navigation.

Precompiled iOS builds

Expo and Meta built this together, extending the prebuilt dependencies from 0.80. The team claims up to 10x faster compiles in projects where React Native is the main dependency. Turn it on at install time:

RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 bundle exec pod install

Two limits apply. You can't step into React Native internals in the debugger, though your own native code still debugs. And the Xcode 26 beta failed with it because it builds its targets with Swift explicit modules. The workaround sets SWIFT_ENABLE_EXPLICIT_MODULES to NO, and the team planned a fix in a patch release.

Measure before you celebrate. Time a clean CI build with and without the flags on the same runner, and post both numbers in the PR. If you patch React Native sources, prebuilt binaries ignore those patches. By 0.84 this became the default.

JavaScriptCore leaves core

0.81 removes the built-in JavaScriptCore. The team announced the move in 0.79, and JSC now lives in @react-native-community/javascriptcore, released on its own schedule. Hermes apps don't notice. If you still run JSC, add the community package before you upgrade, or the build breaks.

Breaking changes for the rest of the team

What changes in 0.81 and who notices
ChangeWho notices
Node.js 20.19.4 and Xcode 16.1 minimumsCI images and dev machines
Metro honors resolveRequest and getModulesRunBeforeMainModule for Community CLIAnyone with a custom metro.config.js
DevTools shows original stack, cause and owner stack for uncaught errorsError forwarding to Sentry or your backend sees more reports
RN_SERIALIZABLE_STATE macro required in custom CMakeLists.txtLibrary authors with C++ code
textAlignVertical moves to ParagraphAttribute.hFabric components that use the C++ Text API

Before 0.81, Metro ignored those two config keys for Community CLI projects. If you set them long ago and forgot, they now take effect. Library authors fix the CMake error with one line:

target_compile_reactnative_options(myLibraryName PRIVATE)

MountingManager and TextLayoutManager also went internal on Android. With 0.81 out, 0.78.x dropped from support, and Expo SDK 54 ships 0.81 as its default.

This week

  1. Bump CI images to Node.js 20.19.4 and Xcode 16.1 first, so the upgrade PR only carries React Native changes.
  2. Set edgeToEdgeEnabled=true, replace the core SafeAreaView, and screenshot your main screens on a gesture-navigation phone.
  3. List native code that overrides onBackPressed() and test predictive back on each flow.
  4. Ask each native dependency for a 16 KB page size release, with the November 1 Play deadline in the ticket.
  5. Try the precompiled iOS flags on a branch and keep them only if your clean build gets faster.

Volodymyr Chornous