Modifiche del comportamento: app che hanno come target Android 17 o versioni successive

Come le release precedenti, Android 17 include modifiche al comportamento che potrebbero influire sulla tua app. Le seguenti modifiche al comportamento si applicano esclusivamente alle app che hanno come target Android 17 o versioni successive. Se la tua app ha come target Android 17 o versioni successive, devi modificarla per supportare questi comportamenti, ove applicabile.

Assicurati di esaminare anche l'elenco delle modifiche al comportamento che interessano tutte le app in esecuzione su Android 17, indipendentemente dal targetSdkVersion della tua app.

Funzionalità di base

Android 17 include le seguenti modifiche che modificano o espandono varie funzionalità di base del sistema Android.

Nuova implementazione di MessageQueue senza blocchi

从 Android 17 开始,以 Android 17(API 级别 37) 或更高版本为目标平台的应用会收到 android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。

如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南

I campi finali statici ora non sono modificabili

Le app in esecuzione su Android 17 o versioni successive che hanno come target Android 17 (livello API 37) o versioni successive non possono modificare i campi static final. Se un'app tenta di modificare un campo static final utilizzando la reflection, verrà generato un IllegalAccessException. Il tentativo di modificare uno di questi campi tramite le API JNI (ad es. SetStaticLongField()) causerà l'arresto anomalo dell'app.

Accessibilità

Android 17 apporta le seguenti modifiche per migliorare l'accessibilità.

Supporto dell'accessibilità per la digitazione complessa della tastiera fisica IME

Questa funzionalità introduce nuove AccessibilityEvent e TextAttribute API per migliorare il feedback vocale dello screen reader per l'input di lingue CJKV. Le app IME CJKV ora possono segnalare se è stato selezionato un candidato alla conversione del testo durante la composizione del testo. Le app con campi di modifica possono specificare i tipi di modifiche del testo quando inviano eventi di accessibilità relativi alla modifica del testo. Ad esempio, le app possono specificare che si è verificata una modifica del testo durante la composizione del testo o che una modifica del testo è il risultato di un commit. In questo modo, i servizi di accessibilità come gli screen reader possono fornire un feedback più preciso in base alla natura della modifica del testo.

Adozione di app

  • App IME: quando impostano la composizione del testo nei campi di modifica, gli IME possono utilizzare TextAttribute.Builder.setTextSuggestionSelected() per indicare se è stato selezionato un candidato alla conversione specifico.

  • App con campi di modifica: le app che gestiscono un InputConnection personalizzato possono recuperare i dati di selezione dei candidati chiamando TextAttribute.isTextSuggestionSelected(). Queste app devono quindi chiamare AccessibilityEvent.setTextChangeTypes() quando inviano eventi TYPE_VIEW_TEXT_CHANGED. Questa funzionalità è attivata per impostazione predefinita nelle app destinate ad Android 17 (livello API 37) che utilizzano TextView standard. Ovvero, TextView gestirà il recupero dei dati dall'IME e l'impostazione dei tipi di modifiche del testo quando invia eventi ai servizi di accessibilità.

  • Servizi di accessibilità: i servizi di accessibilità che elaborano gli eventi TYPE_VIEW_TEXT_CHANGED possono chiamare AccessibilityEvent.getTextChangeTypes() per identificare la natura della modifica e adeguare di conseguenza le proprie strategie di feedback.

Privacy

Android 17 include le seguenti modifiche per migliorare la privacy degli utenti.

ECH (Encrypted Client Hello) abilitato

Android 17 introduce il supporto della piattaforma per Encrypted Client Hello (ECH), un'estensione TLS che migliora la privacy degli utenti criptando l'indicazione del nome del server (SNI) nell'handshake TLS. Questa crittografia impedisce agli osservatori della rete di identificare facilmente il dominio specifico a cui si connette la tua app.

Per le app che hanno come target Android 17 (livello API 37) o versioni successive, ECH viene utilizzato per le connessioni TLS. ECH è attivo solo se la libreria di rete utilizzata dall'app (ad esempio HttpEngine, WebView o OkHttp) ha integrato il supporto ECH e il server remoto supporta anche il protocollo ECH. Se non è possibile negoziare ECH, il client invia un'estensione ECH con contenuti randomizzati (un meccanismo chiamato ECH GREASE). Per maggiori dettagli sul funzionamento di ECH GREASE, consulta RFC 9849.

Per consentire alle app di personalizzare questo comportamento, Android 17 aggiunge un nuovo elemento <domainEncryption> al file di configurazione della sicurezza di rete. Gli sviluppatori possono utilizzare <domainEncryption> all'interno dei tag <base-config> o <domain-config> per selezionare una modalità ECH (ad esempio, "enabled" o "disabled") a livello globale o per dominio.

Per saperne di più, consulta la documentazione relativa a Encrypted Client Hello.

Autorizzazione di accesso alla rete locale richiesta per le app che hanno come target Android 17

Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此系统不会再次提示已授予其他 NEARBY_DEVICES 权限的用户。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐秘的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。

以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求此新权限以保持本地网络通信。

如需了解详情,请参阅本地网络权限文档。

Nascondi le password dai dispositivi fisici

如果应用以 Android 17(API 级别 37)或更高版本为目标平台,并且用户使用的是实体输入设备(例如外接键盘),Android 操作系统会对密码字段中的所有字符应用新的 show_passwords_physical 设置。默认情况下,该设置会隐藏所有密码字符。

Android 系统会显示用户最后输入的密码字符,以帮助用户查看是否输错了密码。不过,对于较大的外接键盘,此功能就没那么必要了。此外,配备外接键盘的设备通常具有较大的显示屏,这会增加他人看到输入密码的风险。

如果用户使用的是设备触摸屏,系统会应用新的 show_passwords_touch 设置。

Protezione OTP per i messaggi SMS standard

从 Android 17 开始,Android 将扩展其短信验证码保护功能,以适用于标准短信(包含验证码但不使用 WebOTP 或 SMS Retriever 格式的短信)。对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,这些短信在收到后三小时内不会提供。此延迟旨在帮助防止动态密码劫持。在这三小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION广播,并过滤 短信提供商数据库查询。延迟结束后,这些应用即可使用短信。

某些应用(例如默认短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信 来提取动态密码的应用都应改用 SMS RetrieverSMS User Consent API,以确保功能持续可用。

Sicurezza

Android 17 apporta i seguenti miglioramenti alla sicurezza di dispositivi e app.

Sicurezza attività

在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解网络钓鱼、互动劫持和混淆代理攻击等高严重性漏洞的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。

对开发者的主要影响包括:

  • BAL 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到 IntentSender。开发者必须从旧版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常量迁移。相反,您应 采用精细控制,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。
  • 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。

Attiva CT per impostazione predefinita

Se un'app ha come target Android 17 (livello API 37) o versioni successive, la trasparenza dei certificati (CT) è attivata per impostazione predefinita. (Su Android 16, la CT è disponibile, ma le app dovevano attivare la funzionalità.)

Safer Native DCL—C

Se la tua app ha come target Android 17 (livello API 37) o versioni successive, la protezione Safer Dynamic Code Loading (DCL) introdotta in Android 14 per i file DEX e JAR ora si estende alle librerie native.

Tutti i file nativi caricati utilizzando System.load() devono essere contrassegnati come di sola lettura. In caso contrario, il sistema genera UnsatisfiedLinkError.

Ti consigliamo di evitare il caricamento dinamico del codice nelle app, quando possibile, in quanto aumenta notevolmente il rischio che un'app possa essere compromessa da un'iniezione di codice o da un'alterazione del codice.

Limitare i campi PII nella visualizzazione dei dati CP2

对于以 Android 17(API 级别 Android 17(API 级别 37))及更高版本为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,这些列将从数据视图中移除,以增强用户隐私保护。 受限列包括:

如果应用正在使用 ContactsContract.Data 中的这些列,则可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts 中提取这些列。

Applica controlli SQL rigorosi in CP2

对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,当在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表时,联系人提供程序 2 (CP2) 会强制执行严格的 SQL 查询验证。

在此项更改生效后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时会设置 StrictColumnsStrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。

Media

Android 17 include le seguenti modifiche al comportamento dei contenuti multimediali.

Protezione dell'audio in background

A partire da Android 17, il framework audio applica restrizioni alle interazioni audio in background, tra cui riproduzione audio, richieste di focus audio e API di modifica del volume, per garantire che queste modifiche vengano avviate intenzionalmente dall'utente.

Alcune restrizioni audio si applicano a tutte le app. Tuttavia, le restrizioni sono più rigorose se un'app ha come target Android 17 (livello API 37). Se una di queste app interagisce con l'audio mentre è in background, deve essere in esecuzione un servizio in primo piano. Inoltre, l'app deve soddisfare uno o entrambi i seguenti requisiti:

  • Il servizio in primo piano deve avere funzionalità di utilizzo.
  • L'app deve disporre dell'autorizzazione per gli allarmi esatti e interagire con USAGE_ALARM stream audio.

Per ulteriori informazioni, incluse le strategie di mitigazione, consulta Protezione dell'audio in background .

Fattori di forma del dispositivo

Android 17 include le seguenti modifiche per migliorare l'esperienza utente su una gamma di dimensioni e fattori di forma dei dispositivi.

Modifiche all'API della piattaforma per ignorare i vincoli di orientamento, ridimensionamento e proporzioni su schermi di grandi dimensioni (sw>=600 dp)

我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 SDK 36 退出这些变更,但对于面向 Android 17(API 级别 37)或更高级别的应用,此退出选项将不再可用。

如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制

Connettività

Android 17 introduce la seguente modifica per migliorare la coerenza e allinearsi al comportamento standard di Java InputStream per i socket RFCOMM Bluetooth.

Comportamento coerente di BluetoothSocket read() per RFCOMM

对于以 Android 17(API 级别 37)为目标平台的应用, read() 方法从InputStream 获取的 基于 RFCOMM 的 BluetoothSocket 现在会在 套接字关闭或连接断开时返回 -1

此更改使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read() 文档保持一致,该文档指出,当到达流的末尾时,系统会返回 -1

仅依赖于捕获 IOException 以跳出读取循环的应用可能会受到此更改的影响,并且应更新 BluetoothSocket 读取循环以明确检查返回值 -1。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段。