Изменения в поведении: приложения для 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. Приложения заполняют все окно дисплея независимо от соотношения сторон или предпочтительной ориентации пользователя, и черные полосы по бокам (pillarboxing) не используются.

Это изменение вводит новый стандарт поведения платформы. 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 . Начиная с 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 权限的任何应用都可以访问局域网中的设备。 这使得应用可以轻松连接到本地设备,但也存在隐私方面的影响,例如形成用户指纹,以及成为位置信息的代理。

本地网络保护项目旨在通过在新的运行时权限后限制对本地网络的访问,来保护用户的隐私。

发布计划

这项变更将分别在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须遵循 25Q2 的相关指南并分享反馈,因为这些保护措施将在后续 Android 版本中强制执行。此外,他们还需要按照以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。

影响

在当前阶段,LNP 是一项选择启用功能,这意味着只有选择启用的应用会受到影响。选择启用阶段的目标是让应用开发者了解应用的哪些部分依赖于隐式本地网络访问权限,以便他们为下一个版本做好权限保护准备。

如果应用使用以下方式访问用户的本地网络,则会受到影响:

  • 直接或通过库使用本地网络地址(例如 mDNS 或 SSDP 服务发现协议)上的原始套接字
  • 使用可访问本地网络的框架级类(例如 NsdManager)

本地网络地址发送流量和本地网络地址接收流量需要本地网络访问权限。下表列出了一些常见情况:

应用低级层网络操作 需要本地网络权限
建立出站 TCP 连接
接受传入的 TCP 连接
发送 UDP 单播、多播、广播
接收传入的 UDP 单播、多播、广播

这些限制是在网络堆栈深处实现的,因此适用于所有网络 API。这包括在原生代码或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及基于这些库实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)将需要本地网络权限。

上述规则的例外情况:

  • 如果设备的 DNS 服务器位于本地网络上,则进出该服务器(位于端口 53)的流量不需要本地网络访问权限。
  • 使用输出切换器作为其应用内选择器的应用将不需要本地网络权限(更多指南将在 2025 年第 4 季度发布)。

开发者指南(选择启用)

如需选择启用本地网络限制,请执行以下操作:

  1. 将设备刷写到 25Q2 Beta 3 或更高版本的 build。
  2. 安装要测试的应用。
  3. 在 adb 中切换 Appcompat 标志:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. 重启设备

现在,您的应用对本地网络的访问受到限制,任何访问本地网络的尝试都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如:NsdManager),在选择启用阶段,这些 API 不会受到影响。

如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES 权限。

  1. 确保应用在其清单中声明了 NEARBY_WIFI_DEVICES 权限。
  2. 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许

现在,应用对本地网络的访问权限应该已恢复,并且所有场景都应像选择启用应用之前一样正常运行。

本地网络保护功能开始强制执行后,应用的网络流量将受到以下影响。

权限 出站 LAN 请求 出站/入站互联网请求 入站 LAN 请求
已授予 Works Works Works
未授予 最差排行榜 Works 最差排行榜

使用以下命令关闭应用兼容性标志

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

错误

每当调用套接字调用 send 或 send 变体向本地网络地址发送数据时,系统都会向该套接字返回因这些限制而产生的错误。

错误示例:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

本地网络定义

此项目中的本地网络是指使用支持广播的网络接口(例如 Wi-Fi 或以太网)的 IP 网络,但不包括移动网络 (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" %}