Исторически 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 Analyzer , чтобы узнать, какие библиотеки необходимо обновить или требуется ли внести изменения в код.

Lint в Android Studio также выделяет нативные библиотеки, которые не выровнены по размеру 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_64
UNALIGNED
, вам потребуется обновить упаковку для этих библиотек , а затем перекомпилировать приложение и повторно протестировать его, выполнив действия, описанные в этом разделе.
Используйте инструменты командной строки напрямую
Выполните следующие действия, чтобы проверить выравнивание сегментов 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_out
Windows (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 LOAD
Windows (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.apk
Windows (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-файла вашего приложения. В последней строке вывода будет указано «Verification successful» (Проверка прошла успешно), если все общие библиотеки настроены правильно.Если проверка не удалась, необходимо перенастроить некоторые общие библиотеки, поэтому вам потребуется обновить упаковку для этих библиотек , а затем перекомпилировать приложение и повторно протестировать его, выполнив действия, описанные в этом разделе.
Создайте свое приложение с поддержкой устройств с экраном 16 КБ
Если ваше приложение использует собственный код, выполните действия, описанные в следующих разделах, чтобы убедиться, что ваше приложение поддерживает устройства с памятью 16 КБ:
- Обновите упаковку ваших общих библиотек
- Скомпилируйте свое приложение, используя выравнивание ELF размером 16 КБ.
- Исправление кода и устранение проблем во время выполнения
- Проверьте SDK на поддержку 16 КБ.
Обновите упаковку ваших общих библиотек
Мы рекомендуем вам обновить AGP до версии 8.5.1 или выше и использовать несжатые общие библиотеки.
AGP версии 8.5.1 или выше
Устройства с объёмом памяти 16 КБ требуют, чтобы приложения, поставляемые с несжатыми общими библиотеками, выравнивались по границе 16 КБ, выровненной с помощью zip-архива. Для этого необходимо обновить плагин Android Gradle Plugin (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
или компоновщика следующим образом:
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 и ниже
Для поддержки компиляции общих библиотек размером 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 r26 и ниже, необходимо установить common-page-size=16384
если вы используете NDK r22 или ниже. Установка common-page-size=16384
необходима из-за ошибок в более ранних версиях компоновщиков GNU ld и LLVM lld . Однако мы настоятельно рекомендуем обновить инструментарий до более новой версии, чтобы полностью избежать этих ошибок.
Чтобы скомпилировать 16-КБ совместимые общие библиотеки с Android NDK версии r22 или ниже, обновите конфигурацию ndk-build
или cmake
следующим образом:
ndk-build
Обновите Android.mk
для сборки 16 КБ-совместимого ELF:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
CMake
Обновите CMakeLists.txt
для создания совместимого ELF размером 16 КБ:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,common-page-size=16384")
Исправление кода и устранение проблем во время выполнения
Даже если ваше приложение выровнено по размеру страницы в 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
создайте новую переменную с новым именем, чтобы отразить, что она используется для других целей и не отражает реальную страницу памяти.
Проверьте SDK на поддержку 16 КБ.
Многие SDK совместимы с размером страницы 16 КБ, особенно если вы создаёте их самостоятельно или используете последние готовые версии. Однако, поскольку некоторые готовые версии SDK или версии SDK несовместимы с 16 КБ, вам следует проверить веб-сайт каждого поставщика SDK, чтобы определить, какую версию использовать с 16 КБ.
Протестируйте свое приложение в среде размером 16 КБ
После создания приложения с поддержкой устройств с 16 КБ вам необходимо протестировать его в среде с 16 КБ, чтобы выявить возможные регрессии. Для этого выполните следующие действия:
Настройте одну из следующих сред тестирования:
Запустите тестовое устройство, затем выполните следующую команду, чтобы убедиться, что оно использует среду размером 16 КБ:
adb shell getconf PAGE_SIZE
Команда должна вернуть значение
16384
.Выполните следующую команду
zipalign
, чтобы убедиться, что ваше приложение выровнено по размеру 16 КБ, где APK_NAME — имя APK-файла вашего приложения:zipalign -c -P 16 -v 4 APK_NAME.apk
Тщательно протестируйте свое приложение, обращая особое внимание на области, на которые может повлиять изменение экземпляров кода, ссылающихся на определенные размеры страниц .
Настройте эмулятор Android с помощью образа системы Android 15 размером 16 КБ.
Чтобы настроить среду размером 16 КБ с помощью эмулятора Android, выполните следующие действия:
Образы системы эмулятора Android 15 с памятью 16 КБ совместимы с Android Studio Jellyfish | 2023.3.1 и выше. Однако для оптимальной работы с устройствами с памятью 16 КБ используйте Android Studio Ladybug | 2024.2.1 и выше.
Мы постоянно работаем над новыми функциями, поэтому рассмотрите возможность загрузки новых версий или последней предварительной версии Android Studio по мере их появления.
Помните, что вы можете оставить установленной существующую версию Android Studio, так как вы можете установить несколько версий одновременно .
В Android Studio выберите Инструменты > Менеджер SDK .
На вкладке «Платформы SDK» установите флажок «Показать сведения о пакете» , затем разверните раздел «Android VanillaIceCream или более поздняя версия» и выберите один или оба из следующих образов системы эмулятора в зависимости от виртуальных устройств, которые вы хотите создать:
- Экспериментальный размер страницы API Google 16 КБ, системный образ ARM 64 v8a
- Экспериментальный размер страницы API Google 16 КБ, образ системы Intel x86_64 Atom
Нажмите «Применить» > «ОК» , чтобы загрузить выбранные вами образы системы.
Следуйте инструкциям по настройке виртуального устройства для Android 15. Когда система предложит выбрать образ системы, выберите загруженный образ размером 16 КБ. Если он не рекомендован автоматически, вы можете найти образ размером 16 КБ на вкладке «Другие образы» .
Дополнительные шаги для некоторых версий эмулятора и образов системы
Для Android Emulator версий 35.1.5–35.1.20 и до версии 4 системных образов Android 15.0 с размером страницы 16 КБ, предлагаемых в SDK Manager, для имитации среды размером 16 КБ в системах x86_64 необходимо также выполнить следующие действия. Эти действия не требуются после версии 35.1.21 и для системных образов Android 15.0 с размером страницы 16 КБ, начиная с версии 4.
- В диспетчере устройств нажмите на три точки рядом с изображением размером 16 КБ, затем нажмите Показать на диске .
- В этой папке найдите файл
config.ini
. Добавьте следующую строку в файл
config.ini
и сохраните изменения:kernel.parameters = androidboot.page_shift=14
Чтобы проверить изменения, выполните следующую команду, которая должна вернуть
16384
:adb shell getconf PAGE_SIZE
Запустить эмулятор
После завершения настройки эмулятора Android и виртуальных устройств запустите эмулятор из меню целевого устройства или из командной строки .
Включите режим 16 КБ на устройстве с помощью параметров разработчика

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