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

A partire da Android 17, le app che hanno come target Android 17 (livello API 37) o versioni successive ricevono una nuova implementazione senza blocchi di android.os.MessageQueue. La nuova implementazione migliora il rendimento e riduce i frame mancanti, ma potrebbe interrompere i client che riflettono su campi e metodi privati di MessageQueue.

Per ulteriori informazioni, incluse le strategie di mitigazione, consulta la guida al cambiamento del comportamento di 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 introduce l'autorizzazione di runtime ACCESS_LOCAL_NETWORK per proteggere gli utenti da accessi non autorizzati alla rete locale. Poiché rientra nel gruppo di autorizzazioni NEARBY_DEVICES esistente, agli utenti che hanno già concesso altre autorizzazioni NEARBY_DEVICES non viene richiesto di nuovo. Questo nuovo requisito impedisce alle app dannose di sfruttare l'accesso illimitato alla rete locale per il monitoraggio utenti e il fingerprinting. Se dichiara e richiede questa autorizzazione, la tua app può rilevare e connettersi a dispositivi sulla rete locale (LAN), come dispositivi per la smart home o ricevitori di trasmissione.

Le app che hanno come target Android 17 (livello API 37) o versioni successive ora hanno due modi per mantenere la comunicazione con i dispositivi LAN: adottare selettori di dispositivi che tutelano la privacy e sono mediati dal sistema per saltare la richiesta di autorizzazione oppure richiedere esplicitamente questa nuova autorizzazione in fase di runtime per mantenere la comunicazione con la rete locale.

Per saperne di più, consulta la documentazione relativa all'autorizzazione di accesso alla rete locale.

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

A partire da Android 17, Android estende la protezione OTP via SMS per applicarla ai messaggi SMS standard (messaggi SMS contenenti un OTP che non utilizzano i formati WebOTP o SMS Retriever). Per la maggior parte delle app che hanno come target Android 17 (livello API 37) o versioni successive, questi messaggi SMS non diventano disponibili fino a tre ore dopo la ricezione. Questo ritardo ha lo scopo di prevenire il furto di OTP. Durante questo ritardo di tre ore, la trasmissione SMS_RECEIVED_ACTION viene sospesa e le query del database del fornitore di SMS vengono filtrate. Il messaggio SMS è disponibile per queste app dopo il ritardo.

Alcune app, come l'app assistente SMS predefinita, le app companion per dispositivi connessi e così via, sono esenti da questo ritardo. Tutte le app che si basano sulla lettura dei messaggi SMS per l'estrazione di OTP devono passare all'utilizzo delle API SMS Retriever o SMS User Consent per garantire la continuità della funzionalità.

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

Per le app che hanno come target Android 17 (livello API 37) e versioni successive, Provider di contatti 2 (CP2) limita la visualizzazione di determinate colonne contenenti informazioni che consentono l'identificazione personale (PII). Quando questa modifica è abilitata, queste colonne vengono rimosse dalla visualizzazione dei dati per migliorare la privacy degli utenti. Le colonne con limitazioni includono:

Le app che utilizzano queste colonne da ContactsContract.Data possono estrarle da ContactsContract.RawContacts invece, unendole a RAW_CONTACT_ID.

Applica controlli SQL rigorosi in CP2

Per le app che hanno come target Android 17 (livello API 37) e versioni successive, Provider di contatti 2 (CP2) applica una convalida rigorosa delle query SQL quando si accede alla tabella ContactsContract.Data senza l'autorizzazione READ_CONTACTS.

Con questa modifica, se un'app non ha READ_CONTACTS autorizzazione, StrictColumns e StrictGrammar opzioni vengono impostate quando si esegue una query sulla tabella ContactsContract.Data. Se una query utilizza un pattern non compatibile con queste opzioni, verrà rifiutata e verrà generata un'eccezione.

Media

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

Protezione dell'audio in background

从 Android 17 开始,音频框架对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意启动的。

部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果这些应用在后台运行时与音频互动,则必须有前台服务正在运行。此外,应用还必须满足以下一项或两项要求:

  • 前台服务必须具有仅在使用时授予的权限 (WIU)。
  • 应用必须具有精确闹钟权限,并且正在与 USAGE_ALARM 音频流互动。

如需了解详情(包括缓解措施),请参阅后台音频安全加固

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)

In Android 16 abbiamo introdotto modifiche all'API della piattaforma per ignorare le limitazioni relative a orientamento, proporzioni e ridimensionamento sugli schermi grandi (sw >= 600 dp) per le app che hanno come target il livello API 36 o versioni successive. Gli sviluppatori hanno la possibilità di disattivare queste modifiche con l'SDK 36, ma questa opzione non sarà più disponibile per le app che hanno come target Android 17 (livello API 37) o versioni successive.

Per ulteriori informazioni, consulta Le limitazioni relative a orientamento e ridimensionamento vengono ignorate.

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

Per le app che hanno come target Android 17 (livello API 37), il metodo read() di InputStream ottenuto da un BluetoothSocket basato su RFCOMM ora restituisce -1 quando il socket è chiuso o la connessione viene interrotta.

Questa modifica rende il comportamento dei socket RFCOMM coerente con i socket LE CoC e si allinea alla documentazione standard InputStream.read(), che indica che -1 viene restituito quando viene raggiunta la fine dello stream.

Le app che si basano esclusivamente sull'intercettazione di un'eccezione IOException per uscire da un ciclo di lettura potrebbero essere interessate da questa modifica e devono aggiornare i cicli di lettura di BluetoothSocket per controllare esplicitamente un valore restituito di -1. Ciò garantisce che il ciclo termini correttamente quando il dispositivo remoto si disconnette o il socket viene chiuso. Per un esempio dell'implementazione consigliata, consulta lo snippet di codice nella guida Trasferire dati Bluetooth.