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

Come le versioni 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 senza blocco di MessageQueue

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 static final 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 della tastiera fisica IME complessa

This feature introduces new AccessibilityEvent and TextAttribute APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME apps can now signal whether a text conversion candidate has been selected during text composition. Apps with edit fields can specify text change types when sending text changed accessibility events. For example, apps can specify that a text change occurred during text composition, or that a text change resulted from a commit. Doing this enables accessibility services such as screen readers to deliver more precise feedback based on the nature of the text modification.

App adoption

  • IME Apps: When setting composing text in edit fields, IMEs can use TextAttribute.Builder.setTextSuggestionSelected() to indicate whether a specific conversion candidate was selected.

  • Apps with Edit Fields: Apps that maintain a custom InputConnection can retrieve candidate selection data by calling TextAttribute.isTextSuggestionSelected(). These apps should then call AccessibilityEvent.setTextChangeTypes() when dispatching TYPE_VIEW_TEXT_CHANGED events. Apps targeting Android 17 (API level 37) that use the standard TextView will have this feature enabled by default. (That is, TextView will handle retrieving data from the IME and setting text change types when sending events to accessibility services).

  • Accessibility Services: Accessibility services that process TYPE_VIEW_TEXT_CHANGED events can call AccessibilityEvent.getTextChangeTypes() to identify the nature of the modification and adjust their feedback strategies accordingly.

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

Se un'app ha come target Android 17 (livello API 37) o versioni successive e l'utente utilizza un dispositivo di input fisico (ad esempio, una tastiera esterna), il sistema operativo Android applica la nuova impostazione show_passwords_physical a tutti i caratteri nel campo della password. Per impostazione predefinita, questa impostazione nasconde tutti i caratteri della password.

Il sistema Android mostra l'ultimo carattere della password digitata per aiutare l'utente a capire se ha digitato la password in modo errato. Tuttavia, questo è molto meno necessario con le tastiere esterne più grandi. Inoltre, i dispositivi con tastiere esterne spesso hanno display più grandi, il che aumenta il pericolo che qualcuno veda la password digitata.

Se l'utente utilizza il touchscreen del dispositivo, il sistema applica la nuova impostazione 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 app e dispositivi.

Sicurezza delle attività

In Android 17, la piattaforma continua il suo passaggio a un'architettura "sicura per impostazione predefinita", introducendo una serie di miglioramenti progettati per mitigare gli exploit di gravità elevata come phishing, hijacking dell'interazione e attacchi confused deputy. Questo aggiornamento richiede agli sviluppatori di attivare esplicitamente i nuovi standard di sicurezza per mantenere la compatibilità dell'app e la protezione degli utenti.

I principali impatti per gli sviluppatori includono:

  • Rafforzamento di BAL e miglioramento dell'attivazione: stiamo perfezionando le limitazioni di Background Activity Launch (BAL) estendendo le protezioni a IntentSender. Gli sviluppatori devono eseguire la migrazione dalla costante legacy MODE_BACKGROUND_ACTIVITY_START_ALLOWED. Devi invece adottare controlli granulari come MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, che limita l'avvio dell'attività agli scenari in cui l'app chiamante è visibile, riducendo in modo significativo la superficie di attacco.
  • Strumenti di adozione:gli sviluppatori devono utilizzare la modalità StrictMode e i controlli lint aggiornati per identificare i pattern legacy e garantire l'idoneità ai futuri requisiti dell'SDK di destinazione.

Abilita 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à.)

DCL-C nativo più sicuro

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.

Limita 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

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

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 serie 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>=600dp)

We introduced Platform API changes in Android 16 to ignore orientation, aspect ratio, and resizability restrictions on large screens (sw >= 600dp) for apps targeting API level 36 or higher. Developers have the option to opt out of these changes with SDK 36, but this opt-out will no longer be available for apps that target Android 17 (API level 37) or higher.

For more information, see Restrictions on orientation and resizability are ignored.

Connettività

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

Comportamento di lettura() di BluetoothSocket coerente 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.