Ну как, вы уже обновили свои приложения для поддержки новых требований Google? Если нет, то эта статья будет вам особенно полезна =) Напомню, что с 1 ноября 2025 года приложения, таргетирующиеся Android 15 и выше, должны поддерживать 16-килобайтные страницы памяти.

Как вы помните по предыдущим статьям, я работаю в МойОфис в команде разработки мобильной версии высоконагруженного корпоративного мессенджера Squadus (бэкенд на Node.js, NestJS и Meteor, а веб-интерфейс на React). Мы уже успешно перестроились на новые стандарты Google, и поэтому могу компетентно рассказать, что именно требуется, как адаптировать под это React Native-приложение и что делать, если используемая библиотека ещё не успела обновиться.


Требования и сроки от Google Play

Итак, еще раз: с выходом Android 15 устройства впервые смогут работать с увеличенным размером страниц памяти — 16 KB вместо привычных 4 KB.

Google сразу обозначил чёткий дедлайн: с 1 ноября 2025 года все новые APK/AAB и обновления, таргетирующие Android 15 и выше, должны корректно поддерживать 16-килобайтные страницы памяти.

Android 16 добавит специальный режим совместимости, однако в Google рекомендуют переходить на полную поддержку 16 KB, а не полагаться на fallback. Причина проста — ощутимый выигрыш в производительности. По оценкам Google и Android-команды, переход даёт:

  • ускорение запуска приложений на 3–30%;

  • ускорение загрузки камеры примерно на 4–6%;

  • сокращение времени загрузки системы на 8%;

  • снижение энергопотребления при старте приложений на несколько процентов.

То есть переход — не просто бюрократическое требование, а ощутимый апгрейд скорости и эффективности.

Если в вашем приложении только собственный нативный код — достаточно пересобрать его новыми инструментами. Но почти все современные проекты используют SDK и библиотеки с нативной частью. В нашем случае React Native как фреймворк несет множество нативных зависимостей. Их тоже придётся обновить и пересобрать с учётом 16 KB-выравнивания — иначе можно столкнуться с крашами и деградацией производительности.

Как проверить, соответствует ли приложение требованиям

Чтобы убедиться, что ваше приложение готово к переходу на 16-килобайтные страницы памяти, нужно собрать его актуальную версию и проверить совместимость. Самый надёжный способ — загрузить сборку в Play Console: в разделе App Bundle Explorer появится предупреждение, если поддержка 16 KB отсутствует.

Для локальной проверки стоит обновить Android Studio до последней версии. В ней можно открыть сборку через APK Analyzer (пункт Build -> Analyze APK) — в столбце Alignment будет отображено, с каким выравниванием собраны страницы. Кроме того, новый Android Gradle Plugin теперь автоматически проверяет соответствие требованиям при сборке и уведомит, если проект собран не под 16 KB.

Шаги миграции: обновление инструментов и кода

Первое, с чего стоит начать — обновить React Native как минимум до версии 0.77. Именно с этого релиза фреймворк получил полноценную поддержку 16-килобайтных страниц памяти.

Если вы переживаете из-за новой архитектуры и пока не готовы её включать, можно просто отключить её в сборщиках: в Android-проекте добавить строку newArchEnabled=false в android/gradle.properties, а для iOS в Podfile прописать ENV['RCT_NEW_ARCH_ENABLED'] = '0'. Этого будет достаточно, чтобы собрать совместимую версию без включения новой архитектуры.

Следующий шаг — обновление инструментов сборки. Скачайте новую Android Studio, рекомендую ставить Android Studio как минимум 2025.1.3, так как сообщество столкнулось с проблемой в Android Studio 2025.1.2 и ниже при проверке выравнивания.

Вместе с Android Studio установите Android Gradle Plugin 8.5.1 или новее — эти версии уже автоматически включают поддержку 16KB при сборке App Bundle и APK, а также корректно выравнивают нативные библиотеки под 16KB. Если по каким-то причинам вы используете AGP до 8.5.1, можно временно включить старую упаковку, добавив в build.gradle опцию useLegacyPackaging внутри packagingOptions.

Далее — NDK и нативный код. React Native 0.77 идёт с NDK 27, но лучше сразу установить Android NDK r28 или выше, где 16-килобайтное выравнивание уже включено по умолчанию. Для более ранних версий (r27 и ниже) придётся явно указать поддержку гибких размеров страниц: добавьте аргумент -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON в CMakeLists.txt или Gradle.

Если используете ndk-build, в Application.mk нужно прописать APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true. Не стану рассказывать про все более старые версии NDK, если у вас ниже r26 обратитесь к инструкции от Google.

Отдельно стоит проверить, чтобы в проекте не было жёстко зашитой константы PAGE_SIZE=4096 — вместо неё используйте динамический вызов sysconf(_SC_PAGESIZE) в C/C++ или аналог в Java. Это гарантирует, что код корректно подстроится под любой размер страницы.

После этого можно переходить к обновлению зависимостей и SDK. Соберите APK или AAB, откройте сборку в APK Analyzer внутри Android Studio и посмотрите столбец Alignment. Если увидите предупреждения у отдельных .so-файлов, обратите внимание на их имена — по ним легко определить библиотеку. Например, libmmkv.so принадлежит react-native-mmkv, а libreanimated.soreact-native-reanimated. Именно эти зависимости нужно обновить. В нашем случае, например, потребовалось обновить Jitsi SDK до 11.5.1, а также ряд других библиотек: старые версии просто не были готовы к 16KB. Если какая-то из ваших зависимостей до сих пор не поддерживает 16KB, можно обратиться к разделу «Что делать, если библиотека не поддержала 16KB».

Далее — сборка и упаковка. В сообществе React Native часто отмечают, что некоторые нативные библиотеки попадают в итоговый пакет уже сжатыми. Поэтому убедитесь, что при сборке .so-файлы включаются без сжатия (параметр extractNativeLibs=false или аналогичный) и проходят ZIP-выравнивание средствами AGP или bundletool. В CI/CD-цепочке стоит обновить сам bundletool как минимум до версии 1.17.0 — в ней выравнивание на 16KB включено по умолчанию.

Заключительный этап — тестирование. После сборки запустите приложение на устройстве или эмуляторе с 16-килобайтными страницами. Android Studio уже предлагает образы с такой конфигурацией, а на реальных Pixel 8 / 8a / 8 Pro (с Android 15 QPR1) можно включить режим разработчика «Boot with 16KB page size». Если у вас нет нужного устройства, подойдёт и Samsung Remote Test Lab или другие облачные сервисы. Проверьте все ключевые сценарии, особенно те, где используется нативный код. Это поможет вовремя поймать проблемы, связанные с фиксированным размером страницы 4KB, до выхода релиза.

Так мы готовили приложение и окружение к новым требованиям Google. Если что-то останется неясным — загляните в официальную инструкцию Google.

Что делать, если библиотека не поддержала 16KB

Иногда библиотеки с нативной частью обновляются не так быстро, как хотелось бы, — или вовсе перестали поддерживаться. В этом случае не всё потеряно: проблему можно решить вручную.

Для начала проверьте issues библиотеки на GitHub. Часто кто-то уже столкнулся с той же ошибкой и либо открыл pull request, либо описал временное решение в обсуждении. Если готового фикса нет — можно пропатчить библиотеку самостоятельно или форкнуть её, изменив настройки сборки.

В CMakeLists.txt добавьте поддержку 16-килобайтных страниц:

cmake_minimum_required(VERSION 3.10.2)
project("my_native_lib")


# Добавляем поддержку 16 KB страниц
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=0x4000")


add_library(my_native_lib SHARED my_native_lib.cpp)
find_library(log-lib log)
target_link_libraries(my_native_lib ${log-lib})

Здесь 0x4000 — это 16384 байта, то есть 16 KB. Флаг сообщает линковщику, что максимальный размер страницы для данного ELF-файла должен быть 16 KB.

Если библиотека собирается через Gradle, добавьте параметры в app/build.gradle:

defaultConfig {
    applicationId "com.example.myapp"
    minSdk 23
    targetSdk 35
    // подключаем параметры CMake
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
            cppFlags "-std=c++17"
        }
    }
}

После этого пересоберите зависимость, затем — всё приложение, и проверьте результат в APK Analyzer. Если выравнивание отображается как 16 KB, значит всё прошло успешно.

Выводы и рекомендации

Переход на 16 KB page size в Android — не просто оптимизация, а обязательное требование для всех новых версий приложений, начиная с конца 2025 года. Несмотря на то, что времени осталось немного, большая часть миграции сводится к обновлению инструментов, зависимостей и пары конфигурационных строк. Если подойти к этому заранее, переход пройдёт спокойно, а приложение — получит бонус в производительности и энергоэффективности.

Ну а если вам близки темы производительности, системной архитектуры и нативных технологий, обязательно загляните в нашу новую вакансию — Архитектор решений (Solution Architect) в команду Squadus =)


Источники:

официальная документация Google по 16KB page size
руководство Getting ready for 16KB
блог React Native 0.77

Комментарии (0)