Changements de comportement: applications ciblant Android 16 ou version ultérieure

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 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, quel que soit le 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 du mode bord à bord

Android 15 a appliqué le mode bord à bord pour les applications ciblant Android 15 (niveau d'API 35), mais votre application pouvait le désactiver 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 le mode bord à bord.

  • Si votre application cible Android 16 (niveau d'API 36) et s'exécute sur un appareil Android 15, R.attr#windowOptOutEdgeToEdgeEnforcement continue de fonctionner.
  • Si votre application cible Android 16 (niveau d'API 36) et s'exécute sur un appareil Android 16, R.attr#windowOptOutEdgeToEdgeEnforcement est désactivé.

Pour effectuer des tests dans Android 16, assurez-vous que votre application est compatible avec le mode bord à bord et supprimez toute utilisation de R.attr#windowOptOutEdgeToEdgeEnforcement afin qu'elle soit également compatible avec le mode bord à bord sur un appareil Android 15. Pour prendre en charge le mode bord à bord, consultez les conseils concernant Compose et les vues.

Migration ou désactivation requises pour la prévisualisation du 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, multi-activités et multitâches) 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 Retour et que vous n'avez pas encore migré vers la prévisualisation du geste Retour, mettez à jour votre application pour qu'elle utilise les API de retour en arrière compatibles ou désactivez temporairement la prévisualisation en définissant l'attribut android:enableOnBackInvokedCallback sur false dans la balise <application> ou <activity> du fichier AndroidManifest.xml de votre application.

Animation pour la prévisualisation du Retour à l'écran d'accueil.
Animation prédictive multi-activités.
�Animation prédictive multi-tâches.

API de police élégante obsolètes et désactivées

Les applications ciblant Android 15 (niveau d'API 35) ont l'attribut elegantTextHeight TextView défini sur true par défaut, ce qui remplace la police compacte par une police beaucoup plus lisible. Vous pouvez remplacer ce comportement en définissant l'attribut elegantTextHeight sur false.

Android 16 abandonne l'attribut elegantTextHeight, qui sera ignoré une fois que votre application ciblera Android 16. Les "UI fonts" contrôlées par ces API sont abandonnées. Vous devez donc adapter toutes les mises en page pour assurer un rendu de texte cohérent et pérenne en arabe, en lao, en birman, en tamoul, en gujarati, en kannada, en malayalam, en odia, en télougou ou en thaï.

Comportement de
elegantTextHeight
pour les applications ciblant Android 14 (niveau d'API 34) ou version antérieure, ou pour les applications ciblant Android 15 (niveau d'API 35) qui ont remplacé la valeur par défaut en définissant l'attribut elegantTextHeight sur false.
Comportement de elegantTextHeight pour les applications ciblant Android 16 (niveau d'API 36) ou pour les applications ciblant Android 15 (niveau d'API 35) qui n'ont pas remplacé la valeur par défaut en définissant l'attribut elegantTextHeight sur false.

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 du travail à taux 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 le redimensionnement limité entravent 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 davantage de recréations d'activités, 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'interface utilisateur 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 :

Les valeurs suivantes pour screenOrientation, setRequestedOrientation() et getRequestedOrientation() sont ignorées :

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

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 sont ignorées par défaut sur les grands écrans. Toute application qui n'est pas entièrement prête peut temporairement annuler ce comportement en le désactivant, ce qui rétablit le comportement précédent, à savoir le 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 dont la taille est inférieure à 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 la désactiver complètement 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 remise en forme.

Autorisations de santé et de remise en forme

Pour les applications ciblant Android 16 (niveau d'API 36) ou une version ultérieure, BODY_SENSORS les autorisations 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 correspondante android.permissions.health. Cela affecte les types de données, les API et les types de services de premier plan suivants :

Si votre application utilise ces API, elle doit demander les autorisations granulaires respectives :

Ces autorisations sont identiques à celles qui protègent l'accès à la lecture des données de Santé Connect, le magasin de données Android pour les données de santé, de remise en forme et de bien-être.

Applications mobiles

Les applications mobiles qui migrent pour utiliser READ_HEART_RATE et d'autres autorisations granulaires doivent également déclarer une activité pour afficher les règles de confidentialité de l'application. Il s'agit de la même exigence 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

作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。

以 Android 16 为目标平台的应用现在可以:

  • 在检测到远程键盘连接丢失时接收 ACTION_KEY_MISSING intent,以便提供更具信息量的用户反馈并采取适当的措施。
  • 每当链接的加密状态发生变化时,都会收到 ACTION_ENCRYPTION_CHANGE intent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到 ACTION_ENCRYPTION_CHANGE intent 时成功加密了链接,则必须将该绑定视为已恢复。

适应不同的 OEM 实现

虽然 Android 16 引入了这些新 intent,但其实现和广播可能会因不同的设备制造商 (OEM) 而异。为了确保您的应用在所有设备上都能提供一致且可靠的体验,开发者应设计其绑定丢失处理机制,以妥善适应这些潜在的变化。

我们建议您采用以下应用行为:

  • 如果广播 ACTION_KEY_MISSING intent:

    系统会断开 ACL(异步无连接)链接,但会保留设备的配对信息(如此处所述)。

    您的应用应将此 intent 用作检测配对丢失的主要信号,并在发起设备忘记或重新配对之前引导用户确认远程设备是否在范围内。

    如果设备在收到 ACTION_KEY_MISSING 后断开连接,您的应用应谨慎重新连接,因为设备可能已不再与系统绑定。

  • 如果未广播 ACTION_KEY_MISSING intent:

    ACL 链接将保持连接状态,系统会移除设备的配对信息,与 Android 15 中的行为相同。

    在这种情况下,您的应用应继续使用与之前的 Android 版本相同的现有配对丢失处理机制,以检测和管理配对丢失事件。

Nouvelle façon de supprimer l'association Bluetooth

现在,以 Android 16 为目标平台的所有应用都可以使用 CompanionDeviceManager 中的公共 API 解除蓝牙设备配对。如果配套设备作为 CDM 关联进行管理,则应用可以在关联的设备上使用新的 removeBond(int) API 触发蓝牙配对的移除。该应用可以通过监听蓝牙设备广播事件 ACTION_BOND_STATE_CHANGED 来监控配对状态变化。

Sécurité

Android 16 (niveau d'API 36) inclut les modifications de sécurité suivantes.

Verrouillage de la version MediaStore

对于以 Android 16 或更高版本为目标平台的应用,MediaStore#getVersion() 现在将是每个应用的唯一标识。这会从版本字符串中移除标识属性,以防止滥用和用于指纹识别技术。应用不应对此版本的格式做出任何假设。在使用此 API 时,应用应已处理版本变更,并且在大多数情况下无需更改其当前行为,除非开发者尝试推断超出此 API 预期范围的其他信息。

Intents plus sûrs

La fonctionnalité Safer Intents 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 d'envoi. Désormais, avec Android 16, le contrôle est transféré à l'application de réception, ce qui permet aux développeurs d'activer la résolution stricte des intents à l'aide du fichier manifeste de leur application.

Deux modifications importantes sont mises en place :

  1. 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.

  2. 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 dans 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

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é Intentions plus sûres et ses avantages.
  • choisissent activement d'intégrer des pratiques de gestion des intentions plus strictes 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 des intents moins sécurisé.

Bien que l'impact initial dans Android 16 puisse être limité, l'initiative Safer Intents prévoit une feuille de route pour un impact plus large dans les futures versions d'Android. L'objectif est de faire de la résolution stricte de l'intention 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 l'application obligatoire doivent être gérées avec soin pour résoudre les éventuels problèmes de compatibilité avec les applications existantes.

Implémentation

Les développeurs doivent activer explicitement la correspondance d'intent plus stricte à 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/désactivable sur 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 indicateurs acceptés :

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 indicateurs, les valeurs conflictuelles sont résolues en donnant la priorité à l'indicateur "none" (aucun).
allowNullAction Assouplit les règles de correspondance pour autoriser la correspondance des intents sans action. Cette option doit être utilisée conjointement avec "enforceIntentFilter" pour obtenir un comportement spécifique.

Tester et déboguer

Lorsque l'application de la règle est active, les applications doivent fonctionner correctement si l'appelant d'intent a correctement renseigné l'intent. Toutefois, les intents bloqués déclenchent des messages d'avertissement dans le journal, comme "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 du GPU

Pour renforcer la surface du GPU Mali, les IOCTL du GPU Mali qui ont été abandonnés ou qui sont destinés uniquement au développement du GPU ont été bloqués dans les versions de production. De plus, les IOCTL utilisés pour le profilage du GPU ont été limités au processus shell ou aux applications débogables. Pour en savoir plus sur la stratégie au niveau de la plate-forme, consultez la mise à jour du SAC.

Cette modification s'applique aux appareils Pixel qui utilisent le GPU Mali (Pixel 6 à 9). Arm a fourni une catégorisation officielle de ses IOCTL dans Documentation/ioctl-categories.rst de sa version r54p2. Cette liste continuera d'être mise à jour dans les futures versions des pilotes.

Cette modification n'a aucune incidence sur les API graphiques compatibles (y compris Vulkan et OpenGL) et ne devrait pas avoir d'impact sur les développeurs ni sur les applications existantes. Les outils de profilage du GPU tels que Streamline Performance Analyzer et Android GPU Inspector ne seront pas affectés.

Tests

Si vous voyez un refus SELinux semblable à celui-ci, il est probable que votre application ait été affectée par cette modification :

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

Si votre application doit utiliser des IOCTL bloqués, veuillez signaler un bug et l'attribuer à android-partner-security@google.com.

Questions fréquentes

  1. Cette modification de stratégie s'applique-t-elle à tous les OEM ? Cette modification sera facultative, mais disponible pour tous les OEM qui souhaitent utiliser cette méthode de renforcement. Vous trouverez les instructions pour implémenter la modification dans la documentation sur l'implémentation.

  2. Est-il obligatoire d'apporter des modifications au codebase OEM pour implémenter cela, ou est-ce inclus par défaut dans une nouvelle version AOSP ? La modification au niveau de la plate-forme sera fournie par défaut avec une nouvelle version AOSP. Les fournisseurs peuvent choisir d'activer cette modification dans leur codebase s'ils le souhaitent.

  3. Les SoC sont-ils responsables de la mise à jour de la liste IOCTL ? Par exemple, si mon appareil utilise un GPU ARM Mali, dois-je contacter ARM pour toute modification ? Les SoC individuels doivent mettre à jour leurs listes IOCTL par appareil lors de la publication des pilotes. Par exemple, ARM actualisera sa liste IOCTL publiée lors des mises à jour des pilotes. Toutefois, les OEM doivent s'assurer d'intégrer les mises à jour dans leur SEPolicy et d'ajouter les IOCTL personnalisés sélectionnés aux listes, si nécessaire.

  4. Cette modification s'applique-t-elle automatiquement à tous les appareils Pixel disponibles sur le marché, ou une action de l'utilisateur est-elle requise pour activer une option afin d'appliquer cette modification ? Cette modification s'applique à tous les appareils Pixel disponibles sur le marché qui utilisent le GPU Mali (Pixel 6 à 9). Aucune action de l'utilisateur n'est requise pour appliquer cette modification.

  5. L'utilisation de cette stratégie aura-t-elle un impact sur les performances du pilote du kernel ? Cette stratégie a été testée sur le GPU Mali à l'aide de GFXBench, et aucune modification mesurable des performances du GPU n'a été observée.

  6. La liste IOCTL doit-elle correspondre aux versions actuelles de l'espace utilisateur et du pilote du kernel ? Oui, la liste des IOCTL autorisés doit être synchronisée avec les IOCTL compatibles avec les pilotes de l'espace utilisateur et du kernel. Si les IOCTL dans l'espace utilisateur ou le pilote du kernel sont mis à jour, la liste des IOCTL SEPolicy doit être mise à jour pour correspondre.

  7. ARM a classé les IOCTL comme "restreints"/"instrumentation", mais nous souhaitons en utiliser certains en production et/ou en refuser d'autres. Il incombe à chaque OEM/SoC de décider comment catégoriser les IOCTL qu'ils utilisent, en fonction de la configuration de leurs bibliothèques Mali de l'espace utilisateur. La liste ARM peut vous aider à prendre ces décisions, mais le cas d'utilisation de chaque OEM/SoC peut être différent.

Confidentialité

Android 16 (niveau d'API 36) inclut les modifications de confidentialité suivantes.

Autorisation d'accès au réseau local

Les applications disposant de l'autorisation INTERNET peuvent accéder aux appareils du réseau local. Cela permet aux applications de se connecter facilement aux appareils locaux, mais cela a également des implications en termes de confidentialité, comme la création d'une empreinte digitale de l'utilisateur et le fait d'être un proxy pour la localisation.

Le projet Local Network Protections vise à protéger la confidentialité de l'utilisateur en limitant l'accès au réseau local par une nouvelle autorisation d'exécution.

Plan de publication

Ce changement sera déployé entre deux versions, 25Q2 et 26Q2 respectivement. Il est impératif que les développeurs suivent ces conseils pour le T2 2025 et partagent leurs commentaires, car ces protections seront appliquées dans une version ultérieure d'Android. De plus, ils devront mettre à jour les scénarios qui dépendent de l'accès implicite au réseau local en suivant les conseils ci-dessous et se préparer au refus et à la révocation de la nouvelle autorisation par les utilisateurs.

Impact

À l'heure actuelle, la LNP est une fonctionnalité optionnelle, ce qui signifie que seules les applications qui l'activent seront concernées. L'objectif de la phase d'activation est de permettre aux développeurs d'applications de comprendre quelles parties de leur application dépendent de l'accès implicite au réseau local afin qu'ils puissent se préparer à les protéger par des autorisations pour la prochaine version.

Les applications seront affectées si elles accèdent au réseau local de l'utilisateur à l'aide des éléments suivants :

  • Utilisation directe ou via une bibliothèque de sockets bruts sur des adresses de réseau local (par exemple, le protocole de découverte de services mDNS ou SSDP)
  • Utilisation de classes au niveau du framework qui accèdent au réseau local (par exemple, NsdManager)

Le trafic vers et depuis une adresse réseau locale nécessite l'autorisation d'accès au réseau local. Le tableau suivant liste certains cas courants :

Opération réseau de bas niveau de l'application Autorisation d'accéder au réseau local requise
Établir une connexion TCP sortante oui
Accepter les connexions TCP entrantes oui
Envoyer une monodiffusion, une multidiffusion ou une diffusion UDP oui
Réception d'un unicast, d'un multicast ou d'un broadcast UDP entrant oui

Ces restrictions sont implémentées en profondeur dans la pile réseau et s'appliquent donc à toutes les API réseau. Cela inclut les sockets créés dans du code natif ou géré, les bibliothèques réseau telles que Cronet et OkHttp, ainsi que toutes les API implémentées par-dessus. Pour résoudre les services sur le réseau local (c'est-à-dire ceux avec un suffixe .local), vous aurez besoin de l'autorisation d'accès au réseau local.

Exceptions aux règles ci-dessus :

  • Si le serveur DNS d'un appareil se trouve sur un réseau local, le trafic vers ou depuis celui-ci (sur le port 53) ne nécessite pas d'autorisation d'accès au réseau local.
  • Les applications qui utilisent le sélecteur de sortie comme sélecteur intégré n'auront pas besoin d'autorisations d'accès au réseau local (plus d'informations seront disponibles au quatrième trimestre 2025).

Conseils pour les développeurs (activation)

Pour activer les restrictions d'accès au réseau local :

  1. Flashez l'appareil avec une version 25Q2 bêta 3 ou ultérieure.
  2. Installez l'application à tester.
  3. Activez ou désactivez le flag Appcompat dans adb :

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Redémarrez l'appareil.

L'accès de votre application au réseau local est désormais limité. Toute tentative d'accès au réseau local entraînera des erreurs de socket. Si vous utilisez des API qui effectuent des opérations sur le réseau local en dehors du processus de votre application (par exemple, NsdManager), elles ne seront pas affectées pendant la phase d'activation.

Pour restaurer l'accès, vous devez accorder à votre application l'autorisation NEARBY_WIFI_DEVICES.

  1. Assurez-vous que l'application déclare l'autorisation NEARBY_WIFI_DEVICES dans son fichier manifeste.
  2. Accédez à Paramètres > Applications > [Nom de l'application] > Autorisations > Appareils à proximité > Autoriser.

L'accès de votre application au réseau local devrait maintenant être rétabli, et tous vos scénarios devraient fonctionner comme avant l'activation de l'application.

Une fois l'application de la protection du réseau local commencée, voici comment le trafic réseau de l'application sera affecté.

Autorisation Demande LAN sortante Requête Internet sortante/entrante Demande LAN entrante
Accordé YouTube YouTube YouTube
Refusé Gags YouTube Gags

Utilisez la commande suivante pour désactiver le flag App-Compat.

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Erreurs

Les erreurs découlant de ces restrictions seront renvoyées au socket appelant chaque fois qu'il invoque l'envoi ou une variante d'envoi à une adresse réseau locale.

Exemples d'erreurs :

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Définition du réseau local

Dans ce projet, un réseau local fait référence à un réseau IP qui utilise une interface réseau compatible avec la diffusion, telle que le Wi-Fi ou Ethernet, mais exclut les connexions cellulaires (WWAN) ou VPN.

Les réseaux suivants sont considérés comme des réseaux locaux :

IPv4 :

  • 169.254.0.0/16 // Liaison locale
  • 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 :

  • Liaison locale
  • Routes directement connectées
  • Réseaux stub tels que Thread
  • Sous-réseaux multiples (à déterminer)

De plus, les adresses de multidiffusion (224.0.0.0/4, ff00::/8) et l'adresse de diffusion IPv4 (255.255.255.255) sont classées comme adresses réseau locales.

Photos appartenant à l'application

当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。