# Android 15 и 16 KB страница памяти: что изменится, как подготовить Android и Flutter-приложения

> Android 15 ввел поддержку 16KB memory pages. Разбираем, что это значит для нативных и Flutter-приложений, как избежать ошибок Play Console и что обновить.

- **URL:** https://eagle2000.space/about-all/android-16k/
- **Date:** 2025-09-25

- **Tags:** android, flutter, dev

---
## Введение

С выходом **Android 15** Google изменил фундаментальный принцип управления памятью: вместо фиксированных **4 KB страниц** операционная система теперь поддерживает **16 KB memory pages**.

Этот переход улучшает производительность и экономию энергии, но в то же время требует пересборки приложений, особенно тех, которые используют нативный код (NDK, C/C++, Flutter engine или плагины).

{{< alert >}}
 **С 1 ноября 2025 года Google Play Console будет отклонять приложения без поддержки 16 KB страниц.**
{{< /alert >}}


Если хотите сразу перейти к описанию как обновить flutter проект - переходите к части: [Flutter-часть: что нужно сделать Flutter-разработчикам](#3-flutter-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D1%87%D1%82%D0%BE-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-flutter-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC)

## 1. Ключевые термины: MMU, Memory Page, Page Fault, Page Table, TLB

> Постараюсь привести объяснение терминов которые встретятся далее в статьею Чтобы легче было запоминать - приведу аналогию с городской библиотекой. Если вам не интересно читать описание терминов - можете переходить к следующей части: [Почему Google вводит 16 KB memory pages.](#2-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-google-%D0%B2%D0%B2%D0%BE%D0%B4%D0%B8%D1%82-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.

Но современные устройства имеют десятки гигабайт памяти и многоядерные процессоры. В этих условиях миллионы маленьких страниц стали создавать избыточные накладные расходы:
- больше записей в [таблицах страниц](#%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86-page-table);
- больше промахов в [TLB](#tlb-translation-lookaside-buffer);
- больше обходов [таблиц страниц](#%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86-page-table).

---

### Что изменилось в 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](https://developer.android.com/guide/practices/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

```bash
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.
- Проверка:
    ```bash
    adb shell getconf PAGE_SIZE
    ```
    
    `16384` → устройство работает в 16 KB режиме.
    

---

#### 5. Проверьте AAB перед публикацией

```bash
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) → обновите зависимость и пересоберите.

---


### Ссылка на Github Gist с настройками для поддержки проекта Android 16K

https://gist.github.com/eaglebk/8868cc96cf11e4ce98921449ead78bfd


---


### ✅ Чек-лист для 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+.

