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 di 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 esempio 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 ogni volta che è possibile, in quanto aumenta notevolmente il rischio che un'app possa essere compromessa da un'iniezione di codice o dalla manomissione 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

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

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

Intelligence

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

Ritiro di setContentCaptureEnabled

某些设备默认启用内容捕获功能,以便设备端 AI 功能分析屏幕内容,从而提供智能体验。

从 Android 17 开始,ContentCaptureManager.setContentCaptureEnabled(boolean) API 方法已被废弃。对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,调用 setContentCaptureEnabled(false) 不再停用内容捕获。

如果您的应用需要继续停用内容捕获或限制系统捕获屏幕内容,则必须改用 FLAG_SECURE 窗口布局参数。

如需停用内容捕获,请在窗口上设置 FLAG_SECURE 标志,如以下示例所示:

Kotlin

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

Java

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

如需了解详情,请参阅 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.