Как и предыдущие выпуски, Android 16 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения поведения применяются исключительно к приложениям, предназначенным для Android 16 или более поздней версии. Если ваше приложение ориентировано на Android 16 или более поздней версии, вам следует изменить его так, чтобы оно поддерживало такое поведение, если это применимо.
Обязательно ознакомьтесь также со списком изменений поведения, которые влияют на все приложения, работающие на Android 16, независимо от targetSdkVersion
вашего приложения.
Пользовательский опыт и системный интерфейс
Android 16 (уровень API 36) включает следующие изменения, призванные создать более последовательный и интуитивно понятный пользовательский интерфейс.
Отключение от края до края прекращается
Android 15 обеспечивает сквозную поддержку приложений, ориентированных на Android 15 (уровень API 35), но ваше приложение может отказаться, установив для R.attr#windowOptOutEdgeToEdgeEnforcement
значение true
. Для приложений, предназначенных для Android 16 (уровень API 36), R.attr#windowOptOutEdgeToEdgeEnforcement
устарел и отключен, и ваше приложение не может отказаться от перехода от края к краю.
- Если ваше приложение предназначено для Android 16 (уровень API 36) и работает на устройстве Android 15,
R.attr#windowOptOutEdgeToEdgeEnforcement
продолжает работать. - Если ваше приложение предназначено для Android 16 (уровень API 36) и работает на устройстве Android 16,
R.attr#windowOptOutEdgeToEdgeEnforcement
отключен.
Для тестирования в Android 16 Beta 3 убедитесь, что ваше приложение поддерживает сквозную технологию, и удалите любое использование R.attr#windowOptOutEdgeToEdgeEnforcement
, чтобы ваше приложение также поддерживало сквозную обработку на устройстве Android 15. Чтобы обеспечить сквозную поддержку, см. руководство по созданию и представлениям .
Android 15 обеспечивает сквозную поддержку приложений, ориентированных на Android 15 (уровень API 35), но ваше приложение может отказаться, установив для R.attr#windowOptOutEdgeToEdgeEnforcement
значение true
. Для приложений, предназначенных для Android 16 (уровень API 36), R.attr#windowOptOutEdgeToEdgeEnforcement
устарел и отключен, и ваше приложение не может отказаться от перехода от края к краю.
- Если ваше приложение предназначено для Android 16 (уровень API 36) и работает на устройстве Android 15,
R.attr#windowOptOutEdgeToEdgeEnforcement
продолжает работать. - Если ваше приложение предназначено для Android 16 (уровень API 36) и работает на устройстве Android 16,
R.attr#windowOptOutEdgeToEdgeEnforcement
отключен.
Для тестирования в Android 16 Beta 3 убедитесь, что ваше приложение поддерживает сквозную технологию, и удалите любое использование R.attr#windowOptOutEdgeToEdgeEnforcement
, чтобы ваше приложение также поддерживало сквозную обработку на устройстве Android 15. Чтобы обеспечить сквозную поддержку, см. руководство по созданию и представлениям .
Android 15 обеспечивает сквозную поддержку приложений, ориентированных на Android 15 (уровень API 35), но ваше приложение может отказаться, установив для R.attr#windowOptOutEdgeToEdgeEnforcement
значение true
. Для приложений, предназначенных для Android 16 (уровень API 36), R.attr#windowOptOutEdgeToEdgeEnforcement
устарел и отключен, и ваше приложение не может отказаться от перехода от края к краю.
- Если ваше приложение предназначено для Android 16 (уровень API 36) и работает на устройстве Android 15,
R.attr#windowOptOutEdgeToEdgeEnforcement
продолжает работать. - Если ваше приложение предназначено для Android 16 (уровень API 36) и работает на устройстве Android 16,
R.attr#windowOptOutEdgeToEdgeEnforcement
отключен.
Для тестирования в Android 16 Beta 3 убедитесь, что ваше приложение поддерживает сквозную технологию, и удалите любое использование R.attr#windowOptOutEdgeToEdgeEnforcement
, чтобы ваше приложение также поддерживало сквозную обработку на устройстве Android 15. Чтобы обеспечить сквозную поддержку, см. руководство по созданию и представлениям .
Для прогнозного возврата требуется миграция или отказ
Для приложений, ориентированных на Android 16 (уровень API 36) или более поздней версии и работающих на устройстве Android 16 или более поздней версии, анимация системы прогнозирования (возврат домой, перекрестная задача и перекрестная активность) включена по умолчанию. Кроме того, onBackPressed
не вызывается и KeyEvent.KEYCODE_BACK
больше не отправляется.
Если ваше приложение перехватывает обратное событие и вы еще не перешли на предиктивную обратную навигацию, обновите свое приложение, чтобы оно использовало поддерживаемые API обратной навигации . или временно отказаться, установив для атрибута android:enableOnBackInvokedCallback
значение false
в теге <application>
или <activity>
файла AndroidManifest.xml
вашего приложения.
API-интерфейсы элегантных шрифтов устарели и отключены.
Apps targeting Android 15 (API level 35) have the
elegantTextHeight
TextView
attribute set to true
by
default, replacing the compact font with one that is much more readable. You
could override this by setting the elegantTextHeight
attribute to false
.
Android 16 deprecates the
elegantTextHeight
attribute,
and the attribute will be ignored once your app targets Android 16. The "UI
fonts" controlled by these APIs are being discontinued, so you should adapt any
layouts to ensure consistent and future proof text rendering in Arabic, Lao,
Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai.

elegantTextHeight
behavior for apps targeting Android
14 (API level 34) and lower, or for apps targeting Android 15 (API level 35)
that overrode the default by setting the elegantTextHeight
attribute to false
.
elegantTextHeight
behavior for apps targeting Android
16, or for apps targeting Android 15 (API level 35) that didn't override the
default by setting the elegantTextHeight
attribute to
false
.Основная функциональность
Android 16 (уровень API 36) включает следующие изменения, которые изменяют или расширяют различные основные возможности системы Android.
Оптимизация планирования работы с фиксированной ставкой
До ориентации на Android 16, когда scheduleAtFixedRate
пропускало выполнение задачи из-за того, что оно находилось за пределами допустимого жизненного цикла процесса , все пропущенные выполнения выполнялись немедленно, когда приложение возвращалось к допустимому жизненному циклу.
При настройке Android 16 не более одного пропущенного выполнения scheduleAtFixedRate
выполняется немедленно, когда приложение возвращается к допустимому жизненному циклу. Ожидается, что это изменение поведения улучшит производительность приложения. Проверьте это поведение в своем приложении, чтобы проверить, не затронуто ли оно ваше приложение. Вы также можете протестировать, используя платформу совместимости приложений и включив флаг совместимости STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS
.
Форм-факторы устройств
Android 16 (уровень API 36) включает следующие изменения для приложений, отображаемых на устройствах с большим экраном.
Адаптивные макеты
With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.
Ignore orientation, resizability, and aspect ratio restrictions
For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.
This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.
You can also test this behavior by using the
app compatibility framework and
enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT
compat flag.
Common breaking changes
Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.
Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.
Implementation details
The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:
screenOrientation
resizableActivity
minAspectRatio
maxAspectRatio
setRequestedOrientation()
getRequestedOrientation()
The following values for screenOrientation
, setRequestedOrientation()
, and
getRequestedOrientation()
are ignored:
portrait
reversePortrait
sensorPortrait
userPortrait
landscape
reverseLandscape
sensorLandscape
userLandscape
Regarding display resizability, android:resizeableActivity="false"
,
android:minAspectRatio
, and android:maxAspectRatio
have no effect.
For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).
Exceptions
The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:
- Games (based on the
android:appCategory
flag) - Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
- Screens that are smaller than
sw600dp
Opt out temporarily
To opt out a specific activity, declare the
PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
manifest property:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
Здоровье и фитнес
Android 16 (уровень API 36) включает следующие изменения, связанные с данными о здоровье и фитнесе.
Разрешения для здоровья и фитнеса
对于以 Android 16(API 级别 36)或更高版本为目标平台的应用,BODY_SENSORS
权限即将过渡到 android.permissions.health
下的精细权限,这些权限也会被 Health Connect 使用。凡是以前需要具有 BODY_SENSORS
或 BODY_SENSORS_BACKGROUND
权限的 API,现在都需要获取相应的 android.permissions.health
权限。这会影响以下数据类型、API 和前台服务类型:
- 来自 Wear 健康服务的
HEART_RATE_BPM
- Android Sensor Manager 中的
Sensor.TYPE_HEART_RATE
- Wear
ProtoLayout
中的heartRateAccuracy
和heartRateBpm
FOREGROUND_SERVICE_TYPE_HEALTH
,其中需要使用相应的android.permission.health
权限来替代BODY_SENSORS
如果您的应用使用这些 API,则现在应请求相应的精细权限:
- 如需在使用期间监测心率、血氧饱和度或体表温度:请请求
android.permissions.health
下的精细权限,例如READ_HEART_RATE
,而不是BODY_SENSORS
。 - 对于后台传感器访问权限:请求
READ_HEALTH_DATA_IN_BACKGROUND
,而不是BODY_SENSORS_BACKGROUND
。
这些权限与用于保护对 Health Connect(用于存储健康、健身和身心健康数据的 Android 数据存储区)读取数据的权限相同。
移动应用
迁移到使用 READ_HEART_RATE
和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。这与 Health Connect 的要求相同。
Возможности подключения
Android 16 (уровень API 36) включает следующие изменения в стеке Bluetooth для улучшения связи с периферийными устройствами.
Новые намерения справиться с потерями облигаций и изменениями в шифровании
В рамках улучшенной обработки потерь по облигациям в Android 16 также представлены две новые функции, позволяющие приложениям лучше понимать потери по облигациям и изменения в шифровании.
Приложения, ориентированные на Android 16, теперь могут:
- Получать намерение
ACTION_KEY_MISSING
при обнаружении удаленной потери связи, что позволяет им предоставлять более информативную обратную связь с пользователем и предпринимать соответствующие действия. - Получайте намерение
ACTION_ENCRYPTION_CHANGE
при каждом изменении статуса шифрования ссылки. Сюда входит изменение статуса шифрования, изменение алгоритма шифрования и изменение размера ключа шифрования. Приложения должны считать связь восстановленной, если ссылка успешно зашифрована после получения намеренияACTION_ENCRYPTION_CHANGE
позже.
Если ваше приложение в настоящее время использует специальные механизмы обработки потерь по облигациям, перейдите на новое намерение ACTION_KEY_MISSING
для обнаружения и управления событиями потери по облигациям. Мы рекомендуем, чтобы ваше приложение помогало пользователю убедиться, что удаленное устройство находится в зоне действия, прежде чем начинать забывание устройства и повторное сопряжение.
Более того, если устройство отключается после получения намерения ACTION_KEY_MISSING
, вашему приложению следует помнить о повторном подключении к устройству, поскольку это устройство больше не может быть связано с системой.
В рамках улучшенной обработки потерь по облигациям в Android 16 также представлены две новые функции, позволяющие приложениям лучше понимать потери по облигациям и изменения в шифровании.
Приложения, ориентированные на Android 16, теперь могут:
- Получать намерение
ACTION_KEY_MISSING
при обнаружении удаленной потери связи, что позволяет им предоставлять более информативную обратную связь с пользователем и предпринимать соответствующие действия. - Получайте намерение
ACTION_ENCRYPTION_CHANGE
при каждом изменении статуса шифрования ссылки. Сюда входит изменение статуса шифрования, изменение алгоритма шифрования и изменение размера ключа шифрования. Приложения должны считать связь восстановленной, если ссылка успешно зашифрована после получения намеренияACTION_ENCRYPTION_CHANGE
позже.
Если ваше приложение в настоящее время использует специальные механизмы обработки потерь по облигациям, перейдите на новое намерение ACTION_KEY_MISSING
для обнаружения и управления событиями потери по облигациям. Мы рекомендуем, чтобы ваше приложение помогало пользователю убедиться, что удаленное устройство находится в зоне действия, прежде чем начинать забывание устройства и повторное сопряжение.
Более того, если устройство отключается после получения намерения ACTION_KEY_MISSING
, вашему приложению следует помнить о повторном подключении к устройству, поскольку это устройство больше не может быть связано с системой.
В рамках улучшенной обработки потерь по облигациям в Android 16 также представлены две новые функции, позволяющие приложениям лучше понимать потери по облигациям и изменения в шифровании.
Приложения, ориентированные на Android 16, теперь могут:
- Получать намерение
ACTION_KEY_MISSING
при обнаружении удаленной потери связи, что позволяет им предоставлять более информативную обратную связь с пользователем и предпринимать соответствующие действия. - Получайте намерение
ACTION_ENCRYPTION_CHANGE
при каждом изменении статуса шифрования ссылки. Сюда входит изменение статуса шифрования, изменение алгоритма шифрования и изменение размера ключа шифрования. Приложения должны считать связь восстановленной, если ссылка успешно зашифрована после получения намеренияACTION_ENCRYPTION_CHANGE
позже.
Если ваше приложение в настоящее время использует специальные механизмы обработки потерь по облигациям, перейдите на новое намерение ACTION_KEY_MISSING
для обнаружения и управления событиями потери по облигациям. Мы рекомендуем, чтобы ваше приложение помогало пользователю убедиться, что удаленное устройство находится в зоне действия, прежде чем начинать забывание устройства и повторное сопряжение.
Более того, если устройство отключается после получения намерения ACTION_KEY_MISSING
, вашему приложению следует помнить о повторном подключении к устройству, поскольку это устройство больше не может быть связано с системой.
В рамках улучшенной обработки потерь по облигациям в Android 16 также представлены две новые функции, позволяющие приложениям лучше понимать потери по облигациям и изменения в шифровании.
Приложения, ориентированные на Android 16, теперь могут:
- Получать намерение
ACTION_KEY_MISSING
при обнаружении удаленной потери связи, что позволяет им предоставлять более информативную обратную связь с пользователем и предпринимать соответствующие действия. - Получайте намерение
ACTION_ENCRYPTION_CHANGE
при каждом изменении статуса шифрования ссылки. Сюда входит изменение статуса шифрования, изменение алгоритма шифрования и изменение размера ключа шифрования. Приложения должны считать связь восстановленной, если ссылка успешно зашифрована после получения намеренияACTION_ENCRYPTION_CHANGE
позже.
Если ваше приложение в настоящее время использует специальные механизмы обработки потерь по облигациям, перейдите на новое намерение ACTION_KEY_MISSING
для обнаружения и управления событиями потери по облигациям. Мы рекомендуем, чтобы ваше приложение помогало пользователю убедиться, что удаленное устройство находится в зоне действия, прежде чем начинать забывание устройства и повторное сопряжение.
Более того, если устройство отключается после получения намерения ACTION_KEY_MISSING
, вашему приложению следует помнить о повторном подключении к устройству, поскольку это устройство больше не может быть связано с системой.
Безопасность
Android 16 (уровень API 36) включает следующие изменения безопасности.
Блокировка версии MediaStore
For apps targeting Android 16 or higher, MediaStore#getVersion()
will now
be unique to each app. This eliminates identifying properties from the version
string to prevent abuse and usage for fingerprinting techniques. Apps shouldn't
make any assumptions around the format of this version. Apps should already
handle version changes when using this API and in most cases shouldn't need to
change their current behavior, unless the developer has attempted to infer
additional information that is beyond the intended scope of this API.
Конфиденциальность
Android 16 (уровень API 36) включает следующие изменения конфиденциальности.
Разрешение локальной сети
Доступ к устройствам в локальной сети может получить любое приложение, имеющее разрешение INTERNET
. Это упрощает подключение приложений к локальным устройствам, но также имеет последствия для конфиденциальности, такие как формирование отпечатка пальца пользователя и использование прокси-сервера для определения местоположения.
Проект «Защита локальной сети» направлен на защиту конфиденциальности пользователя путем ограничения доступа к локальной сети с помощью нового разрешения во время выполнения.
План выпуска
Это изменение будет внедрено между двумя выпусками: 25Q2 и TBD соответственно. Крайне важно, чтобы разработчики следовали этому руководству для второго квартала 25 и делились отзывами, поскольку эти меры защиты будут реализованы в более поздней версии Android . Более того, им потребуется обновить сценарии, которые зависят от неявного доступа к локальной сети, используя следующие рекомендации, и подготовиться к отклонению пользователем и отзыву нового разрешения.
Влияние
На текущем этапе LNP — это функция по согласию, что означает, что будут затронуты только те приложения, которые согласились. Цель этапа согласия — дать разработчикам приложений понять, какие части их приложения зависят от неявного доступа к локальной сети, чтобы они могли подготовиться к защите разрешений для следующего выпуска.
Приложения будут затронуты, если они получат доступ к локальной сети пользователя, используя:
- Прямое или библиотечное использование необработанных сокетов на адресах локальной сети (например, протокол обнаружения службы mDNS или SSDP).
- Использование классов уровня платформы, имеющих доступ к локальной сети (например, NsdManager).
Для входящего и исходящего трафика по локальному сетевому адресу требуется разрешение на доступ к локальной сети. В следующей таблице перечислены некоторые распространенные случаи:
Низкоуровневая работа приложения в сети | Требуется разрешение локальной сети |
---|---|
Создание исходящего TCP-соединения | да |
Прием входящих TCP-соединений | да |
Отправка UDP одноадресной, многоадресной, широковещательной рассылки | да |
Получение входящего одноадресного, многоадресного или широковещательного сообщения UDP | да |
Эти ограничения реализованы глубоко в сетевом стеке и, следовательно, применимы ко всем сетевым API . Сюда входят сокеты, созданные в собственном или управляемом коде, сетевые библиотеки, такие как Cronet и OkHttp, а также любые API, реализованные поверх них. Попытка разрешить службы в локальной сети (т. е. службы с суффиксом .local) потребует разрешения локальной сети.
Исключения из правил выше:
- Если DNS-сервер устройства находится в локальной сети, входящий или исходящий от него трафик (через порт 53) не требует разрешения на доступ к локальной сети.
- Приложениям, использующим переключатель вывода в качестве средства выбора внутри приложения, не потребуются разрешения локальной сети (дополнительные рекомендации появятся в четвертом квартале 2025 года).
Руководство для разработчиков (согласие)
Чтобы включить ограничения локальной сети, выполните следующие действия:
- Перепрограммируйте устройство на сборку 25Q2 Beta 3 или новее.
- Установите приложение для тестирования.
Переключите флаг Appcompat в adb:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
Перезагрузите устройство
Теперь доступ вашего приложения к локальной сети ограничен, и любая попытка доступа к локальной сети приведет к ошибкам сокета. Если вы используете API, которые выполняют операции в локальной сети вне процесса вашего приложения (например, NsdManager), на этапе согласия на них это не повлияет.
Чтобы восстановить доступ, вы должны предоставить своему приложению разрешение NEARBY_WIFI_DEVICES
.
- Убедитесь, что приложение декларирует разрешение
NEARBY_WIFI_DEVICES
в своем манифесте. - Откройте «Настройки» > «Приложения» > [Имя приложения] > «Разрешения» > «Устройства поблизости» > «Разрешить» .
Теперь доступ вашего приложения к локальной сети должен быть восстановлен, и все ваши сценарии должны работать так же, как и до включения приложения.
Как только начнется принудительное применение защиты локальной сети, это повлияет на сетевой трафик приложений.
Разрешение | Исходящий запрос локальной сети | Исходящий/входящий интернет-запрос | Входящий запрос локальной сети |
---|---|---|---|
Предоставленный | Работает | Работает | Работает |
Не предоставлено | Не удалось | Работает | Не удалось |
Используйте следующую команду, чтобы отключить флаг App-Compat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Ошибки
Ошибки, возникающие из-за этих ограничений, будут возвращаться в вызывающий сокет всякий раз, когда он вызывает отправку или вариант отправки на адрес локальной сети.
Примеры ошибок:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
Определение локальной сети
Под локальной сетью в этом проекте понимается IP-сеть, которая использует сетевой интерфейс с возможностью широковещательной передачи, такой как Wi-Fi или Ethernet, но исключает сотовые (WWAN) или VPN-соединения.
Локальными сетями считаются:
IPv4:
- 169.254.0.0/16 // Локальная ссылка
- 100.64.0.0/10 // ЦГНАТ
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- Ссылка-локальная
- Маршруты с прямым соединением
- Сети-заглушки, такие как Thread
- Несколько подсетей (TBD)
Кроме того, как многоадресные адреса (224.0.0.0/4, ff00::/8), так и широковещательный адрес IPv4 (255.255.255.255) классифицируются как адреса локальной сети.