Google Play 16KB Page Size: Fix Failing React Native Builds
In short
As of June 10, 2026, Google Play blocks every update to an Android app whose native libraries are not aligned for 16KB memory pages, and React Native apps with stale native dependencies are failing that check daily. The May 1, 2026 deadline covered all updates to existing apps, and the Play Console extension option expired on May 31, 2026, so there is no deferral left to request. The fix rests on four pillars: React Native 0.77+, Android Gradle Plugin 8.5.1+ (8.7.0 recommended), NDK r28, and updated versions of the handful of native dependencies that are actually failing. Across the four client apps I have repaired, the fastest fix took 90 minutes and the median was about half a day.

On this page
What changed, and why is my update suddenly blocked?
Newer Android devices use 16KB memory pages instead of 4KB, and native libraries compiled with 4KB assumptions crash with segmentation faults on 16KB devices. Google Play enforces 16KB support at upload time, and since May 1, 2026 that enforcement covers every update to every existing app. The final extension window closed on May 31, 2026.
A memory page is the smallest unit of memory the kernel hands out. ARM64 hardware supports both 4KB and 16KB pages, and devices like the Pixel 8 and newer running Android 15+ can boot with a 16KB kernel because Google measured real launch and battery gains from larger pages. Every ELF shared library (.so file) declares its segment alignment when it is compiled. A library aligned to 4KB boundaries cannot be mapped safely by a 16KB kernel, so the dynamic loader fails or the process dies with SIGSEGV.
Here is the full timeline, all of it now behind us:
| Date | Requirement | Status on June 10, 2026 |
| November 1, 2025 | New apps and updates targeting Android 15+ must support 16KB pages | In force |
| May 1, 2026 | ALL updates to existing apps must support 16KB pages | In force |
| May 31, 2026 | Final Play Console extension expiry | Lapsed, nothing left to request |
| Library | First 16KB-safe version | |
| @shopify/react-native-skia | >= 2.0.6 | |
| react-native-mmkv | >= 3.0.2 | |
| react-native-reanimated | >= 3.16.0 | |
| realm | >= 20.1.0 | |
| @op-engineering/op-sqlite | >= 9.3.0 | |
| react-native-vision-camera | >= 4.6.1 |
90% of 16KB failures trace to two or three stale native dependencies. This is a half-day fix, not a sprint.
That line is the most useful thing I can tell you. Teams see a Play rejection that mentions native libraries and assume they need a native specialist for a month. In the engagements I have run through my mobile development practice ↗, the work was almost always version bumps plus a disciplined clean rebuild.
What if a failing dependency is unmaintained?
Three options, in rising order of effort: patch the package so it rebuilds with your modern toolchain (2 to 4 hours), fork and recompile (half a day to a day), or replace it (anywhere from 3 hours to a week, depending on API surface).
patch-package works when the library ships C++ source and compiles during your build. Often the only problem is a build.gradle inside node_modules pinning an old NDK or stale externalNativeBuild flags. Edit it, confirm the alignment script passes, persist the change with npx patch-package .
Fork and fix is for libraries that ship prebuilt .so binaries. Patching Gradle does nothing because the binary was compiled on the maintainer's machine years ago. Clone the repo, bump its NDK to r28, rebuild the binaries, point your package.json at the fork. Budget a full day if the project's build setup is crusty.
Replace is sometimes fastest. I swapped an abandoned SQLite wrapper for op-sqlite in about 3 hours including data-layer tests, and that app got faster as a side effect. Audit your heaviest native modules first; things like the on-device AI integrations I wrote about ↗ bundle the largest binaries and hurt the most when abandoned.
Most of the app rescue work ↗ I take on starts exactly here: a blocked release, a dependency nobody has touched since 2023, and a team that needs the update out this week.
How do I verify the fix before I ship?
Two gates: run the alignment script in CI against the actual release artifact, and smoke-test on a 16KB emulator image. Only then upload to the internal testing track, where Play runs the same static check you just ran locally.
The CI step, as a GitHub Actions fragment:
- name: Verify 16KB ELF alignment
run: |
./gradlew :app:assembleRelease
./scripts/check_16kb.sh app/build/outputs/apk/release/app-release.apk | tee align.txt
! grep -q '^BAD' align.txt
For the runtime check, install the Android 15.0 16KB Page Size** system image (API 35) from the SDK Manager, boot it, and confirm the kernel really is 16KB:
adb shell getconf PAGE_SIZE
# 16384
Then exercise every screen that touches native code: database reads, camera, animations, file storage. A crash here is the exact crash your Pixel 8 users would see, surfaced before review instead of after.
For what it is worth, here are my honest numbers across four client apps fixed between November 2025 and last month: one fix took 90 minutes (a single stale Skia version), two took about half a day each, and the worst took a day and a half because of the abandoned SQLite wrapper. None required changing a line of application code.
Key takeaways
- The runway is gone: all Play updates require 16KB support since May 1, 2026, and the extension option expired May 31, 2026.
- The toolchain floor is React Native 0.77+, AGP 8.5.1+ (8.7.0 recommended), and NDK r28.
- Diagnose with the objdump alignment script or APK Analyzer; Android Studio 2025.1.2+ lint flags offenders at build time.
- Most failures come from two or three stale native dependencies; bump them, then do a genuinely clean rebuild.
- Verify with the alignment script in CI plus a smoke test on the 16KB emulator image before resubmitting.
FAQ
Why is my React Native app update being rejected by Google Play?
At least one `.so` file in your app bundle is aligned for 4KB memory pages. Since May 1, 2026, Google Play rejects every update containing such libraries, and the extension option expired May 31, 2026. Upgrade to React Native 0.77+, AGP 8.5.1+, NDK r28, and bump the flagged native dependencies.
How do I check which libraries don't support 16KB page sizes?
Unzip your release APK and run `objdump -p` on each `.so` in `lib/arm64-v8a`, checking the LOAD alignment: `2**12` fails, `2**14` or higher passes. APK Analyzer shows the same data visually, and Android Studio 2025.1.2+ lint flags non-compliant libraries during the build itself.
Do Expo apps support Google Play's 16KB page size requirement?
Yes, recent ones. Expo SDK 53 and newer produce 16KB-compliant builds by default because they ship on React Native 0.79+. Custom native modules in your config plugins still need auditing, which is one more reason I push teams toward [development builds instead of Expo Go](/article/expo-go-not-on-app-store-development-builds) for anything production-bound.
Working on something like this?
I build web apps, AI features, and mobile products for clients. If this article matches a problem you have, tell me about it.
Start a conversationMalik Hamza Shabbir · Full-Stack & AI Engineer
I build full-stack and AI products solo: a reputation SaaS in production, RAG pipelines, and React Native apps. I write from what I ship, not from documentation summaries.
Related articles
Expo Go Not on the App Store? Move to Development Builds
Expo Go for SDK 55/56 was never approved on the App Store. Here is my tested migration to development builds, plus SDK 56 gotchas and real costs.
On-Device AI in React Native: Apple Foundation Models
WWDC 2026 made on-device AI the default for React Native. I built a private review summarizer: no API key, $0 per call, 28 tokens/sec on iPhone 16 Pro.
React Native vs Flutter for Startup MVPs: What I Pick and Why
For most startup MVPs I pick React Native: it reuses React web talent, code, and hiring pipelines. Flutter wins for custom UI-heavy apps. My framework inside.
