Изменения в поведении: приложения для 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 убедитесь, что ваше приложение поддерживает режим «от края до края», и удалите любое использование R.attr#windowOptOutEdgeToEdgeEnforcement , чтобы ваше приложение также поддерживало режим «от края до края» на устройстве Android 15. Для поддержки режима «от края до края» см. руководство по Compose и Views .

Для использования функции прогнозирования требуется миграция или отказ от нее.

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

Если ваше приложение перехватывает событие «Назад», и вы еще не перешли на предиктивную навигацию «Назад», обновите приложение, чтобы использовать поддерживаемые API навигации «Назад» , или временно отключите эту функцию, установив атрибут android:enableOnBackInvokedCallback в значение false в теге <application> или <activity> файла AndroidManifest.xml вашего приложения.

Анимация возврата на главный экран с функцией прогнозирования.
Анимация перекрестной активности с функцией прогнозирования.
Анимация, позволяющая прогнозировать выполнение различных задач.

API-интерфейсы Elegant Font устарели и отключены.

В приложениях для 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 (уровень API 36), или для приложений, ориентированных на 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)为目标平台的应用,屏幕方向、尺寸可调整性和宽高比限制不再适用于最小宽度 >= 600dp 的显示屏。无论宽高比或用户偏好的屏幕方向如何,应用都会填满整个显示窗口,且不会采用竖条模式。

此变更引入了新的标准平台行为。Android 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸调整等限制会阻碍应用的适应性。使应用具有自适应性,以提供尽可能最佳的用户体验。

您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT 兼容性标志来测试此行为。

常见的重大更改

忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素,例如布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。

允许设备旋转会导致更多 activity 重新创建,如果未正确保留,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态

实现细节

在全屏模式和多窗口模式下,以下清单属性和运行时 API 会被大屏设备忽略:

系统会忽略 screenOrientationsetRequestedOrientation()getRequestedOrientation() 的以下值:

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

对于显示屏可调整大小性,android:resizeableActivity="false"android:minAspectRatioandroid:maxAspectRatio 没有影响。

对于以 Android 16(API 级别 36)为目标平台的应用,默认情况下,大屏设备会忽略应用的屏幕方向、可调整尺寸性和宽高比限制,但尚未完全准备就绪的每个应用都可以选择停用此行为,从而暂时替换此行为(这会导致应用恢复到之前放置在兼容模式下的行为)。

例外情况

在以下情况下,Android 16 的屏幕方向、尺寸调整能力和宽高比限制不适用:

  • 游戏(基于 android:appCategory 标志)
  • 用户在设备的宽高比设置中明确选择启用应用的默认行为
  • 小于 sw600dp 的屏幕

暂时选择不接收

如需选择停用特定 activity,请声明 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 . Начиная с Android 16, любой API, ранее требувший BODY_SENSORS или BODY_SENSORS_BACKGROUND теперь требует соответствующего разрешения android.permissions.health . Это затрагивает следующие типы данных, API и типы служб переднего плана:

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

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

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

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

Мобильные приложения, переходящие на использование разрешения READ_HEART_RATE и других детализированных разрешений, также должны объявить об активности для отображения политики конфиденциальности приложения. Это то же самое требование, что и в Health Connect.

Подключение

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

Новые намерения по обработке убытков по облигациям и изменения в шифровании

В рамках улучшенной обработки потери облигаций в Android 16 также представлены 2 новых намерения, которые предоставляют приложениям более подробную информацию об изменениях в потере облигаций и шифровании.

Приложения для Android 16 теперь могут:

  • Получать намерение ACTION_KEY_MISSING при обнаружении удаленной потери связи, что позволяет им предоставлять более информативную обратную связь пользователю и предпринимать соответствующие действия.
  • Получайте намерение ACTION_ENCRYPTION_CHANGE всякий раз, когда изменяется статус шифрования ссылки. Это включает изменение статуса шифрования, изменение алгоритма шифрования и изменение размера ключа шифрования. Приложения должны считать связь восстановленной, если ссылка успешно зашифрована при получении намерения ACTION_ENCRYPTION_CHANGE позже.

Адаптация к различным реализациям OEM

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

Мы рекомендуем следующее поведение приложения:

  • Если транслируется намерение ACTION_KEY_MISSING :

    Система отключит соединение ACL (асинхронное соединение без установления соединения), но информация о соединении для устройства будет сохранена (как описано здесь ).

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

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

  • Если намерение ACTION_KEY_MISSING НЕ транслируется:

    Ссылка ACL останется подключенной, а информация о связи для устройства будет удалена системой, аналогично поведению в Android 15.

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

Новый способ устранения проблемы с Bluetooth.

Все приложения, ориентированные на Android 16, теперь могут отключать сопряжение устройств Bluetooth с помощью общедоступного API в CompanionDeviceManager . Если сопутствующее устройство управляется как ассоциация CDM, то приложение может инициировать удаление связи Bluetooth с помощью нового API removeBond(int) на связанном устройстве. Приложение может отслеживать изменения состояния связи, прослушивая событие широковещательной передачи устройства Bluetooth ACTION_BOND_STATE_CHANGED .

Безопасность

В Android 16 (уровень API 36) внесены следующие изменения в систему безопасности.

Блокировка версий MediaStore

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

Более безопасные намерения

Функция Safer Intents — это многоэтапная инициатива в области безопасности, призванная повысить защиту механизма распознавания намерений в Android. Цель состоит в защите приложений от вредоносных действий путем добавления проверок во время обработки намерений и фильтрации намерений, не соответствующих определенным критериям.

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

Внедряются два ключевых изменения:

  1. Явно заданные намерения должны соответствовать фильтру намерений целевого компонента: если намерение явно нацелено на компонент, оно должно соответствовать фильтру намерений этого компонента.

  2. Интенты без указанного действия не могут соответствовать ни одному фильтру интентов: Интенты, у которых не указано действие, не должны обрабатываться ни одним фильтром интентов.

Эти изменения применяются только при участии нескольких приложений и не влияют на обработку намерений в рамках одного приложения.

Влияние

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

  • Осведомлены о функции «Безопасные намерения» и ее преимуществах.
  • Активно внедрять более строгие методы обработки намерений в свои приложения.

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

Хотя первоначальное влияние в Android 16 может быть ограниченным, инициатива Safer Intents имеет дорожную карту для более широкого воздействия в будущих версиях Android. План состоит в том, чтобы в конечном итоге сделать строгое разрешение намерений поведением по умолчанию.

Функция Safer Intents потенциально может значительно повысить безопасность экосистемы Android, затруднив использование вредоносными приложениями уязвимостей в механизме разрешения намерений.

Однако переход к системе с возможностью отказа от участия и обязательному применению должен осуществляться тщательно, чтобы устранить потенциальные проблемы совместимости с существующими приложениями.

Выполнение

Разработчикам необходимо явно включить более строгий поиск намерений, используя атрибут intentMatchingFlags в манифесте приложения. Вот пример, где эта функция является необязательной для всего приложения, но отключена/отключена для получателя:

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

Подробнее о поддерживаемых флагах:

Название флага Описание
enforceIntentFilter Применяет более строгий контроль соответствия для входящих запросов.
никто Отключает все специальные правила сопоставления для входящих интентов. При указании нескольких флагов конфликтующие значения разрешаются путем отдачи приоритета флагу «none».
allowNullAction Смягчает правила сопоставления, позволяя сопоставлять намерения без действия. Этот флаг используется совместно с "enforceIntentFilter" для достижения определенного поведения.

Тестирование и отладка

Когда функция принудительного применения включена, приложения должны работать корректно, если вызывающий интент правильно заполнил свой интент. Однако заблокированные интенты будут вызывать предупреждающие сообщения в журнале, такие как "Intent does not match component's intent filter:" и "Access blocked:" с тегом "PackageManager." Это указывает на потенциальную проблему, которая может повлиять на работу приложения и требует внимания.

Фильтр Logcat:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

Фильтрация системных вызовов графического процессора

Для повышения безопасности графического процессора Mali, в производственных сборках заблокированы IOCTL-операции Mali GPU, которые устарели или предназначены исключительно для разработки под GPU. Кроме того, использование IOCTL-операций для профилирования GPU ограничено процессом оболочки или отлаживаемыми приложениями. Более подробную информацию о политике на уровне платформы см. в обновлении SAC.

Это изменение затрагивает устройства Pixel, использующие графический процессор Mali (Pixel 6-9). Компания Arm предоставила официальную классификацию своих IOCTL в Documentation/ioctl-categories.rst в своем релизе r54p2 . Этот список будет поддерживаться в будущих версиях драйверов.

Это изменение не затронет поддерживаемые графические API (включая Vulkan и OpenGL) и, как ожидается, не повлияет на разработчиков или существующие приложения. Инструменты профилирования графического процессора, такие как Streamline Performance Analyzer и Android GPU Inspector, останутся без изменений.

Тестирование

Если вы видите сообщение об отказе SELinux, подобное приведенному ниже, вероятно, ваше приложение пострадало от этого изменения:

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

Если вашему приложению необходимо использовать заблокированные IOCTL, пожалуйста, сообщите об ошибке и назначьте ответственного за ее исправление по адресу android-partner-security@google.com.

Часто задаваемые вопросы

  1. Распространяется ли это изменение политики на всех производителей оригинального оборудования (OEM)? Это изменение будет добровольным, но доступным для любых OEM-производителей, желающих использовать этот метод повышения безопасности. Инструкции по внедрению изменения можно найти в документации по внедрению.

  2. Обязательно ли вносить изменения в код OEM-производителя для реализации этого, или это будет включено в новый релиз AOSP по умолчанию? Изменение на уровне платформы будет включено в новый релиз AOSP по умолчанию. Поставщики могут включить это изменение в свой код, если хотят его применить.

  3. Несут ли производители SoC ответственность за поддержание актуальности списка IOCTL? Например, если в моем устройстве используется графический процессор ARM Mali, нужно ли мне обращаться в ARM по поводу каких-либо изменений? Каждый SoC должен обновлять свой список IOCTL для каждого устройства после выпуска драйверов. Например, ARM обновляет свой опубликованный список IOCTL при обновлении драйверов. Однако производители оборудования должны убедиться, что они включают обновления в свою политику SEPolicy и добавляют любые выбранные пользовательские IOCTL в списки по мере необходимости.

  4. Применяется ли это изменение автоматически ко всем устройствам Pixel, представленным на рынке, или для его применения требуется какое-либо действие со стороны пользователя? Это изменение применяется ко всем устройствам Pixel, представленным на рынке, использующим графический процессор Mali (Pixel 6-9). Для применения этого изменения никаких действий со стороны пользователя не требуется.

  5. Повлияет ли использование этой политики на производительность драйвера ядра? Эта политика была протестирована на графическом процессоре Mali с помощью GFXBench, и никаких измеримых изменений в производительности графического процессора не наблюдалось.

  6. Необходимо ли, чтобы список IOCTL соответствовал текущим версиям драйверов пользовательского пространства и ядра? Да, список разрешенных IOCTL должен быть синхронизирован с IOCTL, поддерживаемыми как драйверами пользовательского пространства, так и драйверами ядра. Если IOCTL в драйвере пользовательского пространства или ядра обновляются, список IOCTL SEPolicy также должен быть обновлен в соответствии с ними.

  7. ARM классифицировала IOCTL как «ограниченные» / «инструментальные», но мы хотим использовать некоторые из них в производственных сценариях и/или запретить другие. Отдельные OEM-производители/SoC несут ответственность за определение классификации используемых ими IOCTL на основе конфигурации своих пользовательских библиотек Mali. Список ARM может помочь в принятии этих решений, но сценарий использования для каждого OEM-производителя/SoC может быть разным.

Конфиденциальность

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

Права доступа в локальной сети

Любое приложение, имеющее разрешение на доступ INTERNET , может получить доступ к устройствам в локальной сети. Это упрощает подключение приложений к локальным устройствам, но также имеет последствия для конфиденциальности, например, формирование «отпечатка пальца» пользователя и использование его в качестве прокси-сервера для определения местоположения.

Проект Local Network Protections направлен на защиту конфиденциальности пользователей путем ограничения доступа к локальной сети с помощью нового механизма разрешений во время выполнения.

План выпуска

Это изменение будет внедрено между двумя релизами: 25-м кварталом 2025 года и 26-м кварталом 2026 года соответственно. Разработчикам крайне важно следовать этим рекомендациям для 25-го квартала 2025 года и делиться отзывами, поскольку эти меры защиты будут внедрены в более позднем релизе Android . Кроме того, им потребуется обновить сценарии, зависящие от неявного доступа к локальной сети, используя следующие рекомендации, и подготовиться к отклонению и аннулированию пользователем нового разрешения.

Влияние

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

Приложения будут затронуты, если они получают доступ к локальной сети пользователя с помощью следующих способов:

  • Прямое или библиотечное использование необработанных сокетов по локальным сетевым адресам (например, протокол обнаружения служб mDNS или SSDP).
  • Использование классов уровня фреймворка, которые обращаются к локальной сети (например, NsdManager).

Для передачи данных в локальную сеть и из нее требуются разрешения на доступ к локальной сети. В таблице ниже перечислены некоторые распространенные случаи:

Низкоуровневое управление сетью приложения Требуется разрешение для локальной сети.
Установление исходящего TCP-соединения да
Приём входящих TCP-соединений да
Отправка UDP-сообщений в одноадресной, многоадресной или широковещательной рассылке. да
Приём входящего UDP-сообщения (одноадресная, многоадресная, широковещательная передача) да

Эти ограничения реализованы глубоко в сетевом стеке и, следовательно, применяются ко всем сетевым API . Это включает в себя сокеты, созданные в нативном или управляемом коде, сетевые библиотеки, такие как Cronet и OkHttp, и любые API, реализованные поверх них. Попытка разрешения доступа к службам в локальной сети (т.е. к службам с суффиксом .local) потребует разрешения доступа к локальной сети.

Исключения из вышеуказанных правил:

  • Если DNS-сервер устройства находится в локальной сети, то для передачи данных к нему или от него (через порт 53) не требуется разрешение на доступ к локальной сети.
  • Приложениям, использующим Output Switcher в качестве встроенного средства выбора, не потребуются разрешения на доступ к локальной сети (более подробная информация появится в 4 квартале 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. Перейдите в Настройки > Приложения > [Название приложения] > Разрешения > Ближайшие устройства > Разрешить .

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

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

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

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

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Ошибки

Ошибки, возникающие из-за этих ограничений, будут возвращаться вызывающему сокету всякий раз, когда он вызывает функцию send или её вариант для отправки по локальному сетевому адресу.

Примеры ошибок:

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 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6:

  • Локальная ссылка
  • Маршруты, имеющие прямое соединение
  • Заглушки сетей, такие как Thread
  • Несколько подсетей (будет определено позже)

Кроме того, как многоадресные адреса (224.0.0.0/4, ff00::/8), так и широковещательные адреса IPv4 (255.255.255.255) классифицируются как адреса локальной сети.

Фотографии, принадлежащие приложению

{% включают "/training/data-storage/shared/___owned-photos" %}