Исторически Android поддерживал страницы памяти размером всего 4 КБ, что оптимизировало производительность системной памяти для среднего объёма памяти, обычно используемого устройствами Android. Начиная с Android 15, AOSP поддерживает устройства, настроенные на использование страниц размером 16 КБ (устройства с 16 КБ). Если ваше приложение использует библиотеки NDK , напрямую или косвенно через SDK, вам потребуется пересобрать приложение для его работы на устройствах с 16 КБ.
Поскольку производители устройств продолжают выпускать устройства с большим объёмом физической памяти (ОЗУ), многие из них будут использовать размер страницы 16 КБ (а в перспективе и больше) для оптимизации производительности. Добавление поддержки устройств с размером страницы 16 КБ позволит вашему приложению работать на этих устройствах и позволит использовать преимущества, связанные с повышением производительности. Без перекомпиляции приложения не будут работать на устройствах с 16 КБ в будущих версиях Android.
Чтобы помочь вам добавить поддержку для вашего приложения, мы предоставили рекомендации о том, как проверить, затронуто ли ваше приложение , как перестроить ваше приложение (если это применимо) и как протестировать ваше приложение в среде 16 КБ с помощью эмуляторов (включая образы системы Android 15 для эмулятора Android).
Преимущества и повышение производительности
Устройства, настроенные с размером страницы 16 КБ, в среднем используют немного больше памяти, но также получают различные улучшения производительности как для системы, так и для приложений:
- Сокращение времени запуска приложений, когда система испытывает нехватку памяти: в среднем на 3,16 % меньше, с более значительными улучшениями (до 30 %) для некоторых протестированных нами приложений.
- Снижение энергопотребления при запуске приложения: в среднем снижение на 4,56 %.
- Более быстрый запуск камеры: в среднем на 4,48 % более быстрый горячий запуск и в среднем на 6,60 % более быстрый холодный запуск.
- Улучшено время загрузки системы: в среднем улучшено на 8% (приблизительно 950 миллисекунд).
Эти улучшения основаны на нашем первоначальном тестировании, и результаты на реальных устройствах, вероятно, будут отличаться. По мере продолжения тестирования мы предоставим дополнительный анализ потенциальных преимуществ для приложений.
Проверьте, затрагивает ли это ваше приложение.
Если ваше приложение использует нативный код , вам следует пересобрать его с поддержкой устройств с памятью 16 КБ . Если вы не уверены, использует ли ваше приложение нативный код, вы можете использовать APK Analyzer для его определения, а затем проверить выравнивание сегментов ELF для любых обнаруженных общих библиотек . Android Studio также предоставляет функции, помогающие автоматически обнаруживать проблемы выравнивания .
Если ваше приложение использует только код, написанный на языке программирования Java или Kotlin, включая все библиотеки и SDK, то оно уже поддерживает устройства с 16 КБ. Тем не менее, мы рекомендуем протестировать приложение в среде с 16 КБ, чтобы убедиться в отсутствии непредвиденных регрессий в его поведении.
Ваше приложение использует нативный код?
Ваше приложение использует нативный код, если выполняется хотя бы одно из следующих условий:
- Ваше приложение использует любой код на C/C++ (нативный код). Если ваше приложение использует Android NDK , то оно использует нативный код.
- Ваше приложение взаимодействует с любыми сторонними нативными библиотеками или зависимостями (например, SDK), которые их используют.
- Ваше приложение создано сторонним конструктором приложений, использующим нативные библиотеки устройства.
Идентифицируйте нативные библиотеки с помощью APK Analyzer.
APK Analyzer — это инструмент, позволяющий оценить различные аспекты собранного APK-файла. Чтобы проверить, использует ли ваше приложение нативный код (независимо от того, совместимо ли оно с 16 КБ):
- Откройте Android Studio , затем нажмите Файл > Открыть и выберите любой проект.
В строке меню выберите Сборка > Анализ APK...

Выберите APK-файл, который хотите проанализировать.
Проверьте папку
lib, в которой находятся файлы разделяемых объектов (.so), и убедитесь, что они там есть. Если такие файлы присутствуют, значит, ваше приложение использует нативный код. В столбце «Выравнивание» отображаются предупреждения для файлов с проблемами выравнивания. Если файлы разделяемых объектов отсутствуют или папкаlibне существует, значит, ваше приложение не использует нативный код.
Выявление проблем с выравниванием с помощью автоматизированных проверок.
Android Studio заблаговременно предупреждает вас, если ваши предварительно собранные библиотеки или APK-файлы не соответствуют стандарту 16 КБ. Используйте инструмент анализа APK , чтобы проверить, какие библиотеки нуждаются в обновлении или требуются ли какие-либо изменения в коде.

В Android Studio инструмент Lint также выделяет нативные библиотеки, которые не выровнены по 16 КБ.

Проверьте выравнивание сегментов ELF для разделяемых библиотек.
Для любых разделяемых библиотек убедитесь, что сегменты ELF в них правильно выровнены, используя выравнивание ELF размером 16 КБ. Если вы разрабатываете под Linux или macOS, вы можете использовать скрипт check_elf_alignment.sh как описано в следующем разделе. Вы также можете использовать инструменты командной строки напрямую .
Используйте скрипт check_elf_alignment.sh (Linux или macOS).
Выполните следующие действия, чтобы проверить выравнивание сегментов ELF с помощью скрипта check_elf_alignment.sh :
Сохраните скрипт
check_elf_alignment.shв файл.Запустите скрипт на APK-файле вашего приложения:
check_elf_alignment.sh APK_NAME.apkСкрипт выводит либо
ALIGNED, либоUNALIGNEDдля всех разделяемых библиотекarm64-v8a.Если какие-либо разделяемые библиотеки
arm64-v8aилиx86_64UNALIGNED, вам потребуется обновить пакеты для этих библиотек , затем перекомпилировать приложение и повторно протестировать его, выполнив действия, описанные в этом разделе.
Используйте инструменты командной строки напрямую.
Выполните следующие действия, чтобы проверить выравнивание сегментов ELF непосредственно с помощью инструментов командной строки:
- Убедитесь, что установлены Android SDK Build-Tools версии 35.0.0 или выше, а также Android NDK с помощью SDK Manager в Android Studio или инструмента командной строки
sdkmanager. Распакуйте APK-файл вашего приложения:
Linux или macOS
unzip APK_NAME.apk -d /tmp/my_apk_outWindows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_outВ каталоге, куда вы распаковали APK-файл, проверьте содержимое каталога
libна наличие файлов разделяемых объектов (.so). Это те же самые файлы разделяемых объектов, которые вы видели бы при идентификации нативных библиотек с помощью APK Analyzer . Выполните следующую команду для каждого файла разделяемой библиотеки:Linux или macOS
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOADWindows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"Где
SDK_ROOT_LOCATION— это путь к каталогу, где вы установили Android SDK,SHARED_OBJECT_FILE— это имя проверяемого файла разделяемой библиотеки, аNDK_VERSION— это версия установленного Android NDK (например,28.0.12433566). Для каждого проверяемого файла вывод будет выглядеть примерно так:LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14 LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14 LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14Проверьте строки вывода, чтобы убедиться, что значения сегментов загрузки не меньше
2**14. Если какие-либо сегменты загрузки имеют значения2**13,2**12или меньше, вам потребуется обновить пакеты для этих библиотек , затем перекомпилировать приложение и повторно протестировать его, следуя инструкциям в этом разделе.Далее запустите инструмент командной строки
zipalignдля APK-файла вашего приложения:Linux или macOS
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apkWindows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apkГде
SDK_ROOT_LOCATION— это путь к каталогу, где вы установили Android SDK, аAPK_NAME— имя APK-файла вашего приложения. В последней строке вывода будет написано «Проверка прошла успешно», если все разделяемые библиотеки выровнены правильно.Если проверка не удалась, необходимо перенастроить некоторые разделяемые библиотеки, поэтому вам потребуется обновить пакеты для этих библиотек , затем перекомпилировать приложение и повторно протестировать его, следуя инструкциям в этом разделе.
Создайте приложение с поддержкой устройств с диагональю экрана 16 КБ.
Если ваше приложение использует нативный код, выполните шаги, описанные в следующих разделах, чтобы убедиться, что ваше приложение поддерживает устройства с 16 КБ памяти:
- Обновите упаковку ваших общих библиотек.
- Скомпилируйте приложение, используя выравнивание по ELF-файлу размером 16 КБ.
- Исправьте код и устраните проблемы во время выполнения.
- Проверьте наличие поддержки 16 КБ в SDK.
Обновите упаковку ваших общих библиотек.
Обновите AGP до версии 8.5.1 или выше и используйте несжатые разделяемые библиотеки.
Используйте bundletool для проверки выравнивания zip-архивов.
Чтобы увидеть выравнивание вашего пакета, используйте:
bundletool dump config --bundle=<my .aab> | grep alignment
Если вы видите PAGE_ALIGNMENT_16K значит, ваш пакет запрашивает выравнивание по 16 КБ в zip-архиве. Если вы видите PAGE_ALIGNMENT_4K , это указывает APK-файлу, созданному на основе этого AAB, на необходимость наличия файлов .so с выравниванием по 4 КБ в zip-архиве.
Версия AGP 8.5.1 или выше
Для устройств с размером файла 16 КБ приложения, поставляемые с несжатыми разделяемыми библиотеками, должны выравниваться по границе, соответствующей размеру 16 КБ в ZIP-архиве. Для этого необходимо обновить плагин Android Gradle (AGP) до версии 8.5.1 или выше. Подробную информацию о процессе обновления см. в разделе «Помощник по обновлению плагина Android Gradle» .
Версия AGP 8.5 или ниже
Если вы не можете обновить AGP до версии 8.5.1 или выше, то альтернативным вариантом является переход на использование сжатых разделяемых библиотек. Обновите конфигурацию Gradle, чтобы Gradle сжимал разделяемые библиотеки при упаковке вашего приложения, во избежание проблем с установкой приложения из-за невыровненных разделяемых библиотек.
Классный
В файл build.gradle добавьте следующую опцию:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Котлин
В файл build.gradle.kts добавьте следующую опцию:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
Скомпилируйте приложение, используя выравнивание по ELF-файлу размером 16 КБ.
Для работы приложения на устройствах с размером файла 16 КБ требуется правильное выравнивание сегментов ELF разделяемых библиотек с использованием алгоритма выравнивания ELF для файлов размером 16 КБ.
Разработчикам игр следует обратиться к руководству по Unity , если их игра работает на движке Unity. Если их игра работает на движке Unreal , следует обратиться к руководству по Unreal . Для нативных игровых движков продолжайте следовать этому руководству.
Для компиляции приложения с выравниванием ELF-файлов по 16 КБ выполните действия, описанные в одном из следующих разделов, в зависимости от используемой версии Android NDK.
Android NDK r28 и выше
В версиях NDK r28 и выше компиляция по умолчанию выполняется с выравниванием по 16 КБ.
Android NDK r27
Для поддержки компиляции разделяемых библиотек с выравниванием по 16 КБ с Android NDK версии r27 и выше необходимо обновить флаги ndk-build , build.gradle , build.gradle.kts или linker следующим образом:
ndk-build
В вашем Application.mk :
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Классный
В файле build.gradle установите аргумент -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON :
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Котлин
В файле build.gradle.kts установите аргумент -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON :
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
Другие системы сборки
Укажите следующие флаги компоновщика:
-Wl,-z,max-page-size=16384
Android NDK r26 и ниже
Всегда обновляйте NDK. Это следует использовать только в крайнем случае, и никакой поддержки гарантировать не предоставляется.
Для поддержки компиляции разделяемых библиотек с выравниванием по 16 КБ с использованием Android NDK версии r26 или ниже необходимо обновить конфигурацию ndk-build или cmake следующим образом:
ndk-build
Обновите файл Android.mk , чтобы включить выравнивание ELF-файлов по 16 КБ:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
Обновите файл CMakeLists.txt , чтобы включить выравнивание ELF-файлов по 16 КБ:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Android NDK r22 и более ранние версии несовместимы.
Всегда обновляйте NDK. Это следует использовать только в крайнем случае, и никакой поддержки гарантировать не предоставляется.
Помимо шагов для NDK r26 и ниже, параметр common-page-size=16384 может обойти ошибки в старых компоновщиках GNU ld и LLVM lld . Это работает только в том случае, если в ELF-файле также присутствует раздел .relro_padding . Это зависит от версии компоновщика и конкретной написанной программы. Поддержка этих версий NDK отсутствует, и если это не работает, обновите версию NDK, прежде чем сообщать о проблеме.
Исправьте код и устраните проблемы во время выполнения.
Даже если ваше приложение выровнено по 16 КБ, оно может столкнуться с ошибками, если в коде предполагается, что устройство использует определенный размер страницы. Чтобы этого избежать, выполните следующие шаги:
Удалите все жестко заданные зависимости, которые ссылаются на константу
PAGE_SIZE, или экземпляры в вашей логике кода, которые предполагают, что размер страницы устройства составляет 4 КБ (4096).Вместо этого используйте
getpagesize()илиsysconf(_SC_PAGESIZE).Найдите случаи использования функции
mmap()и других API, требующих аргументов, выровненных по странице, и замените их альтернативными вариантами там, где это необходимо.
В некоторых случаях, если ваше приложение использует PAGE_SIZE как удобное значение, не привязанное к базовому размеру страницы, это не приведет к сбоям в работе приложения в режиме 16 КБ. Однако, если это значение передается ядру с помощью mmap без MAP_FIXED , ядро все равно использует целую страницу, что приводит к нерациональному расходованию памяти. По этим причинам PAGE_SIZE не определено при включении режима 16 КБ в NDK r27 и выше.
Если ваше приложение использует PAGE_SIZE таким образом и никогда не передает это значение напрямую ядру, то вместо использования PAGE_SIZE создайте новую переменную с новым именем, чтобы показать, что она используется для других целей и не отражает реальную страницу памяти.
Проверьте наличие поддержки 16 КБ в SDK.
Многие SDK совместимы с размерами страниц 16 КБ, особенно если вы собираете их самостоятельно или используете последние готовые сборки. Однако, поскольку некоторые готовые сборки или версии SDK не совместимы с 16 КБ, вам следует проверить веб-сайт каждого поставщика SDK, чтобы определить, какую версию использовать с размером страниц 16 КБ.
Протестируйте свое приложение в среде с размером файла 16 КБ.
После того, как вы создадите приложение с поддержкой устройств с 16 КБ памяти, вам потребуется протестировать его в среде с таким же экраном, чтобы проверить, не возникнут ли какие-либо проблемы. Для этого выполните следующие шаги:
Установите Android SDK версии 15 или выше.
Настройте одну из следующих тестовых сред:
Запустите тестовое устройство, затем выполните следующую команду, чтобы убедиться, что оно использует среду размером 16 КБ:
adb shell getconf PAGE_SIZEКоманда должна вернуть значение
16384.Выполните следующую команду
zipalign, чтобы убедиться, что ваше приложение выровнено по 16 КБ, где APK_NAME — это имя APK-файла вашего приложения:zipalign -c -P 16 -v 4 APK_NAME.apkТщательно протестируйте свое приложение, уделяя особое внимание тем областям, которые могут быть затронуты изменениями в коде, ссылающимися на определенные размеры страниц .
Настройте эмулятор Android, используя образ системы размером 16 КБ.
Для настройки среды с размером 16 КБ с помощью эмулятора Android выполните следующие действия:
- В Android Studio перейдите в меню Инструменты > Менеджер SDK .
На вкладке «Платформы SDK» установите флажок «Показать сведения о пакете» , затем разверните раздел «Android VanillaIceCream или выше» и выберите один или оба из следующих образов системы эмулятора в зависимости от виртуальных устройств, которые вы хотите создать:
- Экспериментальные API Google, размер страницы 16 КБ, образ системы ARM 64 v8a.
- Экспериментальные API Google, размер страницы 16 КБ, образ системы Intel x86_64 Atom.

Нажмите «Применить» > «ОК» , чтобы загрузить выбранные вами образы системы.
Следуйте инструкциям по настройке виртуального устройства для Android 15 , и когда появится запрос на выбор образа системы, выберите загруженный вами образ системы размером 16 КБ. Если он не рекомендуется автоматически, вы можете найти образ системы размером 16 КБ на вкладке «Другие образы» .

Запустите эмулятор
После завершения настройки эмулятора Android и виртуальных устройств запустите эмулятор из меню целевого устройства или из командной строки .
Включите режим 16 КБ на устройстве с помощью параметров разработчика

Включите опцию разработчика «Загрузка с размером страницы 16 КБ», чтобы загрузить устройство в режиме 16 КБ.
В версиях Android 15 для QPR вы можете использовать функцию разработчика , доступную на некоторых устройствах, для загрузки устройства в режиме 16 КБ и проведения тестирования на устройстве. Перед использованием функции разработчика перейдите в раздел «Настройки» > «Система» > «Обновления ПО» и установите все доступные обновления.
Эта опция разработчика доступна на следующих устройствах:
Pixel 8 и 8 Pro (с Android 15 QPR1 или выше)
Pixel 8a (с Android 15 QPR1 или выше)
Pixel 9, 9 Pro и 9 Pro XL (с Android 15 QPR2 Beta 2 или выше)
режим обратной совместимости 16 КБ

Предупреждение в режиме совместимости размеров страниц
Опция обратной совместимости с ядром размером 16 КБ доступна, если устройство работает с ядром размером 16 КБ. Менеджер пакетов запускает приложение в режиме обратной совместимости с ядром размером 16 КБ при выполнении следующих условий:
- Если приложение содержит файлы ELF (с расширением
.so) с выравниванием сегмента LOAD на 4 КБ. - Если заархивированный APK-файл содержит несжатые ELF-файлы, выровненные по ZIP-архиву по размеру 4 КБ.
Если менеджер пакетов включил для приложения режим обратной совместимости с размерами 16 КБ, при первом запуске приложение отобразит предупреждение о том, что оно работает в режиме обратной совместимости с размерами 16 КБ.
Режим обратной совместимости с размером 16 КБ позволяет некоторым приложениям работать, но для обеспечения максимальной надежности и стабильности приложениям все равно следует выравнивать размер по 16 КБ.
На странице информации о приложении в разделе «Дополнительно» включите или выключите параметр «Запускать приложение в режиме совместимости с размером страницы» , чтобы активировать режим обратной совместимости с размером страницы 16 КБ для конкретного приложения. Этот параметр отображается только в том случае, если устройство работает с размером страницы 16 КБ.

настройка режима совместимости размера страницы
Чтобы принудительно включить совместимость с 16 КБ для каждого приложения на устройстве:
adb shell setprop bionic.linker.16kb.app_compat.enabled true
adb shell setprop pm.16kb.app_compat.disabled false
Чтобы принудительно отключить 16 КБ обратной совместимости для каждого приложения на устройстве:
adb shell setprop bionic.linker.16kb.app_compat.enabled false
adb shell setprop pm.16kb.app_compat.disabled true
Установите свойство android:pageSizeCompat в значение enabled или disabled, чтобы включить или выключить режим обратной совместимости для конкретного приложения в его AndroidManifest.xml . Если это свойство установлено, приложение не будет отображать предупреждения о режиме обратной совместимости при запуске.
Требования к совместимости с Google Play
Поскольку производители устройств оснащают свои гаджеты большим объемом оперативной памяти для оптимизации производительности, многие из них будут использовать более крупные размеры страниц, например, 16 КБ. В рамках подготовки к запуску этих новых устройств Google Play вводит новое требование совместимости: начиная с 1 ноября 2025 года, все новые приложения и обновления существующих приложений, отправляемые в Google Play и предназначенные для устройств под управлением Android 15 (уровень API 35) и выше, должны поддерживать размер страниц 16 КБ.
Чтобы узнать больше об этом требовании совместимости, ознакомьтесь с этой записью в блоге .