Изменения в поведении: приложения для Android 16 или более поздней версии.

Как и предыдущие выпуски, 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-интерфейсы элегантных шрифтов устарели и отключены.

В приложениях, предназначенных для Android 15 (уровень API 35), атрибуту elegantTextHeight TextView по умолчанию присвоено значение true , заменяя компактный шрифт гораздо более читаемым. Вы можете переопределить это, установив для атрибута elegantTextHeight значение false .

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

поведение elegantTextHeight для приложений, ориентированных на Android 14 (уровень API 34) и ниже, или для приложений, ориентированных на Android 15 (уровень API 35), которые переопределили значение по умолчанию, установив для атрибута elegantTextHeight значение false .
поведение elegantTextHeight для приложений, ориентированных на Android 16, или для приложений, ориентированных на Android 15 (уровень API 35), которые не переопределили значение по умолчанию, установив для атрибута elegantTextHeight значение false .

Основная функциональность

Android 16 (уровень API 36) включает следующие изменения, которые изменяют или расширяют различные основные возможности системы Android.

Оптимизация планирования работы с фиксированной ставкой

До ориентации на Android 16, когда scheduleAtFixedRate пропускало выполнение задачи из-за того, что оно находилось за пределами допустимого жизненного цикла процесса , все пропущенные выполнения выполнялись немедленно, когда приложение возвращалось к допустимому жизненному циклу.

При настройке Android 16 не более одного пропущенного выполнения scheduleAtFixedRate выполняется немедленно, когда приложение возвращается к допустимому жизненному циклу. Ожидается, что это изменение поведения улучшит производительность приложения. Проверьте это поведение в своем приложении, чтобы проверить, не затронуто ли оно ваше приложение. Вы также можете протестировать, используя платформу совместимости приложений и включив флаг совместимости STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS .

Форм-факторы устройств

Android 16 (уровень API 36) включает следующие изменения для приложений, отображаемых на устройствах с большим экраном.

Адаптивные макеты

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

Игнорировать ограничения ориентации, изменения размера и соотношения сторон.

Для приложений, предназначенных для Android 16 (уровень API 36), Android 16 включает изменения в том, как система управляет ограничениями ориентации, изменения размера и соотношения сторон. На дисплеях с наименьшей шириной >= 600 dp ограничения больше не применяются. Приложения также заполняют все окно дисплея, независимо от соотношения сторон или предпочтительной ориентации пользователя, при этом пилларбокс не используется.

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

Вы также можете проверить это поведение, используя платформу совместимости приложений и включив флаг совместимости UNIVERSAL_RESIZABLE_BY_DEFAULT .

Общие критические изменения

Игнорирование ограничений на ориентацию, изменение размера и соотношение сторон может повлиять на пользовательский интерфейс вашего приложения на некоторых устройствах, особенно на элементы, которые были разработаны для небольших макетов, заблокированных в книжной ориентации: например, такие проблемы, как растянутые макеты, внеэкранная анимация и компоненты. Любые предположения о соотношении сторон или ориентации могут вызвать визуальные проблемы в вашем приложении. Узнайте больше о том, как их избежать и улучшить адаптивное поведение вашего приложения.

Разрешение вращения устройства приводит к большему повторному созданию активности, что может привести к потере состояния пользователя, если оно не будет сохранено должным образом. Узнайте, как правильно сохранить состояние пользовательского интерфейса, в статье Сохранение состояний пользовательского интерфейса .

Детали реализации

Следующие атрибуты манифеста и API среды выполнения игнорируются на устройствах с большим экраном в полноэкранном и многооконном режимах:

Следующие значения для screenOrientation , setRequestedOrientation() и getRequestedOrientation() игнорируются:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

Что касается изменения размера дисплея, android:resizeableActivity="false" , android:minAspectRatio и android:maxAspectRatio не имеют никакого эффекта.

Для приложений, предназначенных для Android 16 (уровень API 36), ограничения ориентации, изменения размера и соотношения сторон приложения по умолчанию игнорируются на больших экранах, но каждое приложение, которое не полностью готово, может временно переопределить это поведение, отключив его (что приводит к переводу предыдущего поведения в режим совместимости).

Исключения

Ограничения на ориентацию, изменение размера и соотношение сторон Android 16 не применяются в следующих ситуациях:

  • Игры (на основе флага android:appCategory )
  • Пользователи явно соглашаются на поведение приложения по умолчанию в настройках соотношения сторон устройства.
  • Экраны меньше, чем sw600dp

Временно отказаться от участия

Чтобы отказаться от определенного действия, объявите свойство манифеста PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY :

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

Если слишком много частей вашего приложения не готовы для Android 16, вы можете полностью отказаться, применив то же свойство на уровне приложения:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
,

Поскольку приложения Android теперь работают на различных устройствах (таких как телефоны, планшеты, складные устройства, настольные компьютеры, автомобили и телевизоры) и имеют оконные режимы на больших экранах (например, разделенный экран и окно рабочего стола), разработчикам следует создавать приложения Android, которые адаптируются к любому экрану и размеру окна, независимо от ориентации устройства. Такие парадигмы, как ограничение ориентации и возможности изменения размера, слишком ограничительны в современном мире с множеством устройств.

Игнорировать ограничения ориентации, изменения размера и соотношения сторон.

Для приложений, предназначенных для Android 16 (уровень API 36), Android 16 включает изменения в том, как система управляет ограничениями ориентации, изменения размера и соотношения сторон. На дисплеях с наименьшей шириной >= 600 dp ограничения больше не применяются. Приложения также заполняют все окно дисплея, независимо от соотношения сторон или предпочтительной ориентации пользователя, при этом пилларбоксинг не используется.

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

Вы также можете проверить это поведение, используя платформу совместимости приложений и включив флаг совместимости UNIVERSAL_RESIZABLE_BY_DEFAULT .

Общие критические изменения

Игнорирование ограничений на ориентацию, изменение размера и соотношение сторон может повлиять на пользовательский интерфейс вашего приложения на некоторых устройствах, особенно на элементы, которые были разработаны для небольших макетов, заблокированных в книжной ориентации: например, такие проблемы, как растянутые макеты, анимация и компоненты за пределами экрана. Любые предположения о соотношении сторон или ориентации могут вызвать визуальные проблемы в вашем приложении. Узнайте больше о том, как их избежать и улучшить адаптивное поведение вашего приложения.

Разрешение вращения устройства приводит к большему повторному созданию активности, что может привести к потере состояния пользователя, если оно не будет сохранено должным образом. Узнайте, как правильно сохранить состояние пользовательского интерфейса, в статье Сохранение состояний пользовательского интерфейса .

Детали реализации

Следующие атрибуты манифеста и API среды выполнения игнорируются на устройствах с большим экраном в полноэкранном и многооконном режимах:

Следующие значения для screenOrientation , setRequestedOrientation() и getRequestedOrientation() игнорируются:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

Что касается изменения размера дисплея, android:resizeableActivity="false" , android:minAspectRatio и android:maxAspectRatio не имеют никакого эффекта.

Для приложений, ориентированных на Android 16 (уровень API 36), ограничения ориентации, изменения размера и соотношения сторон приложения по умолчанию игнорируются на больших экранах, но каждое приложение, которое не полностью готово, может временно отменить это поведение, отключив его (что приводит к предыдущему поведению — переводу в режим совместимости).

Исключения

Ограничения на ориентацию, изменение размера и соотношение сторон Android 16 не применяются в следующих ситуациях:

  • Игры (на основе флага android:appCategory )
  • Пользователи явно соглашаются на поведение приложения по умолчанию в настройках соотношения сторон устройства.
  • Экраны меньше, чем sw600dp

Временно отказаться от участия

Чтобы отказаться от определенного действия, объявите свойство манифеста PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY :

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

Если слишком много частей вашего приложения не готовы для Android 16, вы можете полностью отказаться, применив то же свойство на уровне приложения:

<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 . Любой API, ранее требующий BODY_SENSORS или BODY_SENSORS_BACKGROUND , теперь требует соответствующего разрешения android.permissions.health . Это влияет на следующие типы данных, API и типы служб переднего плана:

Если ваше приложение использует эти API, теперь оно должно запрашивать соответствующие подробные разрешения:

  • Для мониторинга сердечного ритма, SpO2 или температуры кожи во время использования: запросите детальное разрешение в android.permissions.health , например READ_HEART_RATE вместо BODY_SENSORS .
  • Для доступа к фоновому датчику: запросите READ_HEALTH_DATA_IN_BACKGROUND вместо BODY_SENSORS_BACKGROUND .

Эти разрешения такие же, как и те, которые защищают доступ к чтению данных из Health Connect , хранилища данных Android для данных о здоровье, фитнесе и самочувствии.

Мобильные приложения

Мобильные приложения, мигрирующие для использования READ_HEART_RATE и других детальных разрешений, также должны объявить действие для отображения политики конфиденциальности приложения. Это то же требование, что и для 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

Для приложений, предназначенных для Android 16 или более поздних версий, MediaStore#getVersion() теперь будет уникальным для каждого приложения. Это исключает идентификацию свойств из строки версии, чтобы предотвратить злоупотребление и использование методов снятия отпечатков пальцев. Приложения не должны делать никаких предположений относительно формата этой версии. Приложения уже должны обрабатывать изменения версий при использовании этого API, и в большинстве случаев им не нужно менять свое текущее поведение, если только разработчик не попытался получить дополнительную информацию, выходящую за рамки предполагаемой области действия этого 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 года).

Руководство для разработчиков (согласие)

Чтобы включить ограничения локальной сети, выполните следующие действия:

  1. Перепрограммируйте устройство на сборку 25Q2 Beta 3 или новее.
  2. Установите приложение для тестирования.
  3. Переключите флаг Appcompat в adb:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Перезагрузите устройство

Теперь доступ вашего приложения к локальной сети ограничен, и любая попытка доступа к локальной сети приведет к ошибкам сокета. Если вы используете API, которые выполняют операции в локальной сети вне процесса вашего приложения (например, NsdManager), на этапе согласия на них это не повлияет.

Чтобы восстановить доступ, вы должны предоставить своему приложению разрешение NEARBY_WIFI_DEVICES .

  1. Убедитесь, что приложение декларирует разрешение NEARBY_WIFI_DEVICES в своем манифесте.
  2. Откройте «Настройки» > «Приложения» > [Имя приложения] > «Разрешения» > «Устройства поблизости» > «Разрешить» .

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

Как только начнется принудительное применение защиты локальной сети, это повлияет на сетевой трафик приложений.

Разрешение Исходящий запрос локальной сети Исходящий/входящий интернет-запрос Входящий запрос локальной сети
Предоставленный Работает Работает Работает
Не предоставлено Не удалось Работает Не удалось

Используйте следующую команду, чтобы отключить флаг 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) классифицируются как адреса локальной сети.