← All posts

APP UPDATES & COMPATIBILITY

Google Play 16 KB Page Size Requirement: How to Check and Prepare Your Android App Before February 2027

Google Play 16 KB Page Size Requirement: How to Check and Prepare Your Android App Before February 2027

Google's requirements and tooling change. Confirm the current rule in Play Console and the official page linked at the end before finalising a release plan.

Android has used 4 KB memory pages since its first release. Devices with more RAM increasingly benefit from larger pages, and Android 15 added support for 16 KB page sizes. The Google Play 16 KB page size requirement follows from that: apps shipping native code must be rebuilt to run on those devices.

The deadline is not immediate, which is why it gets postponed. Google's current documentation states that from February 1, 2027, updates without 16 KB support cannot be released on Google Play. Stale dependencies and native libraries already compiled into your APK will not fix themselves later.

Deadline: from February 1, 2027, Google Play will not accept updates to apps targeting Android 15 (API 35) and higher unless they support 16 KB memory page sizes on 64-bit devices. Check your app in the Play Console app bundle explorer now, not in 2027.

What is a 16 KB memory page size?

A memory page is the smallest block of memory the operating system maps and protects at once. When a process asks for memory, the kernel hands it out in whole pages. On Android that unit has historically been 4 KB; on a 16 KB device it is four times larger.

Larger pages mean fewer page-table entries, fewer translation lookups, and better locality. Google's published measurements show faster app launches, lower power draw during launch, quicker camera starts, and faster system boot on 16 KB devices — with results varying by app and hardware.

4 KB memory pages compared with 16 KB memory pages A 1 MB memory region divided into 256 four-kilobyte pages on the left, and into 64 sixteen-kilobyte pages on the right, illustrating that fewer, larger pages cover the same memory. Same 1 MB of memory, different page sizes A page is the smallest block the operating system maps and protects at once. 4 KB pages 256 pages per 1 MB Each shaded block is one 4 KB page. 16 KB pages 64 pages per 1 MB Each shaded block is one 16 KB page. Larger pages mean fewer translations and better locality, but native libraries must be built to expect them.
The same memory divided into 4 KB pages (left) and 16 KB pages (right). Illustrative diagram, not a screenshot.

Why native code matters: a compiled shared library declares how its segments should be loaded, including expected alignment. A library built for 4 KB alignment cannot be placed correctly by the loader on a 16 KB device. Java and Kotlin code run in the Android runtime and are unaffected — the alignment problem belongs to the native binary.

What is the Google Play 16 KB compatibility requirement?

Google's documented rule is specific about scope. Apps targeting Android 15 (API 35) and higher must support 16 KB memory page sizes on 64-bit devices. From February 1, 2027, updates from apps that do not meet this cannot be released.

Two clarifications that prevent most confusion:

  • This is not the same as "Android 16". Android 15 introduced 16 KB support; Android 16 added a compatibility mode letting some 4 KB builds run on 16 KB devices. The Play requirement is about page-size support, not about targeting a particular OS version.
  • It does not mean every app must change code. Google states that apps using only Java or Kotlin, including all their libraries and SDKs, already support 16 KB devices. Native code, or native libraries pulled in by third-party SDKs, may require rebuilding or dependency updates.

Note that Google's May 2025 announcement referenced an earlier compliance date. The current Support 16 KB page sizes documentation states February 1, 2027, and Play is the authority for enforcement. Confirm in the app bundle explorer rather than relying on any article, including this one.

Does your Android app need 16 KB page size support?

App or dependency What Google documents Recommended action
Java / Kotlin only Already supports 16 KB devices, including all libraries and SDKs used Test for unexpected regressions; no rebuild required
Uses the Android NDK Native code must be rebuilt for 16 KB alignment Check ELF alignment; upgrade NDK or add linker flags
Third-party native SDKs Prebuilt libraries may be incompatible depending on version Check the SDK provider's current compatibility guidance
Flutter / React Native Google's announcement names compatible framework versions; your plugins may still add native code Verify the actual release artifact, not the framework alone
Unity / game engines Engine-specific official guides cover 16 KB support Verify engine version and every native plugin

No framework is universally guaranteed here. A project can use a compatible framework version and still fail because one plugin ships an old prebuilt .so file. The artifact is the source of truth.

How to check whether your app uses native libraries

The quickest reliable check is APK Analyzer in Android Studio. It works on any APK, whether or not you still have the source.

  1. Open Android Studio and choose File > Open on any project.
  2. Select Build > Analyze APK….
  3. Choose the APK to inspect — ideally the signed release build you intend to upload.
  4. Expand lib. Any .so files mean your app uses native code.
  5. Read the Alignment column, which shows warnings for files with alignment problems.

No lib folder means no native libraries, so the requirement does not force a rebuild — though Google still recommends testing in a 16 KB environment for regressions.

A common surprise: lib contains one folder per ABI, such as arm64-v8a and x86_64. The 64-bit ABIs are what this requirement targets, which is why the rule is scoped to 64-bit devices.

Where 16 KB alignment problems surface before release Four checkpoints: the Gradle build emits alignment warnings, Android Studio lint flags non-aligned libraries, APK Analyzer shows an alignment column per shared object file, and Play Console app bundle explorer reports bundle compliance. Four places a 16 KB problem appears Build Gradle and AGP warn when prebuilt native libraries are not 16 KB compliant. Lint Android Studio lint highlights native libraries that are not 16 KB aligned. APK Analyzer The Alignment column shows a warning per shared object file in lib/. Play Console App bundle explorer reports bundle compliance for the uploaded artifact. None of these replaces testing: a build can report compliant and still misbehave if the code assumes a 4 KB page size at runtime.
Where compatibility problems surface before release. Original diagram, not a tool screenshot.

How to check 16 KB alignment

Alignment is checked in two places, and passing one does not prove the other. ELF alignment concerns the library's internal segments; ZIP alignment concerns how it is stored inside the APK.

ELF segment alignment

Google recommends the APK Analyzer first. If a shared object is not 16 KB aligned, its Alignment column shows a warning.

On Linux or macOS you can script the check with Google's check_elf_alignment.sh, which prints ALIGNED or UNALIGNED for each arm64-v8a library. Without the script, extract the APK and run llvm-objdump from the NDK on each .so file:

llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD

Every LOAD line should report align 2**14. A value of 2**13 or lower such as 2**12 means the library was built for 4 KB pages and must be rebuilt.

RELRO alignment

There is a second, subtler failure that produces runtime segmentation faults rather than load errors. If the GNU_RELRO segment ends inside a page that also holds writable data, the linker marks that whole 16 KB page read-only and the app crashes with SIGSEGV on the next write. This typically affects libraries built with NDK r27 or lower without the right flags. The APK Analyzer reports RELRO alignment directly, and Google's page documents the formula with four worked llvm-readelf examples.

ZIP alignment

Verify the packaged artifact, not just the library:

zipalign -c -P 16 -v 4 APK_NAME.apk

The last line reads "Verification successful" when every shared library is correctly aligned. For bundles, bundletool dump config --bundle=my.aab | grep alignment prints PAGE_ALIGNMENT_16K or PAGE_ALIGNMENT_4K. Checking the AAB matters because Play builds device APKs from it — a local APK can look fine while the bundle produces unaligned output.

Fixing the build

Google's tip is worth quoting as a plan: with AGP 8.5.1 or higher, NDK r28 or higher, and 16 KB-compatible prebuilt dependencies, your app is compatible by default and you can move straight to code and runtime checks.

  • Packaging — AGP 8.5.1 or higher. Needed so uncompressed shared libraries are aligned on a 16 KB ZIP boundary. In AGP 8.3–8.5 apps are aligned by default, but bundletool does not zipalign APKs by default, so a build can work locally and still fail when installed from Play.
  • If you cannot upgrade AGP, switch to compressed shared libraries with packagingOptions { jniLibs { useLegacyPackaging true } }. On AGP 8.0 or lower, also set android.bundle.enableUncompressedNativeLibs=false.
  • Compilation — NDK r28 or higher aligns 16 KB by default. On NDK r27 or lower, add -Wl,-z,max-page-size=16384 and -Wl,-z,common-page-size=16384 to your ndk-build or CMake linker options.
  • Prebuilt libraries must be rebuilt the same way and reimported. A compatible app can still contain one incompatible prebuilt dependency.

Code that assumes a 4 KB page

Alignment alone is not enough. Google documents two code patterns to remove: hard-coded PAGE_SIZE or 4096 values, and mmap() calls depending on a specific page size. Use getpagesize() or sysconf(_SC_PAGESIZE). On NDK r27 and higher, PAGE_SIZE is undefined in 16 KB mode, so the build surfaces these uses.

Custom memory allocators deserve a look too. If your engine or runtime ships its own slab allocator, hard-coded purge thresholds and 4 KB-aligned pools can pin far more physical memory than intended. Google's guidance covers scaling thresholds at runtime, allocating from the densest page first, aligning pools to 16 KB, releasing cached large buffers immediately, and zeroing on free().

Testing in a 16 KB environment

Build compatibility is a claim; behaviour on a 16 KB device is the evidence. Google recommends testing after rebuilding even when the build reports clean.

  1. Install the Android 15 SDK or higher.
  2. In Tools > SDK Manager > SDK Platforms, enable Show Package Details, expand the Android 15 section, and select a 16 KB page size system image — the ARM 64 v8a image for emulating a Pixel device.
  3. Create a virtual device with that image; it appears under Other Images if not suggested.
  4. Boot it and confirm: adb shell getconf PAGE_SIZE must return 16384.
  5. Install the build and run your main journeys.
  6. Watch startup, native library loading, camera, media, and any custom memory allocator.
  7. Rebuild and repeat after fixes.

Alternatives Google documents include Cuttlefish images, the Boot with 16KB page size developer option on supported Pixel devices, and Samsung Remote Test Lab on 16 KB supported devices. If a device reports 4096, you are not testing what you think you are.

Workflow for checking and fixing 16 KB page size compatibility A five step flow: inspect the APK or AAB, identify native libraries in the lib folder, update AGP and NDK versions and third-party SDKs, rebuild with 16 KB alignment, then test in a verified 16 KB environment. From unknown build to verified 16 KB support 1 Inspect the artifact Build > Analyze APK in Android Studio 2 Look inside lib/ any .so file means native code 3 Update toolchain and SDKs AGP 8.5.1+, NDK r28+, SDK updates 4 Rebuild the release verify ELF and ZIP alignment 5 Test in a verified 16 KB environment adb shell getconf PAGE_SIZE must return 16384 Two separate alignment checks ELF segments: every LOAD segment aligned at 2**14 (16 KB), not 2**12 (4 KB). ZIP packaging: shared libraries stored uncompressed and page-aligned in the archive. A build can pass one check and fail the other, so verify both before uploading.
The sequence most teams follow. Original diagram.

Flutter, React Native, and game engines

Google's announcement states that React Native and Flutter already offer compatible versions, and that Unity supports 16 KB with Unreal support described as coming at the time of writing. Treat those as starting points, not clearances.

  • Flutter and React Native: the engine may be compatible while a plugin bundles an old native library. Check the built artifact.
  • Unity: Google links to a Unity-on-Android guide covering 16 KB support; verify your engine version and every native plugin.
  • Unreal: check the current status in the official Unreal guide rather than an article date.

The same rule applies to every SDK: Google states some prebuilts or versions are not 16 KB compatible, and that you should check each provider's documentation for the version to use.

Common 16 KB compatibility problems

These are plausible scenarios to investigate, not guaranteed symptoms with a single cause.

Problem Possible cause What to investigate
App fails to startAn incompatible native library cannot loadInspect every .so in lib/, including ones brought in by SDKs
Alignment warning in the IDEELF or ZIP alignment not appliedAPK Analyzer plus AGP and NDK versions
Works locally, fails from PlayAAB packaging differs from your local APKBundle alignment with bundletool, and AGP version
Crash after a writeRELRO end not aligned, writable data in the same pageRELRO status in APK Analyzer; NDK version used to build the library
Behaves differently by deviceCode assumes a fixed page sizeSearch for PAGE_SIZE, 4096, and page-aligned mmap arguments
Higher memory use than expectedCustom allocator tuned to 4 KB pagesPurge thresholds, pool alignment, and buffer caching

Developer checklist before February 1, 2027

✓ Task How to confirm
☐Check whether the release APK contains native librariesAPK Analyzer lib/ folder
☐Inventory every third-party SDK that ships native codeDependency list cross-checked against each provider's guidance
☐Verify ELF alignment for 64-bit librariesalign 2**14 on every LOAD segment
☐Check RELRO alignmentAPK Analyzer RELRO column
☐Verify ZIP alignment of the shipped artifactzipalign -c -P 16 -v 4 and bundletool dump config
☐Upgrade AGP and NDK where neededAGP 8.5.1+ and NDK r28+, or documented alternatives
☐Remove hard-coded page-size assumptionsSearch for PAGE_SIZE and 4096
☐Test on a verified 16 KB environmentadb shell getconf PAGE_SIZE returns 16384
☐Recheck the final uploaded artifactPlay Console app bundle explorer compliance report

For the wider release-quality picture, see real device testing across different devices and the pre-launch report guide, which explains how crashes and ANRs surface after you upload.

Frequently asked questions

What is the Google Play 16 KB page size requirement?

Apps targeting Android 15 (API 35) and higher must support 16 KB memory page sizes on 64-bit devices. From February 1, 2027, updates without that support cannot be released.

When does the requirement take effect?

Google's current documentation states February 1, 2027. An earlier announcement referenced an earlier date, so confirm the status in Play Console before planning around it.

Does every Android app need to rebuild?

No. Apps using only Java or Kotlin, including their libraries and SDKs, already support 16 KB devices. Rebuilding is needed when native code or SDK-bundled native libraries are present.

Are Java and Kotlin apps already compatible?

Yes, per Google's documentation. Testing in a 16 KB environment is still recommended to catch unrelated regressions.

How do I check whether my APK contains native libraries?

Open it in Android Studio via Build > Analyze APK and look for .so files in lib/. No lib folder means no native code.

Does Flutter need 16 KB page size support?

Google lists Flutter among frameworks with compatible versions. Plugins can still add native libraries, so verify the built artifact rather than the framework name.

Is Android NDK r28 enough?

r28 and higher align 16 KB by default. Necessary but not sufficient: AGP, prebuilt dependencies, and code assuming 4 KB pages still matter.

How do I test an app in a 16 KB emulator?

Install a 16 KB system image via the SDK Manager, create a virtual device from it, then confirm adb shell getconf PAGE_SIZE returns 16384 before installing.

Can an incompatible native SDK cause problems?

Yes. Google notes some SDK prebuilts or versions are not 16 KB compatible, and that you should check each provider's guidance.

What happens if an app update is not compatible by the deadline?

Google states you will not be able to release those updates. Existing installs are not removed by the policy, but shipping fixes becomes impossible — the more practical risk.

Official resources

Every requirement and command here comes from these pages. Where a page disagrees with this article, the page wins.

Conclusion: check the artifact, not the assumption

Most of the work here is diagnostic rather than creative. Find out whether your release contains native libraries, check their alignment, update the toolchain and any stale prebuilt dependencies, then prove it on a device that actually reports a 16 KB page size.

Two habits keep this from becoming a last-minute problem: treat third-party SDK updates as part of your dependency hygiene, and re-run the alignment checks on the final signed artifact, because that is the file Play builds from.

Need structured testing support — real devices, compatibility coverage, and documented feedback before a release? Explore TestersHQ. We do not guarantee Play approval or any specific test outcome.

Ready for your 12 testers?

Stop reading — start testing. Real people on real devices, 14 days, zero chasing.

WhatsApp