Independent product studio · Swedenhello@karelialabs.com

Guide

Godot and Google Play's 16 KB page size rule: check your Android export

Short answerA real Godot game we checked passed every 16 KB check and failed Google Play's target API rule. Export with templates built with NDK r28 or newer, update plugins with native code, and check both rules 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. In a Godot export that means the engine library, libgodot_android.so, and any .so file an Android plugin or native add-on brings.

What we found in a real Godot build

We ran Ship Check on Libre Memory Game 1.2.0, an open-source Godot game from F-Droid:

  • Both 64-bit libraries, arm64-v8a/libgodot_android.so and arm64-v8a/libc++_shared.so, are 16 KB aligned and pass Google's RELRO rule.
  • Its target API is 35. Google Play requires 36 for new apps and updates, so an update would be refused for that reason, not for 16 KB pages.
Ship Check report for a real Godot build: the libraries pass and the target API does not
A real Godot build: the libraries pass, the target API does not

Find the library that fails

  1. List the native libraries in the build. In a macOS, Linux or Git Bash terminal: unzip -l MyGame.aab | grep '\.so$'. In Windows PowerShell: tar -tf .\MyGame.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
libgodot_android.soThe Godot engine, from the Android export templateExport with a Godot release whose Android export templates were built with NDK r28 or newer, then rebuild.
libc++_shared.soThe NDK's C++ runtimeGoogle says copies from NDK r26 and lower are not always 16 KB aligned. Rebuild with a newer NDK, or update what ships it.
Any other .so fileAn Android plugin or native add-onUpdate it, or rebuild it with NDK r28 or newer or the 16 KB linker flags.

Ship Check names libgodot_android.so as Godot. Libraries from plugins and add-ons are listed by file name.

Fix it

We did not find a Godot release note that names the first Godot version with 16 KB support, so this guide gives no version number. What Google's page and Ship Check's library map say:

  1. Export with a Godot release whose Android export templates were built with NDK r28 or newer.
  2. If you build your own export templates, build them with NDK r28 or newer, or with -Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384 on an older NDK.
  3. Update or rebuild every Android plugin and add-on that ships a .so file.
  4. Export again and check both the 16 KB results and the target API.

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 MyGame.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

Does GDScript code need changes?

The rule is about native libraries. GDScript is run by the engine, so what has to be 16 KB compatible is the engine library and any plugin library, not your scripts.

Ship Check fails my target API. Is that the 16 KB rule?

No, it is a separate Google Play rule: new apps and updates must target API level 36, with lower levels for Wear OS, Android Automotive OS, Android TV and Android XR.

Which Godot version do I need?

We did not find a Godot release note that names one. Use export templates built with NDK r28 or newer and check the result.

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