CORE JSC

International Technology Partnership

Mobile Development

Fixing "App Doesn't Support 16 KB Page Sizes" Warnings in React Native Android Builds

Google Play now flags apps whose native libraries aren't aligned for 16 KB memory pages, and a React Native app can trip this warning even without a single line of custom native code — because of how its own prebuilt .so libraries, or a third-party native module's, were originally compiled. Here's what the warning actually means and how to clear it.

Core JSC Team·October 13, 2026
React NativeAndroidMobile DevelopmentNDKGoogle Play

The Problem

Uploading a new build to Google Play Console, or running Android's own APK analysis against a release build, surfaces a warning along the lines of "This app doesn't support 16 KB memory page sizes" or "Some native libraries are not aligned to 16 KB." The app builds, installs, and runs completely normally on the developer's own device. There's no crash, no runtime error, and the warning doesn't block the upload outright — yet, it's attached to every release, and on devices that actually use 16 KB pages, an app that fails this check can crash on launch or fail to load a native library at all.

Why It Happens

Android traditionally assumed a 4 KB memory page size, and some newer devices now use 16 KB pages for performance reasons

The page size is the granularity the operating system uses to manage memory, and for most of Android's history that's been a fixed 4 KB. Newer Android releases added support for 16 KB pages on devices whose hardware benefits from it, which reduces memory management overhead and improves app launch time and overall performance on those devices — but it also means the OS now has two possible page sizes to run on, and native code has to be built in a way that works correctly under both.

A native library's ELF segments need to be aligned to the larger page size to be safely loadable on a 16 KB device

Native code ships inside an app as .so files — shared libraries in the ELF format — and the loader maps their LOAD segments into memory at page-size boundaries. A library compiled with a linker that only guarantees 4 KB alignment (the long-standing default before this requirement existed) can have its segments positioned in a way that overlaps or misaligns when the loader tries to map it on a device using 16 KB pages, which is what the Play Console check and Android's alignment-checking tooling are actually detecting.

A React Native app rarely writes native code directly, but it ships plenty of it indirectly

Every React Native app bundles its own native runtime as prebuilt .so files — the JavaScript engine, the bridge or new-architecture native layer — and on top of that, nearly every third-party native module (camera, maps, crash reporting, analytics, and dozens of others) ships its own compiled native libraries too. If any one of those — the React Native core itself on an older version, or a single native module compiled with an old toolchain — wasn't built with 16 KB-aligned segments, the warning appears for the whole app, and the project's own application code, which is pure JavaScript, has absolutely nothing to do with it.

The Fix

1. Identify which specific native library in the APK is actually misaligned before assuming it's a project-wide problem

# Extract the APK and inspect each .so file's segment alignment
unzip -o app-release.apk -d extracted-apk
find extracted-apk/lib -name "*.so" | while read lib; do
  echo "=== $lib ==="
  readelf -l "$lib" | grep -A1 LOAD
done

Walking every native library's LOAD segment alignment (the Align column readelf reports) identifies exactly which .so files fall short of the 16 KB (0x4000) boundary, rather than treating the warning as something to chase blindly across the whole dependency tree.

2. Update React Native itself and any native modules carrying their own prebuilt libraries to versions that ship 16 KB-aligned builds

npm outdated react-native
npm view react-native versions --json | tail -5

Newer React Native releases rebuild their bundled native runtime with the required alignment, and the same applies to any native module maintained actively enough to have re-published its own prebuilt libraries. Upgrading the framework and the native-dependent modules is usually enough to clear the warning without touching a single line of the app's own code, since most apps never compile native code of their own at all.

3. For a custom native module the project builds itself, update the Android NDK and linker flags so new builds emit 16 KB-aligned segments

// android/app/build.gradle, inside the android { } block
packagingOptions {
    jniLibs {
        useLegacyPackaging = false
    }
}
# Ensure a current NDK is selected — older NDK revisions default to 4 KB-only alignment
sdkmanager --list | grep ndk

A sufficiently current Android NDK and Android Gradle Plugin default to emitting 16 KB-aligned LOAD segments when compiling native code, so a project that maintains its own native module just needs its toolchain current rather than passing exotic linker flags by hand — the alignment behavior comes from the build tools, not from application-level configuration.

4. Re-run the alignment check against the rebuilt APK to confirm every library now clears the boundary

find extracted-apk/lib -name "*.so" -exec sh -c '
  align=$(readelf -l "$1" | awk "/LOAD/{getline; print $NF; exit}")
  echo "$1: $align"
' _ {} ;

Re-extracting and re-checking the rebuilt APK — rather than trusting that an upgrade alone fixed things — confirms concretely that the specific library flagged earlier now reports 16 KB (0x4000) alignment, since a dependency bump can sometimes update one library while leaving a less actively maintained one on its old, unaligned build.

Why This Works

Each step narrows the problem from a vague Play Console warning down to a concrete, fixable fact. Inspecting every library's segment alignment directly replaces guessing with a specific list of offending .so files. Upgrading React Native and native-dependent modules addresses the overwhelming majority of cases, since the misalignment almost always originates in a prebuilt library the project doesn't control the build of. Updating the NDK and Gradle Plugin handles the remaining case of a project that compiles its own native code. And re-checking the rebuilt output turns "I upgraded things" into a verified, specific confirmation that the actual bytes shipping to users are now aligned correctly.

Conclusion

A "doesn't support 16 KB page sizes" warning on a React Native app is almost never about anything the app's own JavaScript or React code does — it's about whether the prebuilt native libraries bundled inside it, whether from React Native's own runtime or a third-party native module, were compiled with segments aligned to the larger page size some newer Android devices now use. Identify the specific misaligned library with readelf before assuming the worst, upgrade React Native and any native-dependent modules first since that resolves most cases, update the NDK and Gradle Plugin for any native code the project actually compiles itself, and re-verify the rebuilt APK rather than just trusting that an upgrade worked.