Введение#
С выходом Android 15 Google изменил фундаментальный принцип управления памятью: вместо фиксированных 4 KB страниц операционная система теперь поддерживает 16 KB memory pages.
Этот переход улучшает производительность и экономию энергии, но в то же время требует пересборки приложений, особенно тех, которые используют нативный код (NDK, C/C++, Flutter engine или плагины).
Если хотите сразу перейти к описанию как обновить flutter проект - переходите к части: Flutter-часть: что нужно сделать Flutter-разработчикам
1. Ключевые термины: MMU, Memory Page, Page Fault, Page Table, TLB#
Постараюсь привести объяснение терминов которые встретятся далее в статьею Чтобы легче было запоминать - приведу аналогию с городской библиотекой. Если вам не интересно читать описание терминов - можете переходить к следующей части: Почему Google вводит 16 KB memory pages.
MMU (Memory Management Unit)#
Аппаратный блок процессора, который сопоставляет виртуальные адреса с физической памятью и управляет правами доступа.
📖 Аналогия: библиотекарь, который по запросу читателя ищет книгу в каталоге и определяет её местонахождение на полке.
Страница памяти (Memory Page)#
Минимальная единица управления памятью.
- До Android 15 стандарт → 4 KB.
- Теперь возможны → 16 KB.
📖 Аналогия: единообразие размеров книг библиотеке - одинаковый размер для упрощённого хранения книг.
Page Fault#
Ошибка доступа к странице, когда её ещё нет в памяти. Ядро решает: подгрузить, выделить новую или запретить доступ.
📖 Аналогия: читатель просит книгу, библиотекарь идёт в архив потому, что на полке её пока нет.
Таблица страниц (Page Table)#
Каталог соответствий виртуальных и физических страниц.
📖 Аналогия: карточный каталог библиотеки, где указано расположение каждой книги.
TLB (Translation Lookaside Buffer)#
Быстрый кэш в процессоре для преобразований адресов.
📖 Аналогия: закладки для популярных книг - библиотекарь сразу знает, где они, без поиска в каталоге.
2. Почему Google вводит 16 KB memory pages#
История#
Исторически Android поддерживал только 4 KB страницы. Это было оптимально для устройств с небольшим объёмом RAM.
Но современные устройства имеют десятки гигабайт памяти и многоядерные процессоры. В этих условиях миллионы маленьких страниц стали создавать избыточные накладные расходы:
- больше записей в таблицах страниц;
- больше промахов в TLB;
- больше обходов таблиц страниц.
Что изменилось в Android 15#
Android 15 впервые сделал платформу страница-независимой и добавил поддержку 16 KB страниц.
Зачем это было нужно:
- меньше записей в таблицах страниц;
- меньше TLB-промахов;
- меньше обходов таблиц;
- лучше масштабируемость под устройства с большим объёмом RAM.
Пример: чтобы отобразить 64 MB памяти
- при 4 KB страницах → 16 384 записи
- при 16 KB страницах → всего 4 096 записей.
Результаты тестов от Google#
Запуск приложений быстрее на 3,16% в среднем (до 30% для отдельных).
Энергопотребление при запуске ниже на 4,56%.
Камера стартует быстрее: +4,48% (hot start) и +6,60% (cold start).
Загрузка системы быстрее на 8% (~950 мс).
Какие минусы#
Внутренняя фрагментация: небольшой объект (например, 5 KB) занимает целую страницу 16 KB.
Но таблицы страниц уменьшаются в 4 раза, что компенсирует перерасход памяти.
- Подробнее от Google → Google: Support 16 KB page sizes
3. Flutter-часть: что нужно сделать Flutter-разработчикам#
❓ Почему это важно для разработки под Flutter#
Flutter-приложения почти всегда используют нативный код:
- сам Flutter engine написан на C/C++;
- плагины (ads, analytics, camera, ML и др.) содержат
.so
библиотеки; - собственный нативный код через FFI или C/C++ тоже требует пересборки.
Даже если у вас проект написан на чистом Dart, устаревший плагин может вызвать падение на устройствах с Android 15 (16 KB).
Поэтому вероятность несовместимости у Flutter-приложений очень высокая.
🛠 Как исправить проблему совместимости во Flutter#
1. Обновите инструменты#
- Flutter SDK → последняя стабильная (3.x)
- NDK → r28+
- Gradle → 8.14.3+
- AGP → 8.6+ (лучше 8.9.1)
- Target SDK → 36
flutter upgrade
flutter pub upgrade
2. Обновите зависимости#
- Проверьте все плагины в
pubspec.yaml
. - Обновите плагины с нативными
.so
(firebase, camera, ads, analytics, ML).
3. Пересоберите проект#
Обновлённые Flutter SDK, AGP и NDK автоматически пересоберут нативные библиотеки с 16 KB alignment.
4. Тестирование#
Эмулятор Android 15 (Device Manager → Kernel page size = 16 KB).
Физическое устройство (Pixel) → включить “Use 16 KB memory pages” в Developer Options.
Проверка:
adb shell getconf PAGE_SIZE
16384
→ устройство работает в 16 KB режиме.
5. Проверьте AAB перед публикацией#
unzip -q build/app/outputs/bundle/release/app-release.aab -d extracted_aab
find extracted_aab/base/lib -name "*.so" -exec sh -c '
for f; do
if readelf -lW "$f" | grep -q "0x4000"; then
echo "✅ $f 16KB совместимо"
else
echo "❌ $f только 4KB совместимо"
fi
done
' sh {} +
- ✅ Хорошо:
0x4000
(16 KB aligned) - ❌ Плохо:
0x1000
(4 KB aligned) → обновите зависимость и пересоберите.
✅ Чек-лист для Flutter-разработчиков#
- Flutter обновлён (последний stable release)
- NDK r28+
- Gradle 8.14.3+
- AGP 8.6+
- Target SDK 36
- Зависимости обновлены
- Протестировано на 16 KB эмуляторе/устройстве
- Проверено через скрипт с
readelf
- AAB загружен в Play Console без предупреждений
4. Итоги#
- Android 15 меняет стандарт страниц памяти: с 4 KB → 16 KB.
- Это ускоряет запуск приложений, камеры и систему, снижает энергопотребление.
- Минус — фрагментация, но она компенсируется меньшими таблицами страниц.
- Flutter-разработчики обязаны обновить SDK, NDK, AGP и все плагины.
- Проверка AAB и тесты на 16 KB — ключ к успешной публикации в Play Console.
FAQ#
Что будет, если не обновить приложение под 16 KB страницы в Android 15?
- Приложение может упасть при запуске на новых устройствах, а с 1 ноября 2025 года Google Play Console отклонит публикацию.
Коснутся ли изменения приложений без нативного кода?
- Если в проекте только Dart/Kotlin/Java и нет
.so
библиотек, приложение совместимо автоматически.
Как проверить совместимость Flutter-приложения?
- Создайте эмулятор Android 15 с Kernel page size = 16 KB. Если приложение запускается, значит совместимо.
Что означает предупреждение Play Console “The App isn’t 16KB compatible”?
- Это сигнал, что внутри AAB есть 64-битные
.so
библиотеки, собранные под 4 KB. Нужно пересобрать их с NDK r28+ и AGP 8.6+.