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

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

Исторически 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 КБ):

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

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

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

    Вид APK Analyzer, показывающий наличие общих объектных файлов

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

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

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

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

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

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

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

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

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

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

  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 создайте новую переменную с новым именем, чтобы отразить, что она используется для других целей и не отражает реальную страницу памяти.

Проверьте SDK на поддержку 16 КБ.

Многие SDK совместимы с размером страницы 16 КБ, особенно если вы создаёте их самостоятельно или используете последние готовые версии. Однако, поскольку некоторые готовые версии SDK или версии SDK несовместимы с 16 КБ, вам следует проверить веб-сайт каждого поставщика SDK, чтобы определить, какую версию использовать с 16 КБ.

Протестируйте свое приложение в среде размером 16 КБ

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

  1. Настройте Android 15 SDK .

  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 с помощью образа системы Android 15 размером 16 КБ.

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

  1. Образы системы эмулятора Android 15 с памятью 16 КБ совместимы с Android Studio Jellyfish | 2023.3.1 и выше. Однако для оптимальной работы с устройствами с памятью 16 КБ используйте Android Studio Ladybug | 2024.2.1 и выше.

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

    Помните, что вы можете оставить установленной существующую версию Android Studio, так как вы можете установить несколько версий одновременно .

  2. В Android Studio выберите Инструменты > Менеджер SDK .

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

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

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

  1. В диспетчере устройств нажмите на три точки рядом с изображением размером 16 КБ, затем нажмите Показать на диске .
  2. В этой папке найдите файл config.ini .
  3. Добавьте следующую строку в файл config.ini и сохраните изменения:

    kernel.parameters = androidboot.page_shift=14
    
  4. Чтобы проверить изменения, выполните следующую команду, которая должна вернуть 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 КБ.

Более подробную информацию об этом требовании совместимости можно найти в этой записи блога .