Поддержка размеров страниц 16 КБ.

16 КБ Требования к совместимости с Google Play
Начиная с 1 ноября 2025 года, все новые приложения и обновления существующих приложений, размещаемые в Google Play и предназначенные для устройств Android 15+, должны поддерживать размер страницы 16 КБ на 64-битных устройствах.

从历史上看,Android 仅支持 4 KB 内存页面大小,这优化了系统内存性能,以适应 Android 设备通常拥有的平均总内存量。从 Android 15 开始,AOSP 支持配置为使用 16 KB 页面大小的设备(16 KB 设备)。如果您的应用直接或通过 SDK 间接使用任何 NDK 库,则需要重新构建应用,才能在这些 16 KB 设备上运行。

随着设备制造商不断制造出具有更大物理内存 (RAM) 的设备,许多此类设备将采用 16 KB(最终甚至更大)的页面大小来优化设备性能。添加对 16 KB 页面大小设备的支持,可让您的应用在这些设备上运行,并帮助您的应用受益于相关的性能改进。如果不重新编译,应用将无法在未来 Android 版本的 16 KB 设备上运行。

为帮助您为应用添加支持,我们提供了相关指南,介绍了如何检查应用是否受到影响、如何重新构建应用(如果适用),以及如何使用模拟器(包括 Android 模拟器的 Android 15 系统映像)在 16 KB 环境中测试应用

Преимущества и повышение производительности

配置为使用 16 KB 页面大小的设备平均会使用略多一些的内存,但系统和应用的性能也会得到各种提升:

  • 缩短了系统内存压力时的应用启动时间:平均降低了 3.16%;对于我们测试的某些应用而言,改进幅度更大(最高可达 30%)
  • 应用启动期间的功耗降低:平均降低了 4.56%
  • 相机启动更快:热启动速度平均提高了 4.48%,冷启动速度平均提高了 6.60%
  • 缩短了系统启动时间:平均缩短了 8%(约 950 毫秒)

这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。随着测试的继续进行,我们将进一步分析应用的潜在收益。

Проверьте, затрагивает ли это ваше приложение.

如果您的应用使用了任何原生代码,则应重新构建应用,使其支持 16 KB 设备。如果您不确定自己的应用是否使用了原生代码,可以使用 APK 分析器来确定是否存在任何原生代码,然后检查您找到的任何共享库的 ELF 段对齐情况。Android Studio 还提供了一些功能,可帮助您自动检测对齐问题

如果您的应用仅使用以 Java 或 Kotlin 编程语言编写的代码(包括所有库或 SDK),则该应用已支持 16 KB 设备。不过,我们建议您在 16 KB 环境中测试应用,以验证应用行为是否出现意外的回归。

Ваше приложение использует нативный код?

Ваше приложение использует нативный код, если выполняется хотя бы одно из следующих условий:

  • Ваше приложение использует любой код на C/C++ (нативный код). Если ваше приложение использует Android NDK , то оно использует нативный код.
  • Ваше приложение взаимодействует с любыми сторонними нативными библиотеками или зависимостями (например, SDK), которые их используют.
  • Ваше приложение создано сторонним конструктором приложений, использующим нативные библиотеки устройства.

Идентифицируйте нативные библиотеки с помощью APK Analyzer.

APK Analyzer — это инструмент, позволяющий оценить различные аспекты собранного APK-файла. Чтобы проверить, использует ли ваше приложение нативный код (независимо от того, совместимо ли оно с 16 КБ):

  1. Откройте Android Studio , затем нажмите Файл > Открыть и выберите любой проект.
  2. В строке меню выберите Сборка > Анализ APK...

    Пункт меню Studio Build для запуска анализатора APK
  3. Выберите APK-файл, который хотите проанализировать.

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

    В окне анализатора APK отображается наличие файлов разделяемых объектов.

Выявление проблем с выравниванием с помощью автоматизированных проверок.

Android Studio заблаговременно предупреждает вас, если ваши предварительно собранные библиотеки или APK-файлы не соответствуют стандарту 16 КБ. Используйте инструмент анализа APK , чтобы проверить, какие библиотеки нуждаются в обновлении или требуются ли какие-либо изменения в коде.

Предупреждающие уведомления студии о проблемах с выравниванием в проекте.

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

Предупреждение линтера Studio о невыровненной нативной библиотеке

Проверьте выравнивание сегментов ELF для разделяемых библиотек.

Для любых разделяемых библиотек убедитесь, что сегменты ELF в них правильно выровнены, используя выравнивание ELF размером 16 КБ. Если вы разрабатываете под Linux или macOS, вы можете использовать скрипт check_elf_alignment.sh как описано в следующем разделе. Вы также можете использовать инструменты командной строки напрямую .

Используйте скрипт check_elf_alignment.sh (Linux или macOS).

Выполните следующие действия, чтобы проверить выравнивание сегментов ELF с помощью скрипта check_elf_alignment.sh :

  1. Сохраните скрипт check_elf_alignment.sh в файл.

  2. Запустите скрипт на APK-файле вашего приложения:

    check_elf_alignment.sh APK_NAME.apk
    

    Скрипт выводит либо ALIGNED , либо UNALIGNED для всех разделяемых библиотек arm64-v8a .

  3. Если какие-либо разделяемые библиотеки arm64-v8a или x86_64 UNALIGNED , вам потребуется обновить пакеты для этих библиотек , затем перекомпилировать приложение и повторно протестировать его, выполнив действия, описанные в этом разделе.

Используйте инструменты командной строки напрямую.

Выполните следующие действия, чтобы проверить выравнивание сегментов ELF непосредственно с помощью инструментов командной строки:

  1. Убедитесь, что установлены Android SDK Build-Tools версии 35.0.0 или выше, а также Android NDK с помощью SDK Manager в Android Studio или инструмента командной строки sdkmanager .
  2. Распакуйте 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
    
  3. В каталоге, куда вы распаковали 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
    
  4. Проверьте строки вывода, чтобы убедиться, что значения сегментов загрузки не меньше 2**14 . Если какие-либо сегменты загрузки имеют значения 2**13 , 2**12 или меньше, вам потребуется обновить пакеты для этих библиотек , затем перекомпилировать приложение и повторно протестировать его, следуя инструкциям в этом разделе.

  5. Далее запустите инструмент командной строки 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-файла вашего приложения. В последней строке вывода будет написано «Проверка прошла успешно», если все разделяемые библиотеки выровнены правильно.

    Если проверка не удалась, необходимо перенастроить некоторые разделяемые библиотеки, поэтому вам потребуется обновить пакеты для этих библиотек , затем перекомпилировать приложение и повторно протестировать его, следуя инструкциям в этом разделе.

Создайте приложение с поддержкой устройств с диагональю экрана 16 КБ.

Если ваше приложение использует нативный код, выполните шаги, описанные в следующих разделах, чтобы убедиться, что ваше приложение поддерживает устройства с 16 КБ памяти:

  1. Обновите упаковку ваших общих библиотек.
  2. Скомпилируйте приложение, используя выравнивание по ELF-файлу размером 16 КБ.
  3. Исправьте код и устраните проблемы во время выполнения.
  4. Проверьте наличие поддержки 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 КБ, оно может столкнуться с ошибками, если в коде предполагается, что устройство использует определенный размер страницы. Чтобы этого избежать, выполните следующие шаги:

  1. Удалите все жестко заданные зависимости, которые ссылаются на константу PAGE_SIZE , или экземпляры в вашей логике кода, которые предполагают, что размер страницы устройства составляет 4 КБ ( 4096 ).

    Вместо этого используйте getpagesize() или sysconf(_SC_PAGESIZE) .

  2. Найдите случаи использования функции 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 КБ памяти, вам потребуется протестировать его в среде с таким же экраном, чтобы проверить, не возникнут ли какие-либо проблемы. Для этого выполните следующие шаги:

  1. Установите Android SDK версии 15 или выше.

  2. Настройте одну из следующих тестовых сред:

  3. Запустите тестовое устройство, затем выполните следующую команду, чтобы убедиться, что оно использует среду размером 16 КБ:

    adb shell getconf PAGE_SIZE
    

    Команда должна вернуть значение 16384 .

  4. Выполните следующую команду zipalign , чтобы убедиться, что ваше приложение выровнено по 16 КБ, где APK_NAME — это имя APK-файла вашего приложения:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  5. Тщательно протестируйте свое приложение, уделяя особое внимание тем областям, которые могут быть затронуты изменениями в коде, ссылающимися на определенные размеры страниц .

Настройте эмулятор Android, используя образ системы размером 16 КБ.

Для настройки среды с размером 16 КБ с помощью эмулятора Android выполните следующие действия:

  1. В Android Studio перейдите в меню Инструменты > Менеджер SDK .
  2. На вкладке «Платформы SDK» установите флажок «Показать сведения о пакете» , затем разверните раздел «Android VanillaIceCream или выше» и выберите один или оба из следующих образов системы эмулятора в зависимости от виртуальных устройств, которые вы хотите создать:

    • Экспериментальные API Google, размер страницы 16 КБ, образ системы ARM 64 v8a.
    • Экспериментальные API Google, размер страницы 16 КБ, образ системы Intel x86_64 Atom.
    Загрузите образы системы эмулятора размером 16 КБ с помощью менеджера SDK в Android Studio
  3. Нажмите «Применить» > «ОК» , чтобы загрузить выбранные вами образы системы.

  4. Следуйте инструкциям по настройке виртуального устройства для Android 15 , и когда появится запрос на выбор образа системы, выберите загруженный вами образ системы размером 16 КБ. Если он не рекомендуется автоматически, вы можете найти образ системы размером 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 КБ.

Чтобы узнать больше об этом требовании совместимости, ознакомьтесь с этой записью в блоге .