Перейти к содержимому
Обновления приложений

Целевой API 36 в Google Play: продление до 1 ноября 2026 года и переход для Expo, Flutter и React Native

Пропустили срок 31 августа? Разбираемся, что ещё даёт продление до 1 ноября 2026 года, и переводим Expo, Flutter или React Native на API 36, не сломав навигацию «назад» и вёрстку.

Коротко

Требование target API level 36 означает, что с 31 августа 2026 года все новые приложения и обновления, отправляемые в Google Play, должны быть нацелены на Android 16 (API 36). Разработчики, чьи приложения получили предупреждение о нарушении правил, могли запросить продление до 1 ноября 2026 года на странице «Статус правил» (Policy status). После окончания продления Play блокирует обновления, пока вы не загрузите сборку с targetSdk 36. Expo SDK 54+, Flutter 3.38+ и React Native 0.81+ по умолчанию нацелены на API 36.

Главное
  • С 31 августа 2026 года новые приложения и обновления в Google Play должны быть нацелены на Android 16 (API level 36). Для Wear OS и Automotive нужен API 35, для Android TV и XR — API 34.
  • Продление действует только до 1 ноября 2026 года. Ссылку на форму несоответствующие требованиям приложения получают через уведомления Play Console и на странице предупреждения в разделе Policy status.
  • Если существующее приложение для телефона нацелено на API 35 или выше, оно остаётся доступным для новых пользователей. Пропущенный срок останавливает ваши обновления, а не текущую страницу в магазине.
  • Expo SDK 54 (React Native 0.81) и Flutter 3.38 по умолчанию нацелены на API 36. Обновить фреймворк обычно надёжнее, чем вручную править число.
  • Когда приложение нацелено на API 36, Android больше не вызывает onBackPressed и игнорирует блокировку ориентации на экранах шириной от 600dp. Проверьте навигацию «назад» и вёрстку на планшетах до загрузки.
API 36 или никаких обновлений

Требование target API level 36 в Google Play означает, что релиз, собранный под версию ниже Android 16, выпустить нельзя. По состоянию на октябрь 2026 года Play отклоняет каждое новое приложение и каждое обновление с более низким целевым уровнем — часто с сообщением Target SDK of artifact is too low. Приложения, получившие предупреждение о нарушении правил, могли попросить отсрочку, но продление заканчивается 1 ноября 2026 года. В этом руководстве разберём, что ещё даёт продление, как перевести Expo, Flutter и React Native на API 36 и что обычно ломается после перехода.

Что на самом деле блокирует требование target API level 36?

Оно блокирует отправку сборок. С 31 августа 2026 года нельзя загрузить новое приложение для телефона или обновление, если оно не нацелено на API 36. Уже опубликованные приложения, нацеленные на API 35 или выше, остаются полностью доступными, в том числе для новых пользователей.

Согласно требованиям Google к целевому уровню API, «новые приложения и обновления приложений должны быть нацелены на Android 16 (API level 36) или выше, чтобы их можно было отправить в Google Play». Требования различаются в зависимости от типа устройства, а единственное полное исключение — постоянно закрытые приложения для внутреннего распространения в одной организации.

Тип устройстваНовые приложения и обновления (с 31 авг. 2026)Существующие приложения остаются полностью доступными, если нацелены на
Телефон, планшет, Android AutoAPI 36API 35 или выше
Wear OSAPI 35API 34 или выше
Android Automotive OSAPI 35API 32 или выше
Android TVAPI 34API 33 или выше
Android XRAPI 34API 34 или выше

Существующее приложение ниже этих уровней «будет доступно только на устройствах с версией Android, равной целевому уровню API вашего приложения или ниже». Те, кто уже установил его, продолжают пользоваться им как раньше. А вот человек с более новым телефоном увидит сообщение, что приложение «создано для более старой версии Android».

Можно ли ещё получить продление до 1 ноября 2026 года?

Только если Play отправил вашему приложению предупреждение и форма запроса в нём всё ещё отображается. Но даже тогда продление действует не дольше 1 ноября 2026 года, так что это несколько дополнительных дней на почти готовое исправление, а не новый план.

Google сообщает, что отправляет затронутым приложениям «ссылку на форму запроса продления через уведомления» и что форма «доступна на странице сведений о предупреждении или проблеме в разделе Policy status». Приложениям, которые уже соответствуют требованиям, Google форму не показывает.

  1. Откройте Play Console и выберите приложение.
  2. Найдите во входящих (Inbox) или в уведомлениях сообщение о целевом уровне API. Если оно есть, перейдите по ссылке из него.
  3. Если нет, откройте Policy status, найдите предупреждение или проблему о целевом уровне API и поищите форму запроса продления на странице сведений.
  4. Заполните форму для каждого затронутого приложения. У каждого приложения своё предупреждение.
  5. Независимо от того, одобрят ли продление, планируйте загрузить сборку с API 36 до 1 ноября 2026 года. После этой даты для обновлений нужен API 36.

Как перевести Expo, Flutter и React Native на API 36?

Самый чистый путь — обновиться до версии фреймворка, которая уже нацелена на API 36: Expo SDK 54, React Native 0.81 или Flutter 3.38. Если обновиться пока нельзя, число можно поднять вручную, но тогда изменения поведения Android 16 тоже придётся обрабатывать самостоятельно.

СтекНацелен на API 36 по умолчанию начиная сГде задаётся числоРучной путь, если обновиться нельзя
Expo (managed / CNG)SDK 54 (React Native 0.81)Генерируется при prebuild; переопределяется через expo-build-propertiestargetSdkVersion: 36 и compileSdkVersion: 36 в плагине expo-build-properties
React Native (bare)0.81android/build.gradleУстановить compileSdk и targetSdk в 36, затем отключить predictive back в манифесте
Flutter3.38 (flutter.targetSdkVersion = 36)android/app/build.gradle(.kts)Заменить жёстко заданное 35 на 36 или на flutter.targetSdkVersion

Expo. В списке изменений SDK 54 сказано, что SDK 54 и React Native 0.81 «теперь нацелены на Android 16». Обновитесь командой npx expo install expo@^54.0.0 --fix, запустите npx expo-doctor@latest, а если используете Continuous Native Generation — «удалите каталоги android и ios, если вы сгенерировали их для предыдущей версии SDK». На SDK 53 можно попробовать задать targetSdkVersion: 36 через плагин expo-build-properties, но React Native 0.79 всё ещё обрабатывает «назад» через onBackPressed, поэтому прочитайте следующий раздел, прежде чем выпускать такую сборку.

Flutter. В примечаниях к выпуску Flutter 3.38 значения по умолчанию указаны как flutter.compileSdkVersion (API 36) и flutter.targetSdkVersion (API 36), и разработчиков «настоятельно призывают использовать в файлах сборки переменные уровней API, предоставляемые Flutter SDK». Версии 3.38 также нужен как минимум Java 17. Если в модуле приложения жёстко прописано targetSdk = 35, обновление Flutter его не изменит, так что проверьте файл.

Bare React Native. Установите compileSdkVersion и targetSdkVersion в 36 в android/build.gradle. На версии 0.81 и новее этого в основном достаточно. На более старых версиях также добавьте android:enableOnBackInvokedCallback="false" в <application> в AndroidManifest.xml. Без этого аппаратная кнопка «назад» и жест «назад» обходят вашу навигацию на JavaScript.

Что ломается, когда приложение начинает нацеливаться на Android 16?

Чаще всего ломаются навигация «назад» и вёрстка на больших экранах. При целевом API 36 Android перестаёт вызывать onBackPressed, не позволяет отказаться от режима edge-to-edge и игнорирует блокировки ориентации и изменения размера на дисплеях шириной от 600dp.

Изменения, наиболее важные для кроссплатформенных приложений, из документа Google об изменениях поведения в Android 16:

  • Predictive back: «onBackPressed не вызывается, а KeyEvent.KEYCODE_BACK больше не отправляется». Установка android:enableOnBackInvokedCallback="false" — временный способ отказаться от нового поведения.
  • Edge-to-edge: windowOptOutEdgeToEdgeEnforcement «устарел и отключён», поэтому заголовок или нижняя кнопка могут оказаться под строкой состояния или панелью жестов.
  • Большие экраны: на дисплеях шириной от 600dp screenOrientation, resizableActivity и ограничения соотношения сторон игнорируются, из-за чего вёрстка только для портретной ориентации может растянуться. Игры — исключение. PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY — временный способ отказа, который «не будет действовать при нацеливании на API level 37».
  • Текст: elegantTextHeight игнорируется, что может изменить высоту строк для арабского, тайского, тамильского и ряда других письменностей.
  • Датчики здоровья: BODY_SENSORS заменяется детализированными разрешениями для данных о здоровье, например READ_HEART_RATE.

С чем столкнулись другие разработчики при переходе на API 36?

Публичные отчёты пока показывают два типа проблем: поведение кнопки «назад», которое меняется без каких-либо ошибок, и библиотеки, из-за которых целевой уровень в бандле, получаемом Play, отличается от указанного в файлах проекта.

Audius (React Native 0.79). В pull request #14635 команда Audius пишет, что Google Play дважды отклонил загрузку Android-версии 1.5.186 с ошибкой Target SDK of artifact is too low. Они подняли compileSdk и targetSdk с 35 до 36, установили build tools 36.0.0 и добавили android.suppressUnsupportedCompileSdk=36, потому что «RN 0.79 фиксирует AGP 8.8». Они также задали enableOnBackInvokedCallback="false", поскольку без этого «назад» «обходило бы React Navigation». В более позднем PR этот отказ убрали после перехода на React Native 0.81, который сам регистрирует OnBackPressedCallback.

Приложение на Flutter 3.35.2. В issue Flutter #174516 разработчик указал targetSdk 36 в Gradle и в манифесте, но Play Console всё равно сообщал: «Your bundle targets SDK 34, but uses a Play Core library that cannot be used with that version». Удаление старой библиотеки com.google.android.play:core:1.10.3 привело к ошибкам R8 «Missing classes». Их исправление привело к сообщению «You can't rollout this release because it doesn't allow any existing users to upgrade to the newly added app bundles». В итоге бандл приняли после добавления правил keep для ProGuard, явного указания minSdk и отключения разделения по языкам, плотности экрана и ABI — ценой увеличения размера загрузки.

Общий вывод: изменить число в Gradle недостаточно. Audius пришлось исправлять поведение во время выполнения, а разработчику на Flutter — зависимость, которая меняла то, что Play считывал из бандла. Проверяйте собранный артефакт и тестируйте на устройстве с Android 16, а не только файл конфигурации.

Как проверить сборку с API 36 перед загрузкой?

Считайте целевой уровень из самого релизного бандла, затем выложите его на трек внутреннего или закрытого тестирования и проверьте на Android 16 навигацию «назад», отступы (insets) и вёрстку на планшете. Отклонение или баг в продакшене обойдутся гораздо дороже по времени, чем эти проверки.

Практический пример: приложение на Expo SDK 53, нацеленное на API 35, которому нужно ещё одно обновление.

  1. Выполните npx expo install expo@^54.0.0 --fix, затем npx expo-doctor@latest и исправьте всё, о чём он сообщит.
  2. Если проект использует Continuous Native Generation, удалите старые папки android и ios и соберите заново. В противном случае внесите нативные изменения для обновления вручную.
  3. Соберите релизный AAB, например командой eas build -p android --profile production.
  4. Проверьте целевой уровень командой bundletool dump manifest --bundle app.aab --xpath /manifest/uses-sdk/@android:targetSdkVersion. Она должна вывести 36.
  5. Загрузите сборку во внутреннее тестирование. На телефоне с Android 16 нажмите «назад» на каждом вложенном экране, убедитесь, что заголовки и нижние кнопки не скрыты под системными панелями, и поверните планшет или эмулятор с изменяемым размером.
  6. Переведите сборку в продакшен с примечаниями к выпуску, в которых упомянуты исправления для Android 16.

Чтобы ускорить тестирование, воспользуйтесь настройкой тестировщиков из нашего руководства по закрытому тестированию в Google Play, а формулировки для текста обновления возьмите из наших примеров примечаний к выпуску. Если хотите передать релиз нам, наша услуга по публикации в App Store охватывает Play Console и App Store Connect за $599 для обоих магазинов. Сборы за аккаунты разработчика оплачиваются отдельно.

Частые вопросы

Что будет, если я пропущу продление целевого уровня API до 1 ноября 2026 года?

Текущая страница приложения в магазине останется. Приложение для телефона, нацеленное на API 35 или выше, по-прежнему доступно существующим и новым пользователям. Play Console будет отклонять любой новый релиз, включая срочные исправления ошибок, пока бандл не будет нацелен на Android 16 (API 36). Приложения ниже API 35 можно установить только на устройства с соответствующей или более старой версией Android.

Нужно ли приложениям для Wear OS и Android TV нацеливаться на API 36?

Нет. По состоянию на октябрь 2026 года новые приложения и обновления для Wear OS и Android Automotive OS должны быть нацелены на API 35, а приложения для Android TV и Android XR — на API 34. API 36 нужен только приложениям для телефонов, планшетов и Android Auto. Единственное полное исключение — постоянно закрытое приложение, распространяемое внутри одной организации.

Можно ли нацелиться на API 36, не обновляя Expo SDK?

На SDK 53 можно установить targetSdkVersion и compileSdkVersion в 36 в плагине expo-build-properties, и некоторые разработчики так и сделали. Однако React Native 0.79, который используется в SDK 53, по-прежнему передаёт нажатия «назад» через onBackPressed, а Android 16 при API 36 его больше не вызывает. Придётся отказаться от нового поведения, установив enableOnBackInvokedCallback в false. Поддерживаемый путь — обновление до SDK 54.

Чем compileSdkVersion отличается от targetSdkVersion?

compileSdkVersion — это версия Android API, с которой компилируется ваш код. targetSdkVersion сообщает Android, поведение какой версии приняло ваше приложение, и именно её проверяет Google Play. compileSdk должен быть равен targetSdk или выше, поэтому переход на target 36 означает компиляцию с API 36 или новее. Например, Expo SDK 58 компилирует с 37, а нацелен на 36.

Почему Play Console всё ещё показывает старый целевой уровень API после того, как я изменил build.gradle?

Play считывает целевой уровень из загружаемого бандла, а не из исходных файлов. Жёстко заданное значение в другом модуле, устаревший плагин или библиотека вроде старого Play Core могут изменить итоговый объединённый манифест. Запустите bundletool dump manifest для релизного AAB, чтобы увидеть фактический targetSdkVersion, и убедитесь, что загрузили новую сборку, а не старый артефакт.

Источники и что почитать

Правила меняются. Перед отправкой сверьтесь с официальной документацией.

Приходите со сборкой. Или с идеей.

Давайте доведём ваше приложение до релиза.

Предметный созвон, чтобы понять, что отделяет ваше приложение от публикации в сторе.

Записаться на созвон ↗