Independent product studio · Swedenhello@karelialabs.com

Guide

React Native and Google Play's 16 KB page size rule: 0.77 and how to check the build

Short answerReact Native 0.77 added support for 16 KB page sizes on Android. Upgrade React Native, update every library with native code, rebuild, and check each 64-bit library for alignment and Google's RELRO rule before you upload.

Updated

What the Play Console message means

Google's page size guide says that all apps targeting Android 15 (API level 35) and higher must support 16 KB memory page sizes on 64-bit devices on Google Play, and that from February 1, 2027 updates without 16 KB support can't be released. Play Console shows a compatibility warning for a bundle that doesn't support them.

Google Play already requires new apps and updates to target API level 36 (Google's target API rule; Wear OS, Android Automotive OS, Android TV and Android XR have lower levels). So for a phone or tablet app, the 16 KB rule applies to every update that contains native code.

The warning is about native libraries, the .so files for the 64-bit ABIs arm64-v8a and x86_64. A library fails when its LOAD segments are aligned to 4 KB instead of 16 KB, or when it is stored uncompressed and does not start on a 16 KB boundary in the zip. Every React Native app for Android has native code: the runtime, its JavaScript engine (Hermes or JSC) and libraries such as fbjni, Folly and Yoga ship as .so files, and so do community libraries with native code.

Which React Native version supports 16 KB pages

The React Native 0.77 release post (January 21, 2025) says that with 0.77 React Native is ready to fully support 16 KB page sizes, and that developers can test and ship apps for 16 KB devices with it. Upgrade to 0.77 or later. Google's guide and the vendor pages linked here were read on 15 November 2026.

What an older React Native build looks like

We ran Ship Check on EteSync Notes 1.7.0, an open-source React Native app from F-Droid whose libraries were built with NDK r17c to r21d:

  • 23 of its 44 64-bit libraries are not 16 KB aligned: 19 React Native libraries and libc++_shared.so for x86_64, and three libsodium libraries.
  • 29 of the 44 fail Google's RELRO rule, arm64-v8a React Native libraries among them, although those are aligned.
Ship Check report for a real React Native app: 23 libraries fail 16 KB alignment, grouped by the engine that ships them
A real React Native app: each failing library under the engine or SDK that ships it

Find the library that fails

  1. List the native libraries in the build. In a macOS, Linux or Git Bash terminal: unzip -l app-release.aab | grep '\.so$'. In Windows PowerShell: tar -tf .\app-release.aab | Select-String '\.so$'. In an AAB they are under base/lib/<abi>/, in an APK under lib/<abi>/.
  2. Look at the arm64-v8a and x86_64 folders; the rule is about 64-bit devices. Match each file name against the table below to see whether it comes from the engine, a plugin or an SDK.
  3. Check how each library is aligned. Ship Check (below) checks all of them at once. In Android Studio, Build > Analyze APK... shows an Alignment column that warns about every library that is not 16 KB aligned.
LibraryComes fromWhat to do
libreactnativejni.so, libhermes*.so, libjsc.so, libfbjni.so, libfolly_*.so, libyoga.so and moreReact Native, its JavaScript engine and the libraries it usesUpgrade to React Native 0.77 or later and rebuild.
libsodium.so, libsodium-jni.solibsodium, through a wrapper libraryUpdate the wrapper to a release built with NDK r28 or newer, or ask its maintainer.
libmmkv.soMMKV (Tencent)MMKV 1.3.14 lists 16K page size support. Update MMKV, or the library that bundles it.
libsentry.so, libsentry-android.soSentry Android SDKSentry Java SDK 7.18.0 added 16 KB support. Update Sentry, or the library that bundles it.
libc++_shared.soThe NDK's C++ runtimeGoogle says copies from NDK r26 and lower are not always 16 KB aligned. Update the library that ships it.
Any other .so fileA library with native codeUpdate it. If no 16 KB build exists, ask its maintainer.

Ship Check groups the React Native libraries under React Native and names libsodium, MMKV and Sentry. A library it does not know is listed by file name.

Fix it

  1. Upgrade React Native to 0.77 or later.
  2. Update every library with native code, and the SDKs they bundle.
  3. Build the release AAB again and check it.

Check the build before you upload it

  1. Open Ship Check and drop the .aab or .apk on the page. It is free, runs in your browser and nothing is uploaded.
  2. Read the 16 KB results. Every 64-bit library is checked for LOAD segment alignment and for Google's RELRO rule, and each failing library is named with the engine, plugin or SDK that ships it where Ship Check knows it. A library it does not know is listed by file name.
  3. On a build server, run Ship Check CLI: node shipcheck.mjs app-release.aab --fail-on=error. It exits with code 1 when a check fails, so the pipeline stops before the upload. Add --date 2027-02-01 to see the build as it will be judged on that day.

Alignment is not the only test. Google's page also has a rule for the GNU_RELRO segment: if it ends inside a 16 KB page that also holds writable data, the app crashes with a segmentation fault (SIGSEGV) on a 16 KB device when that data is written. Google says this typically happens with libraries built with NDK r27 or lower without the 16 KB flags.

Ship Check reads what is in the file. It cannot see your Play Console, and a passing report does not guarantee that Google Play accepts the app.

The same rule in other engines

FAQ

Do I need to change my JavaScript code?

The rule is about native libraries. Your JavaScript bundle is not one; the React Native runtime that runs it is, and so are libraries with native code.

Why do arm64 libraries pass alignment but fail RELRO?

Google's page has two separate rules. In the EteSync Notes build, the arm64-v8a React Native libraries are aligned, but their GNU_RELRO segments end inside a 16 KB page that also holds writable data.

Is upgrading React Native enough?

Only if no other library ships a failing .so file. In the app we checked, three libsodium libraries failed as well.

Is my build uploaded anywhere?

No. Ship Check reads the file in your browser, and Ship Check CLI reads it on your own machine.

More guides

More from Karelia Labs