Comme les versions précédentes, Android 17 apporte des modifications de comportement pouvant affecter votre application. Les modifications de comportement suivantes s'appliquent exclusivement aux applications qui ciblent Android 17 ou version ultérieure. Si votre application cible Android 17 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 17, peu importe la targetSdkVersion de votre application.
Fonctionnalité de base
Android 17 inclut les modifications suivantes qui modifient ou étendent diverses fonctionnalités de base du système Android.
Nouvelle implémentation sans verrouillage de MessageQueue
从 Android 17 开始,以 Android 17(API 级别 37)
或更高版本为目标平台的应用会收到
android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。
如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南。
Les champs statiques finals ne sont plus modifiables
Les applications exécutées sur Android 17 ou version ultérieure qui ciblent Android 17 (niveau d'API 37) ou version ultérieure ne peuvent pas modifier les champs static final. Si une application tente de modifier un champ static final à l'aide de la réflexion, cela entraînera une IllegalAccessException. Toute tentative de modification de l'un de ces champs via les API JNI (telles que SetStaticLongField()) entraînera le plantage de l'application.
Accessibilité
Android 17 apporte les modifications suivantes pour améliorer l'accessibilité.
Prise en charge de l'accessibilité pour la saisie au clavier physique IME complexe
Cette fonctionnalité introduit de nouvelles AccessibilityEvent et TextAttribute
API pour améliorer le retour vocal du lecteur d'écran pour la saisie de langues CJKV. Les applications IME CJKV peuvent désormais indiquer si un candidat de conversion de texte a été sélectionné lors de la composition de texte. Les applications avec des champs de modification peuvent spécifier des types de modification de texte lors de l'envoi d'événements d'accessibilité de texte modifié.
Par exemple, les applications peuvent spécifier qu'une modification de texte s'est produite lors de la composition de texte ou qu'elle résulte d'un commit.
Cela permet aux services d'accessibilité tels que les lecteurs d'écran de fournir des commentaires plus précis en fonction de la nature de la modification du texte.
Nombre d'applications utilisant le SDK
Applications IME : lors de la définition de la composition de texte dans les champs de modification, les IME peuvent utiliser
TextAttribute.Builder.setTextSuggestionSelected()pour indiquer si un candidat de conversion spécifique a été sélectionné.Applications avec des champs de modification : les applications qui gèrent un
InputConnectionpersonnalisé peuvent récupérer les données de sélection des candidats en appelantTextAttribute.isTextSuggestionSelected(). Ces applications doivent ensuite appelerAccessibilityEvent.setTextChangeTypes()lors de la distribution d'événementsTYPE_VIEW_TEXT_CHANGED. Cette fonctionnalité est activée par défaut pour les applications ciblant Android 17 (niveau d'API 37) qui utilisent leTextViewstandard. (Autrement dit,TextViewgère la récupération des données de l'IME et la définition des types de modification de texte lors de l'envoi d'événements aux services d'accessibilité.)Services d'accessibilité : les services d'accessibilité qui traitent les événements
TYPE_VIEW_TEXT_CHANGEDpeuvent appelerAccessibilityEvent.getTextChangeTypes()pour identifier la nature de la modification et ajuster leurs stratégies de commentaires en conséquence.
Confidentialité
Android 17 inclut les modifications suivantes pour améliorer la confidentialité des utilisateurs.
Activation d'ECH (Encrypted Client Hello)
Android 17 引入了对加密客户端问候 (ECH) 的平台支持。ECH 是一种 TLS 扩展,可通过加密 TLS 握手中的服务器名称指示 (SNI) 来增强用户隐私保护。这种加密有助于防止网络观察者轻松识别您的应用所连接的特定网域。
对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,ECH 用于 TLS 连接。只有当应用使用的网络库(例如 HttpEngine、WebView 或 OkHttp)已集成 ECH 支持,并且远程服务器也支持 ECH 协议时,ECH 才会处于活跃状态。如果无法协商 ECH,客户端会发送一个包含随机内容的 ECH 扩展(一种称为 ECH GREASE 的机制)。如需详细了解 ECH GREASE 的工作原理,请参阅 RFC 9849。
为了让应用能够自定义此行为,Android 17 向网络安全配置文件添加了一个新的
<domainEncryption> 元素。
开发者可以在 <base-config> 或
<domain-config> 标记中使用 <domainEncryption>,以全局或按网域的方式选择 ECH 模式(例如
"enabled" 或 "disabled")。
如需了解详情,请参阅加密客户端问候文档。
Autorisation de réseau local requise pour les applications ciblant Android 17
Android 17 introduit l'autorisation d'exécution ACCESS_LOCAL_NETWORK pour protéger les utilisateurs contre les accès non autorisés au réseau local. Étant donné que cela relève du groupe d'autorisations NEARBY_DEVICES existant, les utilisateurs qui ont déjà accordé d'autres autorisations NEARBY_DEVICES ne sont pas à nouveau invités à le faire. Cette nouvelle exigence empêche les applications malveillantes d'exploiter l'accès illimité au réseau local pour le suivi des utilisateurs et le fingerprinting secrets. En déclarant et en demandant cette autorisation, votre application peut découvrir des appareils sur le réseau local (LAN), tels que des appareils connectés ou des récepteurs de diffusion, et s'y connecter.
Les applications ciblant Android 17 (niveau d'API 37) ou version ultérieure ont désormais deux façons de maintenir la communication avec les appareils du réseau local : adopter des sélecteurs d'appareils protégeant la confidentialité et gérés par le système pour éviter l'invite d'autorisation, ou demander explicitement cette nouvelle autorisation au moment de l'exécution pour maintenir la communication sur le réseau local.
Pour en savoir plus, consultez la documentation sur l'autorisation du réseau local.
Masquage des mots de passe sur les appareils physiques
Si une application cible Android 17 (niveau d'API 37) ou une version ultérieure et que l'utilisateur utilise un périphérique d'entrée physique (par exemple, un clavier externe), le système d'exploitation Android applique le nouveau paramètre show_passwords_physical à tous les caractères du champ de mot de passe. Par défaut, ce paramètre masque tous les caractères du mot de passe.
Le système Android affiche le dernier caractère du mot de passe saisi pour aider l'utilisateur à voir s'il a fait une erreur de frappe. Toutefois, cela est beaucoup moins nécessaire avec les grands claviers externes. De plus, les appareils dotés de claviers externes ont souvent des écrans plus grands, ce qui augmente le risque que quelqu'un voie le mot de passe saisi.
Si l'utilisateur utilise l'écran tactile de l'appareil, le système applique le nouveau paramètre show_passwords_touch.
Protection OTP pour les messages SMS standards
À partir d'Android 17, Android étend sa protection des OTP par SMS aux messages SMS standards (messages SMS contenant un OTP qui n'utilisent pas les formats WebOTP ni SMS Retriever). Pour la plupart des applications ciblant Android 17 (niveau d'API 37) ou une version ultérieure, ces messages SMS ne sont disponibles que trois heures après leur réception. Ce délai vise à empêcher le piratage des OTP. Pendant ce délai de trois heures, la
SMS_RECEIVED_ACTION diffusion est bloquée et
les requêtes de base de données du fournisseur de SMS sont filtrées. Le message SMS est disponible pour ces applications après le délai.
Certaines applications, telles que l'application d'assistance SMS par défaut, les applications associées aux appareils connectés, etc., sont exemptées de ce délai. Toutes les applications qui s'appuient sur la lecture de messages SMS pour l'extraction d'OTP doivent passer à l'utilisation des API SMS Retriever ou SMS User Consent pour garantir la continuité de leur fonctionnement.
Sécurité
Android 17 apporte les améliorations suivantes à la sécurité des appareils et des applications.
Sécurité des activités
在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解网络钓鱼、互动劫持和混淆代理攻击等高严重性漏洞的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。
对开发者的主要影响包括:
- BAL 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到
IntentSender。开发者必须从旧版MODE_BACKGROUND_ACTIVITY_START_ALLOWED常量迁移。相反,您应 采用精细控制,例如MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。 - 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。
Activation de CT par défaut
Si une application cible Android 17 (niveau d'API 37) ou version ultérieure, la transparence des certificats (CT) est activée par défaut. (Sur Android 16, la CT est disponible, mais les applications doivent l'activer.)
DCL natif plus sûr : C
如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。
使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。
Limitation des champs d'informations personnelles dans la vue de données CP2
对于以 Android 17(API 级别 Android 17(API 级别 37))及更高版本为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,这些列将从数据视图中移除,以增强用户隐私保护。 受限列包括:
如果应用正在使用 ContactsContract.Data
中的这些列,则可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts
中提取这些列。
Application de vérifications SQL strictes dans CP2
Pour les applications ciblant Android 17 (niveau d'API 37) ou version ultérieure, Contacts Provider 2 (CP2) applique une validation stricte des requêtes SQL lorsque la table ContactsContract.Data est consultée sans l'autorisation READ_CONTACTS.
Avec ce changement, si une application ne dispose pas de l'autorisation READ_CONTACTS, les options StrictColumns et StrictGrammar sont définies lors de l'interrogation de la table ContactsContract.Data. Si une requête utilise un modèle qui n'est pas compatible avec ceux-ci, elle sera refusée et une exception sera générée.
Contenus multimédias
Android 17 inclut les modifications suivantes concernant le comportement des contenus multimédias.
Renforcement de l'audio en arrière-plan
À partir d'Android 17, le framework audio applique des restrictions sur les interactions audio en arrière-plan, y compris la lecture audio, les requêtes de priorité audio et les API de modification du volume, afin de s'assurer que ces modifications sont lancées intentionnellement par l'utilisateur.
Certaines restrictions audio s'appliquent à toutes les applications. Toutefois, les restrictions sont plus strictes si une application cible Android 17 (niveau d'API 37). Si l'une de ces applications interagit avec l'audio en arrière-plan, elle doit exécuter un service de premier plan. De plus, l'application doit répondre à une ou aux deux exigences suivantes :
- Le service de premier plan doit disposer de fonctionnalités "pendant l'utilisation" (WIU, while-in-use).
- L'application doit disposer de l'autorisation Alarme exacte et interagir avec les flux audio
USAGE_ALARM.
Pour en savoir plus, y compris sur les stratégies d'atténuation, consultez Renforcement de la sécurité de l'audio en arrière-plan.
Facteurs de forme d'appareil
Android 17 inclut les modifications suivantes pour améliorer l'expérience utilisateur sur une gamme de tailles et de facteurs de forme d'appareils.
Modifications de l'API de la plate-forme pour ignorer les contraintes d'orientation, de redimensionnement et de format sur les grands écrans (sw>=600dp)
Dans Android 16, nous avons apporté des modifications aux API de plate-forme pour ignorer les restrictions d'orientation, de format et de redimensionnement sur les grands écrans (sw >= 600 dp) pour les applications ciblant le niveau d'API 36 ou supérieur. Les développeurs ont la possibilité de désactiver ces modifications avec le SDK 36, mais cette option ne sera plus disponible pour les applications ciblant Android 17 (niveau d'API 37) ou version ultérieure.
Pour en savoir plus, consultez Les restrictions concernant l'orientation et le redimensionnement sont ignorées.
Connectivité
Android 17 introduit la modification suivante pour améliorer la cohérence et s'aligner sur le comportement standard InputStream Java pour les sockets RFCOMM Bluetooth.
Comportement cohérent de BluetoothSocket read() pour RFCOMM
Pour les applications ciblant Android 17 (niveau d'API 37), la
read() méthode de l'InputStream obtenue à partir d'un
BluetoothSocket basé sur RFCOMM renvoie désormais -1 lorsque le
socket est fermé ou que la connexion est interrompue.
Cette modification rend le comportement du socket RFCOMM cohérent avec les sockets LE CoC et
s'aligne sur la documentation standard InputStream.read(), qui indique que -1 est renvoyé lorsque la fin du flux est
atteinte.
Les applications qui reposent uniquement sur l'interception d'une IOException pour sortir d'une boucle de lecture peuvent être affectées par cette modification et doivent mettre à jour les boucles de lecture BluetoothSocket pour vérifier explicitement une valeur de retour de -1. Cela garantit que la boucle se termine correctement lorsque l'appareil distant se déconnecte ou que le socket est fermé. Pour obtenir un
exemple de l'implémentation recommandée, consultez l'
extrait de code du guide Transférer des données Bluetooth.