Comme les versions précédentes, Android 16 apporte des modifications de comportement pouvant affecter votre application. Les modifications de comportement suivantes s'appliquent exclusivement aux applications qui ciblent Android 16 ou version ultérieure. Si votre application cible Android 16 ou une version ultérieure, vous devez la modifier pour qu'elle prenne en charge ces comportements, le cas échéant.
Veillez également à consulter la liste des modifications de comportement qui affectent toutes les applications exécutées sur Android 16, peu importe la targetSdkVersion de votre application.
Expérience utilisateur et UI du système
Android 16 (niveau d'API 36) inclut les modifications suivantes, qui visent à créer une expérience utilisateur plus cohérente et intuitive.
Suppression de l'option de désactivation de l'affichage bord à bord
Android 15 applique le mode sans bordures pour les applications ciblant Android 15 (niveau d'API 35), mais votre application peut désactiver cette option en définissant R.attr#windowOptOutEdgeToEdgeEnforcement sur true. Pour les applications ciblant Android 16 (niveau d'API 36), R.attr#windowOptOutEdgeToEdgeEnforcement est obsolète et désactivé, et votre application ne peut pas désactiver l'affichage sans bordure.
- Si votre application cible Android 16 (niveau d'API 36) et s'exécute sur un appareil Android 15,
R.attr#windowOptOutEdgeToEdgeEnforcementcontinue de fonctionner. - Si votre application cible Android 16 (niveau d'API 36) et s'exécute sur un appareil Android 16,
R.attr#windowOptOutEdgeToEdgeEnforcementest désactivé.
Pour effectuer des tests sur Android 16, assurez-vous que votre application est compatible avec le mode sans bordure et supprimez toute utilisation de R.attr#windowOptOutEdgeToEdgeEnforcement afin qu'elle soit également compatible avec le mode sans bordure sur un appareil Android 15. Pour prendre en charge le mode sans bordure, consultez les conseils pour Compose et les vues.
Migration ou désactivation requise pour la prévisualisation du geste Retour
Pour les applications ciblant Android 16 (niveau d'API 36) ou version ultérieure et s'exécutant sur un appareil Android 16 ou version ultérieure, les animations système de prévisualisation du Retour (retour à l'écran d'accueil, multitâche et multi-activité) sont activées par défaut.
De plus, onBackPressed n'est pas appelé et KeyEvent.KEYCODE_BACK n'est plus distribué.
Si votre application intercepte l'événement de retour et que vous n'avez pas encore migré vers la prévisualisation du geste Retour, mettez à jour votre application pour utiliser les API de retour en arrière compatibles ou désactivez temporairement cette fonctionnalité en définissant l'attribut android:enableOnBackInvokedCallback sur false dans la balise <application> ou <activity> du fichier AndroidManifest.xml de votre application.
API de polices élégantes obsolètes et désactivées
以 Android 15(API 级别 35)为目标平台的应用默认将 elegantTextHeight
TextView 属性设置为 true,从而将紧凑型字体替换为可读性更高的字体。您可以通过将 elegantTextHeight 属性设置为 false 来替换此设置。
Android 16 弃用了 elegantTextHeight 属性,当您的应用以 Android 16 为目标平台后,系统会忽略该属性。由这些 API 控制的“界面字体”即将停用,因此您应调整所有布局,以确保阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语文本的呈现效果一致且不受未来变化的影响。
elegantTextHeight 属性设置为 false 替换默认值的应用,
elegantTextHeight 行为。elegantTextHeight 属性设置为 false 来替换默认值的应用,其 elegantTextHeight 行为。
Fonctionnalité de base
Android 16 (niveau d'API 36) inclut les modifications suivantes qui modifient ou étendent diverses fonctionnalités de base du système Android.
Optimisation de la planification des tâches à tarif fixe
在以 Android 16 为目标平台之前,如果 scheduleAtFixedRate 因不在有效的进程生命周期内而错过了任务执行,则当应用返回到有效的生命周期时,所有错过的执行会立即执行。
以 Android 16 为目标平台时,当应用返回到有效的生命周期时,系统会立即执行最多 1 次未执行的 scheduleAtFixedRate 执行。此行为变更预计会提升应用性能。在您的应用中测试此行为,检查您的应用是否受到影响。您还可以使用应用兼容性框架并启用 STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS 兼容性标志进行测试。
Facteurs de forme des appareils
Android 16 (niveau d'API 36) inclut les modifications suivantes pour les applications lorsqu'elles sont affichées sur des appareils à grand écran.
Mises en page adaptatives
Les applications Android fonctionnant désormais sur une multitude d'appareils (téléphones, tablettes, appareils pliables, ordinateurs de bureau, voitures et téléviseurs, par exemple) et de modes de fenêtrage sur les grands écrans (comme l'écran partagé et le fenêtrage de bureau), les développeurs doivent créer des applications Android qui s'adaptent à toutes les tailles d'écran et de fenêtre, quelle que soit l'orientation de l'appareil. Les approches qui limitent l'orientation et le redimensionnement sont trop contraignantes dans le monde multi-appareils d'aujourd'hui.
Ignorer les restrictions d'orientation, de redimensionnement et de format
Pour les applications ciblant Android 16 (niveau d'API 36), les restrictions d'orientation, de redimensionnement et de format ne s'appliquent plus sur les écrans dont la plus petite largeur est supérieure ou égale à 600 dp. Les applications remplissent toute la fenêtre d'affichage, quels que soient le format ou l'orientation préférés de l'utilisateur, et le format pillarbox n'est pas utilisé.
Cette modification introduit un nouveau comportement standard de la plate-forme. Android évolue vers un modèle où les applications doivent s'adapter à des orientations, tailles d'écran et formats différents. Les restrictions telles que l'orientation fixe ou la taille non modifiable limitent l'adaptabilité des applications. Rendez votre application adaptative pour offrir la meilleure expérience utilisateur possible.
Vous pouvez également tester ce comportement à l'aide du framework de compatibilité des applications et en activant l'indicateur de compatibilité UNIVERSAL_RESIZABLE_BY_DEFAULT.
Modifications destructives courantes
Ignorer les restrictions d'orientation, de redimensionnement et de format peut avoir un impact sur l'interface utilisateur de votre application sur certains appareils, en particulier sur les éléments conçus pour de petites mises en page verrouillées en mode portrait. Par exemple, cela peut entraîner des problèmes tels que des mises en page étirées, ou des animations et des composants apparaissant hors écran. Toute hypothèse concernant le format ou l'orientation peut entraîner des problèmes visuels dans votre application. Découvrez comment les éviter et améliorer le comportement adaptatif de votre application.
Autoriser la rotation de l'appareil entraîne une recréation plus fréquente de l'activité, ce qui peut entraîner la perte de l'état de l'utilisateur s'il n'est pas correctement conservé. Découvrez comment enregistrer correctement l'état de l'UI dans Enregistrer les états de l'interface utilisateur.
Détails de mise en œuvre
Les attributs de fichier manifeste et les API d'exécution suivants sont ignorés sur les appareils à grand écran en mode plein écran et multifenêtre :
screenOrientationresizableActivityminAspectRatiomaxAspectRatiosetRequestedOrientation()getRequestedOrientation()
Les valeurs suivantes pour screenOrientation, setRequestedOrientation() et getRequestedOrientation() sont ignorées :
portraitreversePortraitsensorPortraituserPortraitlandscapereverseLandscapesensorLandscapeuserLandscape
Concernant la possibilité de redimensionner l'écran, android:resizeableActivity="false", android:minAspectRatio et android:maxAspectRatio n'ont aucun effet.
Pour les applications ciblant Android 16 (niveau d'API 36), les contraintes d'orientation, de redimensionnement et de format de l'application sont ignorées par défaut sur les grands écrans. Chaque application qui n'est pas entièrement prête peut temporairement ignorer ce comportement en désactivant l'option, ce qui entraîne le comportement précédent de placement en mode de compatibilité.
Exceptions
Les restrictions d'orientation, de redimensionnement et de format d'Android 16 ne s'appliquent pas dans les situations suivantes :
- Jeux (basés sur l'indicateur
android:appCategory) - Si les utilisateurs activent explicitement le comportement par défaut de l'application dans les paramètres de format de l'appareil
- Écrans inférieurs à
sw600dp
Désactiver temporairement
Pour désactiver une activité spécifique, déclarez la propriété de fichier manifeste PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY :
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
Si trop de parties de votre application ne sont pas prêtes pour Android 16, vous pouvez désactiver complètement la fonctionnalité en appliquant la même propriété au niveau de l'application :
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
Santé et remise en forme
Android 16 (niveau d'API 36) inclut les modifications suivantes concernant les données de santé et de fitness.
Autorisations liées à la santé et à la remise en forme
Pour les applications ciblant Android 16 (niveau d'API 36) ou version ultérieure, les autorisations BODY_SENSORS utilisent des autorisations plus précises sous android.permissions.health, que Santé Connect utilise également. À partir d'Android 16, toute API qui nécessitait auparavant BODY_SENSORS ou BODY_SENSORS_BACKGROUND requiert désormais l'autorisation android.permissions.health correspondante. Cela concerne les types de données, les API et les types de services de premier plan suivants :
HEART_RATE_BPMdes Services Santé sur Wear OSSensor.TYPE_HEART_RATEdu gestionnaire de capteurs AndroidheartRateAccuracyetheartRateBpmdeProtoLayoutsur Wear OSFOREGROUND_SERVICE_TYPE_HEALTH, où l'autorisationandroid.permission.healthrespective est requise à la place deBODY_SENSORS
Si votre application utilise ces API, elle doit demander les autorisations précises correspondantes :
- Pour surveiller la fréquence cardiaque, la SpO2 ou la température cutanée pendant l'utilisation : demandez l'autorisation précise sous
android.permissions.health, par exempleREAD_HEART_RATEau lieu deBODY_SENSORS. - Pour l'accès aux capteurs en arrière-plan : demandez
READ_HEALTH_DATA_IN_BACKGROUNDau lieu deBODY_SENSORS_BACKGROUND.
Ces autorisations sont les mêmes que celles qui protègent l'accès à la lecture des données de Santé Connect, le datastore Android pour les données de santé, de fitness et de bien-être.
Applications mobiles
Les applications mobiles qui migrent pour utiliser l'autorisation READ_HEART_RATE et d'autres autorisations précises doivent également déclarer une activité pour afficher les règles de confidentialité de l'application. Cette exigence est la même que pour Santé Connect.
Connectivité
Android 16 (niveau d'API 36) inclut les modifications suivantes dans la pile Bluetooth pour améliorer la connectivité avec les périphériques.
Nouveaux intents pour gérer la perte de liaison et les modifications du chiffrement
Dans le cadre de la gestion améliorée de la perte de liaison, Android 16 introduit également deux nouveaux intents pour mieux informer les applications de la perte de liaison et des modifications de chiffrement.
Les applications ciblant Android 16 peuvent désormais:
- Recevoir un intent
ACTION_KEY_MISSINGlorsqu'une perte de liaison à distance est détectée, ce qui leur permet de fournir des commentaires plus informatifs sur l'utilisateur et de prendre les mesures appropriées. - Recevoir un intent
ACTION_ENCRYPTION_CHANGEchaque fois que l'état du chiffrement du lien change. Cela inclut la modification de l'état du chiffrement, de l'algorithme de chiffrement et de la taille de la clé de chiffrement. Les applications doivent considérer que l'association est restaurée si le lien est correctement chiffré lors de la réception de l'intentACTION_ENCRYPTION_CHANGEultérieurement.
S'adapter aux implémentations OEM variées
Bien qu'Android 16 introduise ces nouveaux intents, leur implémentation et leur diffusion peuvent varier selon les fabricants d'appareils (OEM). Pour que votre application offre une expérience cohérente et fiable sur tous les appareils, les développeurs doivent concevoir leur gestion des pertes de liaison pour s'adapter de manière appropriée à ces variations potentielles.
Nous vous recommandons les comportements d'application suivants:
Si l'intent
ACTION_KEY_MISSINGest diffusé:Le lien ACL (Asynchronous Connection-Less) sera déconnecté par le système, mais les informations de liaison de l'appareil seront conservées (comme décrit ici).
Votre application doit utiliser cet intent comme signal principal pour la détection de la perte de liaison et guider l'utilisateur pour qu'il confirme que l'appareil distant est à portée avant de lancer l'oubli de l'appareil ou le réassociation.
Si un appareil se déconnecte après la réception de
ACTION_KEY_MISSING, votre application doit être prudente lors de la reconnexion, car l'appareil peut ne plus être associé au système.Si l'intent
ACTION_KEY_MISSINGn'est PAS diffusé:Le lien ACL restera connecté, et les informations d'association de l'appareil seront supprimées par le système, comme dans Android 15.
Dans ce scénario, votre application doit poursuivre ses mécanismes de gestion des pertes de liaison existants, comme dans les versions précédentes d'Android, pour détecter et gérer les événements de perte de liaison.
Nouvelle façon de supprimer l'association Bluetooth
Toutes les applications ciblant Android 16 peuvent désormais dissocier des appareils Bluetooth à l'aide d'une API publique dans CompanionDeviceManager. Si un appareil associé est géré en tant qu'association CDM, l'application peut déclencher la suppression de l'association Bluetooth à l'aide de la nouvelle API removeBond(int) sur l'appareil associé. L'application peut surveiller les changements d'état de l'association en écoutant l'événement de diffusion de l'appareil Bluetooth ACTION_BOND_STATE_CHANGED.
Sécurité
Android 16 (niveau d'API 36) inclut les modifications de sécurité suivantes.
Blocage de la version MediaStore
Pour les applications ciblant Android 16 ou version ultérieure, MediaStore#getVersion() sera désormais unique pour chaque application. Cela élimine les propriétés d'identification de la chaîne de version pour éviter les utilisations abusives et l'utilisation de techniques d'empreinte digitale. Les applications ne doivent pas faire d'hypothèses sur le format de cette version. Les applications doivent déjà gérer les modifications de version lorsqu'elles utilisent cette API et, dans la plupart des cas, elles ne doivent pas avoir besoin de modifier leur comportement actuel, sauf si le développeur a tenté d'inférer des informations supplémentaires qui dépassent le champ d'application prévu de cette API.
Intents plus sûrs
La fonctionnalité Intents plus sûrs est une initiative de sécurité en plusieurs phases conçue pour améliorer la sécurité du mécanisme de résolution des intents d'Android. L'objectif est de protéger les applications contre les actions malveillantes en ajoutant des vérifications lors du traitement des intents et en filtrant les intents qui ne répondent pas à des critères spécifiques.
Dans Android 15, la fonctionnalité était axée sur l'application émettrice. Désormais, avec Android 16, le contrôle passe à l'application réceptrice, ce qui permet aux développeurs d'activer la résolution stricte des intents à l'aide du fichier manifeste de leur application.
Deux changements majeurs sont mis en œuvre :
Les intents explicites doivent correspondre au filtre d'intent du composant cible : si un intent cible explicitement un composant, il doit correspondre au filtre d'intent de ce composant.
Les intents sans action ne peuvent correspondre à aucun filtre d'intent : les intents pour lesquels aucune action n'est spécifiée ne doivent être résolus par aucun filtre d'intent.
Ces modifications ne s'appliquent que lorsque plusieurs applications sont impliquées et n'affectent pas la gestion des intents dans une seule application.
Impact
La nature de l'activation signifie que les développeurs doivent l'activer explicitement dans le fichier manifeste de leur application pour qu'elle prenne effet. Par conséquent, l'impact de la fonctionnalité sera limité aux applications dont les développeurs :
- connaissent la fonctionnalité Intents plus sûrs et ses avantages ;
- choisir d'intégrer des pratiques plus strictes de gestion des intents dans leurs applications.
Cette approche d'activation minimise le risque de casser les applications existantes qui peuvent s'appuyer sur le comportement actuel de résolution d'intentions, moins sécurisé.
Bien que l'impact initial sur Android 16 puisse être limité, l'initiative Safer Intents prévoit un impact plus large dans les futures versions d'Android. À terme, nous prévoyons de faire de la résolution stricte des intents le comportement par défaut.
La fonctionnalité Safer Intents peut améliorer considérablement la sécurité de l'écosystème Android en rendant plus difficile l'exploitation des failles du mécanisme de résolution des intents par les applications malveillantes.
Toutefois, la transition vers la désactivation et la mesure d'application obligatoire doit être gérée avec soin pour résoudre les problèmes de compatibilité potentiels avec les applications existantes.
Implémentation
Les développeurs doivent activer explicitement la mise en correspondance plus stricte des intents à l'aide de l'attribut intentMatchingFlags dans le fichier manifeste de leur application.
Voici un exemple où la fonctionnalité est activée pour l'ensemble de l'application, mais désactivée pour un récepteur :
<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>
En savoir plus sur les options compatibles :
| Nom d'option | Description |
|---|---|
| enforceIntentFilter | Applique une correspondance plus stricte pour les intents entrants. |
| aucun | Désactive toutes les règles de correspondance spéciales pour les intents entrants. Lorsque vous spécifiez plusieurs options, les valeurs en conflit sont résolues en donnant la priorité à l'option "none". |
| allowNullAction | Assouplit les règles de correspondance pour permettre aux intents sans action de correspondre. Cet indicateur doit être utilisé conjointement avec "enforceIntentFilter" pour obtenir un comportement spécifique. |
Tester et déboguer
Lorsque l'application est active, les applications doivent fonctionner correctement si l'appelant de l'intent a correctement renseigné l'intent.
Toutefois, les intents bloqués déclenchent des messages de journal d'avertissement tels que "Intent does not match component's intent filter:" et "Access blocked:" avec le tag "PackageManager.". Cela indique un problème potentiel qui pourrait avoir un impact sur l'application et qui nécessite une attention particulière.
Filtre Logcat :
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
Filtrage des appels système GPU
为了强化 Mali GPU 表面,已废弃或仅用于 GPU 开发的 Mali GPU IOCTL 已在正式版 build 中被屏蔽。此外,用于 GPU 性能分析的 IOCTL 已限制为 shell 进程或可调试应用。如需详细了解平台级政策,请参阅 SAC 更新。
此变更适用于使用 Mali GPU 的 Pixel 设备(Pixel 6-9)。Arm 在其 r54p2 版本的 Documentation/ioctl-categories.rst 中提供了其 IOCTL 的官方分类。此列表将在未来的驱动程序版本中继续维护。
此项变更不会影响受支持的图形 API(包括 Vulkan 和 OpenGL),预计也不会影响开发者或现有应用。 GPU 性能分析工具(例如 Streamline Performance Analyzer 和 Android GPU 检查器)不会受到影响。
测试
如果您看到类似以下内容的 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,请提交 bug 并将其分配给 android-partner-security@google.com。
常见问题解答
此政策变更是否适用于所有 OEM? 此项变更将采用选择启用的方式,但任何想要使用此加固方法的 OEM 都可以使用。如需了解如何实现此变更,请参阅实现文档。
是否必须在 OEM 代码库中进行更改才能实现此功能,还是说新的 AOSP 版本默认提供此功能? 默认情况下,平台级变更将随新的 AOSP 版本一起发布。如果供应商希望应用此更改,可以在其代码库中选择启用此更改。
SoC 是否负责确保 IOCTL 列表保持最新状态?例如,如果我的设备使用 ARM Mali GPU,我是否需要就任何更改与 ARM 联系? 各个 SoC 必须在驱动程序发布时更新其每个设备的 IOCTL 列表。 例如,ARM 会在驱动程序更新时更新其发布的 IOCTL 列表。 不过,OEM 应确保将这些更新纳入其 SEPolicy 中,并根据需要将任何选定的自定义 IOCTL 添加到列表中。
此变更会自动应用于所有在售 Pixel 设备,还是需要用户执行操作来切换某些设置才能应用此变更? 此变更适用于所有使用 Mali GPU 的 Pixel 在售设备(Pixel 6-9)。用户无需采取任何行动即可应用此变更。
使用此政策是否会影响内核驱动程序的性能? 此政策已在 Mali GPU 上使用 GFXBench 进行了测试,未观察到 GPU 性能发生可测量的变化。
IOCTL 列表是否必须与当前用户空间和内核驱动程序版本保持一致? 是的,允许的 IOCTL 列表必须与用户空间和内核驱动程序支持的 IOCTL 同步。如果用户空间或内核驱动程序中的 IOCTL 发生更新,则 SEPolicy IOCTL 列表也必须进行更新以保持一致。
ARM 已将 IOCTL 分类为“受限”/“插桩”,但我们希望在生产用例中使用其中一些 IOCTL,和/或拒绝其他 IOCTL。 各个 OEM/SoC 负责根据其用户空间 Mali 库的配置,决定如何对所使用的 IOCTL 进行分类。 ARM 的列表可用于帮助确定这些设置,但每个 OEM/SoC 的用例可能有所不同。
Confidentialité
Android 16 (niveau d'API 36) inclut les modifications suivantes concernant la confidentialité.
Autorisation d'accès au réseau local
任何拥有 INTERNET 权限的应用都可以访问 LAN 中的设备。
这让应用可以轻松连接到本地设备,但也会带来隐私问题,例如生成用户指纹,以及推断出位置信息。
本地网络保护项目旨在通过新的运行时权限控制对本地网络的访问,从而保护用户隐私。
发布计划
此项变更将在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须在 25Q2 遵循此指南并分享反馈,因为这些保护措施将在后续 Android 版本中强制执行。 此外,他们还需要根据以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。
影响
在当前阶段,LNP 是一项选择性启用的功能,这意味着只有选择启用该功能的应用才会受到影响。选择启用阶段的目标是让应用开发者了解其应用的哪些部分依赖于隐式本地网络访问,以便他们可以准备在下一个版本中为其设置权限保护。
如果应用使用以下方式访问用户的本地网络,则会受到影响:
- 在本地网络地址上直接或通过库使用原始套接字(例如 mDNS 或 SSDP 服务发现协议)
- 使用访问本地网络的框架级类(例如 NsdManager)
发往和来自本地网络地址的流量需要本地网络访问权限。下表列出了一些常见情况:
| 应用底层网络操作 | 需要本地网络权限 |
|---|---|
| 建立传出 TCP 连接 | 是 |
| 接受传入的 TCP 连接 | 是 |
| 发送 UDP 单播、多播、广播 | 是 |
| 接收传入的 UDP 单播、多播、广播 | 是 |
这些限制在网络栈深处实现,因此适用于所有网络 API。这包括在原生或托管代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及在这些库之上实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)需要本地网络权限。
上述规则的例外情况:
- 如果设备的 DNS 服务器位于本地网络中,则进出该服务器(通过端口 53)的流量不需要本地网络访问权限。
- 使用输出切换器作为应用内选择器的应用不需要本地网络权限(更多指南将于 2025 年第 4 季度发布)。
开发者指南(选择启用)
如需选择启用本地网络限制,请执行以下操作:
- 将设备刷写到搭载 25Q2 Beta 3 或更高版本的 build。
- 安装要测试的应用。
在 adb 中切换 Appcompat 标志:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>重启设备
现在,您的应用对本地网络的访问权限受到限制,任何访问本地网络的尝试都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如 NsdManager),则在选择启用阶段不会受到影响。
如需恢复访问权限,您必须向应用授予NEARBY_WIFI_DEVICES权限。
- 确保应用在其清单中声明
NEARBY_WIFI_DEVICES权限。 - 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许。
现在,您的应用对本地网络的访问权限应该已恢复,并且所有场景都应该像选择启用该应用之前一样正常运行。
本地网络保护强制执行后,应用网络流量将受到以下影响。
| 权限 | 出站 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) 也被归类为本地网络地址。
Photos appartenant à l'application
当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。