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.

Esperienza utente e UI di sistema

Android 17 include le seguenti modifiche, pensate per creare un'esperienza utente più coerente e intuitiva.

Widget Limite di memoria

A partire da Android 17, per le app che hanno come target Android 17 (livello API 37) o versioni successive, il sistema applica un limite di memoria rigido (1,5 * larghezza schermo * altezza schermo * 4) all'utilizzo combinato della memoria di bitmap e icone presenti nel pacchetto RemoteViews. Il superamento di questi limiti genera un errore irreversibile IllegalArgumentException e arresta il processo dell'app.

Per saperne di più, consulta UpdateAppWidget.

Funzionalità di base

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

Nuova implementazione senza blocchi 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 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 API AccessibilityEvent e TextAttribute per migliorare il feedback vocale dello screen reader per l'input di lingue CJKV. Le app CJKV IME ora possono segnalare se è stata selezionata una conversione di testo candidata durante la composizione del testo. Le app con campi di modifica possono specificare i tipi di modifica del testo quando inviano eventi di accessibilità relativi alla modifica del testo. Ad esempio, le app possono specificare che una modifica del testo è avvenuta durante la composizione del testo o che è 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 imposti la composizione del testo nei campi di modifica, gli IME possono utilizzare TextAttribute.Builder.setTextSuggestionSelected() per indicare se è stata selezionata una candidata alla conversione specifica.

  • App con Modifica campi: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() durante l'invio degli eventi TYPE_VIEW_TEXT_CHANGED. Le app che hanno come target Android 17 (livello API 37) che utilizzano TextView standard avranno questa funzionalità attivata per impostazione predefinita. ovvero TextView gestirà il recupero dei dati dall'IME e l'impostazione dei tipi di modifica del testo durante l'invio di 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 su come funziona 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 in modo nascosto. Se dichiari e richiedi 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, questa operazione è molto meno necessaria 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 dei 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à

In Android 17, la piattaforma continua il suo passaggio a un'architettura "sicura per impostazione predefinita", introducendo una serie di miglioramenti progettati per mitigare 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 la preparazione ai futuri requisiti dell'SDK di destinazione.

Attiva CT per impostazione predefinita

Se un'app ha come target Android 17 (livello API 37) o versioni successive, certificate transparency (CT) è abilitato per impostazione predefinita. (Su Android 16, CT è disponibile, ma le app dovevano attivarlo.)

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 alcune colonne contenenti informazioni che consentono l'identificazione personale (PII) dalla visualizzazione dei dati. 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 di ContactsContract.Data possono estrarle da ContactsContract.RawContacts unendosi a RAW_CONTACT_ID.

Applica controlli SQL rigorosi in CP2

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

Con questa modifica, se un'app non dispone dell'autorizzazione READ_CONTACTS, le opzioni StrictColumns e StrictGrammar vengono impostate durante l'interrogazione della tabella ContactsContract.Data. Se una query utilizza un pattern non compatibile con questi, verrà rifiutata e verrà generata un'eccezione.

Intelligence

Android 17 include le seguenti modifiche all'intelligence di sistema.

Ritiro di setContentCaptureEnabled

Acquisizione contenuti è attivata per impostazione predefinita su alcuni dispositivi per consentire alle funzionalità di AI sul dispositivo di analizzare i contenuti dello schermo per esperienze intelligenti.

A partire da Android 17, il metodo API ContentCaptureManager.setContentCaptureEnabled(boolean) è obsoleto. Per le app che hanno come target Android 17 (livello API 37) o versioni successive, la chiamata di setContentCaptureEnabled(false) non disattiva più Content Capture.

Se la tua app deve continuare a disattivare l'acquisizione dei contenuti o limitare l'acquisizione dei contenuti dello schermo da parte del sistema, devi passare all'utilizzo del parametro di layout della finestra FLAG_SECURE.

Per disattivare l'acquisizione dei contenuti, imposta il flag FLAG_SECURE nella finestra come mostrato nell'esempio seguente:

Kotlin

window.setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

Per maggiori dettagli, consulta la documentazione di riferimento WindowManager.LayoutParams.FLAG_SECURE.

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 limitazioni audio si applicano a tutte le app. Tuttavia, le limitazioni sono più rigide se un'app ha come target Android 17 (livello API 37). Se una di queste app interagisce con l'audio mentre è in background, deve avere un servizio in primo piano in esecuzione. Inoltre, l'app deve soddisfare uno o entrambi i seguenti requisiti:

  • Il servizio in primo piano deve disporre delle funzionalità "durante l'uso".
  • L'app deve disporre dell'autorizzazione sveglia esatta e interagire con flussi audio USAGE_ALARM.

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

Fattori di forma dei dispositivi

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

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

Abbiamo introdotto modifiche all'API della piattaforma in Android 16 per ignorare le limitazioni di orientamento, proporzioni e ridimensionamento sugli schermi di grandi dimensioni (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 disattivazione non sarà più disponibile per le app che hanno come target Android 17 (livello API 37) o versioni successive.

Per ulteriori informazioni, vedi Le limitazioni relative all'orientamento e al 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 destinate ad Android 17 (livello API 37), il metodo read() di InputStream ottenuto da un BluetoothSocket basato su RFCOMM ora restituisce -1 quando il socket viene 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.