Modifiche al comportamento: app che hanno come target Android 16 o versioni successive

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

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

Esperienza utente e interfaccia utente di sistema

Android 16 (livello API 36) include le seguenti modifiche volte a creare un'esperienza utente più coerente e intuitiva.

Ritiro del consenso per la visualizzazione edge-to-edge

Android 15 enforced edge-to-edge for apps targeting Android 15 (API level 35), but your app could opt-out by setting R.attr#windowOptOutEdgeToEdgeEnforcement to true. For apps targeting Android 16 (API level 36), R.attr#windowOptOutEdgeToEdgeEnforcement is deprecated and disabled, and your app can't opt-out of going edge-to-edge.

  • If your app targets Android 16 (API level 36) and is running on an Android 15 device, R.attr#windowOptOutEdgeToEdgeEnforcement continues to work.
  • If your app targets Android 16 (API level 36) and is running on an Android 16 device, R.attr#windowOptOutEdgeToEdgeEnforcement is disabled.

For testing in Android 16 Beta 3, ensure your app supports edge-to-edge and remove any use of R.attr#windowOptOutEdgeToEdgeEnforcement so that your app also supports edge-to-edge on an Android 15 device. To support edge-to-edge, see the Compose and Views guidance.

Migrazione o disattivazione richiesta per il ritorno predittivo

For apps targeting Android 16 (API level 36) or higher and running on an Android 16 or higher device, the predictive back system animations (back-to-home, cross-task, and cross-activity) are enabled by default. Additionally, onBackPressed is not called and KeyEvent.KEYCODE_BACK is not dispatched anymore.

If your app intercepts the back event and you haven't migrated to predictive back yet, update your app to use supported back navigation APIs. or temporarily opt out by setting the android:enableOnBackInvokedCallback attribute to false in the <application> or <activity> tag of your app's AndroidManifest.xml file.

The predictive back-to-home animation.
The predictive cross-activity animation.
The predictive cross-task animation.

API dei caratteri eleganti ritirate e disattivate

Apps targeting Android 15 (API level 35) have the elegantTextHeight TextView attribute set to true by default, replacing the compact font with one that is much more readable. You could override this by setting the elegantTextHeight attribute to false.

Android 16 deprecates the elegantTextHeight attribute, and the attribute will be ignored once your app targets Android 16. The "UI fonts" controlled by these APIs are being discontinued, so you should adapt any layouts to ensure consistent and future proof text rendering in Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai.

elegantTextHeight behavior for apps targeting Android 14 (API level 34) and lower, or for apps targeting Android 15 (API level 35) that overrode the default by setting the elegantTextHeight attribute to false.
elegantTextHeight behavior for apps targeting Android 16, or for apps targeting Android 15 (API level 35) that didn't override the default by setting the elegantTextHeight attribute to false.

Funzionalità di base

Android 16 (livello API 36) include le seguenti modifiche che modificano o ampliano varie funzionalità di base del sistema Android.

Ottimizzazione della pianificazione del lavoro a tariffa fissa

Prima di scegliere come target Android 16, quando scheduleAtFixedRate mancava un'esecuzione di attività perché non rientrava in un ciclo di vita del processo valido, tutte le esecuzioni mancate venivano eseguite immediatamente quando l'app tornava a un ciclo di vita valido.

Quando scegli come target Android 16, al massimo una esecuzione mancata di scheduleAtFixedRate viene eseguita immediatamente quando l'app torna a un ciclo di vita valido. Questa modifica del comportamento dovrebbe migliorare il rendimento dell'app. Testa questo comportamento nella tua app per verificare se è interessata. Puoi anche eseguire il test utilizzando il framework di compatibilità delle app e attivando il flag di compatibilità STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS.

Fattori di forma del dispositivo

Android 16 (livello API 36) include le seguenti modifiche per le app quando vengono visualizzate su dispositivi con schermi di grandi dimensioni.

Layout adattivi

Ora che le app per Android vengono eseguite su una serie di dispositivi (come smartphone, tablet, pieghevoli, computer, auto e TV) e modalità di visualizzazione su schermi di grandi dimensioni (come schermo diviso e visualizzazione in finestra su computer), gli sviluppatori devono creare app per Android che si adattino a qualsiasi dimensione dello schermo e della finestra, indipendentemente dall'orientamento del dispositivo. Paradigmi come la limitazione dell'orientamento e la possibilità di ridimensionamento sono troppo restrittivi nel mondo di oggi, in cui sono presenti più dispositivi.

Ignora le limitazioni relative a orientamento, ridimensionamento e proporzioni

Per le app che hanno come target Android 16 (livello API 36), Android 16 include modifiche al modo in cui il sistema gestisce le limitazioni relative a orientamento, ridimensionamento e proporzioni. Sui display con larghezza minima >= 600 dp, le limitazioni non si applicano più. Inoltre, le app riempiono l'intera finestra di visualizzazione, indipendentemente dalle proporzioni o dall'orientamento preferito dall'utente, e non viene utilizzato il pillarboxing.

Questa modifica introduce un nuovo comportamento standard della piattaforma. Android si sta muovendo verso un modello in cui le app devono adattarsi a vari orientamenti, dimensioni dei display e proporzioni. Restrizioni come l'orientamento fisso o il ridimensionamento limitato ostacolano l'adattabilità dell'app, pertanto ti consigliamo di rendere l'app adattabile per offrire la migliore esperienza utente possibile.

Puoi anche testare questo comportamento utilizzando il framework di compatibilità delle app e attivando il flag di compatibilità UNIVERSAL_RESIZABLE_BY_DEFAULT.

Modifiche che provocano un errore comuni

Se ignori le limitazioni relative all'orientamento, alla modifica delle dimensioni e alle proporzioni, l'interfaccia utente della tua app potrebbe essere interessata su alcuni dispositivi, in particolare gli elementi progettati per layout ridotti bloccati in orientamento verticale: ad esempio, problemi come layout allungati, animazioni e componenti off-screen. Qualsiasi supposizione sull'aspetto o sull'orientamento può causare problemi visivi con la tua app. Scopri di più su come evitarli e migliorare il comportamento adattativo della tua app.

Se consenti la rotazione del dispositivo, le attività vengono ricreate più spesso, il che può comportare la perdita dello stato dell'utente se non viene conservato correttamente. Scopri come salvare correttamente lo stato dell'interfaccia utente in Salvare gli stati dell'interfaccia utente.

Dettagli di implementazione

I seguenti attributi manifest e API di runtime vengono ignorati sui dispositivi con schermo di grandi dimensioni nelle modalità a schermo intero e con più finestre:

I seguenti valori per screenOrientation, setRequestedOrientation() e getRequestedOrientation() vengono ignorati:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

Per quanto riguarda la modifica delle dimensioni del display, android:resizeableActivity="false", android:minAspectRatio e android:maxAspectRatio non hanno alcun effetto.

Per le app destinate ad Android 16 (livello API 36), le limitazioni relative a orientamento, ridimensionamento e proporzioni delle app vengono ignorate sugli schermi di grandi dimensioni per impostazione predefinita, ma ogni app non completamente pronta può ignorare temporaneamente questo comportamento disattivando l'opzione (il che comporta il comportamento precedente di inserimento in modalità di compatibilità).

Eccezioni

Le limitazioni relative a orientamento, ridimensionamento e proporzioni di Android 16 non si applicano nelle seguenti situazioni:

  • Giochi (in base al flag android:appCategory)
  • Utenti che attivano esplicitamente il comportamento predefinito dell'app nelle impostazioni delle proporzioni del dispositivo
  • Schermi di dimensioni inferiori a sw600dp

Disattivare temporaneamente

Per disattivare un'attività specifica, dichiara la proprietà manifestPROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

Se troppe parti della tua app non sono pronte per Android 16, puoi disattivare completamente la funzionalità applicando la stessa proprietà a livello di applicazione:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

Salute e fitness

Android 16 (livello API 36) include le seguenti modifiche relative ai dati di salute e fitness.

Autorizzazioni per salute e fitness

Per le app che hanno come target Android 16 (livello API 36) o versioni successive, le autorizzazioni BODY_SENSORS stanno passando alle autorizzazioni granulari in android.permissions.health utilizzate anche da Connessione. Qualsiasi API che in precedenza richiedeva BODY_SENSORS o BODY_SENSORS_BACKGROUND ora richiede l'autorizzazione android.permissions.health corrispondente. Questo influisce sui seguenti tipi di dati, API e tipi di servizi in primo piano:

Se la tua app utilizza queste API, ora dovrebbe richiedere le rispettive autorizzazioni granulari:

Queste autorizzazioni sono le stesse che proteggono l'accesso alla lettura dei dati da Connessione Salute, il data store Android per i dati relativi a salute, attività fisica e benessere.

App mobili

Le app mobile che eseguono la migrazione per utilizzare le autorizzazioni READ_HEART_RATE e altre granulari devono anche dichiarare un'attività per mostrare le norme sulla privacy dell'app. Si tratta dello stesso requisito di Connessione Salute.

Connettività

Android 16 (livello API 36) include le seguenti modifiche allo stack Bluetooth per migliorare la connettività con i dispositivi periferici.

Nuovi intent per gestire la perdita di obbligazioni e le modifiche alla crittografia

As part of the Improved bond loss handling, Android 16 also introduces 2 new intents to provide apps with greater awareness of bond loss and encryption changes.

Apps targeting Android 16 can now:

  • Receive an ACTION_KEY_MISSING intent when remote bond loss is detected, allowing them to provide more informative user feedback and take appropriate actions.
  • Receive an ACTION_ENCRYPTION_CHANGE intent whenever encryption status of the link changes. This includes encryption status change, encryption algorithm change, and encryption key size change. Apps must consider the bond restored if the link is successfully encrypted upon receiving ACTION_ENCRYPTION_CHANGE intent later.

If your app currently uses custom mechanisms for bond loss handling, migrate to the new intent ACTION_KEY_MISSING to detect and manage bond loss events. We recommend your app guide the user to confirm the remote device is in range before initiating device forgetting and re-pairing.

Moreover, if a device disconnects after ACTION_KEY_MISSING intent is received, your app should be mindful about reconnecting to the device as that device may no longer be bonded with the system.

Sicurezza

Android 16 (livello API 36) include le seguenti modifiche alla sicurezza.

Blocco della versione di MediaStore

Per le app destinate ad Android 16 o versioni successive, MediaStore#getVersion() sarà ora univoco per ogni app. In questo modo, le proprietà di identificazione vengono eliminate dalla stringa di versione per impedire l'uso improprio e l'utilizzo per le tecniche di fingerprinting. Le app non devono fare supposizioni sul formato di questa versione. Le app dovrebbero già gestire le modifiche delle versioni quando utilizzano questa API e nella maggior parte dei casi non dovrebbero dover cambiare il loro comportamento attuale, a meno che lo sviluppatore non abbia tentato di dedurre informazioni aggiuntive che vanno oltre lo scopo previsto di questa API.

Intent più sicuri

La funzionalità Intent più sicuri è un'iniziativa di sicurezza in più fasi progettata per migliorare la sicurezza del meccanismo di risoluzione degli intent di Android. L'obiettivo è proteggere le app da azioni dannose aggiungendo controlli durante l'elaborazione degli intent e filtrando gli intent che non soddisfano criteri specifici.

In Android 15 la funzionalità era incentrata sull'app di invio, ma ora con Android 16 il controllo passa all'app di ricezione, consentendo agli sviluppatori di attivare la risoluzione rigorosa degli intent utilizzando il file manifest dell'app.

Verranno implementate due modifiche principali:

  1. Gli intent espliciti devono corrispondere al filtro per intent del componente di destinazione: se un intent sceglie esplicitamente come target un componente, deve corrispondere al filtro per intent del componente.

  2. Gli intent senza un'azione non possono corrispondere a nessun filtro per intent: gli intent per i quali non è stata specificata un'azione non devono essere risolti in nessun filtro per intent.

Queste modifiche si applicano solo quando sono coinvolte più app e non influiscono sulla gestione degli intent all'interno di una singola app.

Impatto

Poiché si tratta di un'opzione facoltativa, gli sviluppatori devono attivarla esplicitamente nel file manifest dell'app affinché venga applicata. Di conseguenza, l'impatto della funzionalità sarà limitato alle app i cui sviluppatori:

  • Sono a conoscenza della funzionalità Intent più sicuri e dei relativi vantaggi.
  • Scegliere attivamente di incorporare nelle proprie app pratiche di gestione degli intent più rigorose.

Questo approccio di attivazione riduce al minimo il rischio di interrompere le app esistenti che potrebbero basarsi sul comportamento attuale di risoluzione degli intent meno sicuro.

Sebbene l'impatto iniziale in Android 16 possa essere limitato, l'iniziativa Intent più sicuri ha una roadmap per un impatto più ampio nelle future release di Android. L'intenzione è quella di rendere la risoluzione rigorosa dell'intenzione il comportamento predefinito.

La funzionalità Intent più sicuri ha il potenziale di migliorare notevolmente la sicurezza dell'ecosistema Android rendendo più difficile per le app dannose sfruttare le vulnerabilità nel meccanismo di risoluzione degli intent.

Tuttavia, la transizione all'attivazione e all'applicazione obbligatoria deve essere gestita con attenzione per risolvere potenziali problemi di compatibilità con le app esistenti.

Implementazione

Gli sviluppatori devono attivare esplicitamente una corrispondenza degli intent più rigorosa utilizzando l'attributo intentMatchingFlags nel file manifest dell'app. Ecco un esempio in cui la funzionalità è attivata per l'intera app, ma disattivata/disattivata su un destinatario:

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

Scopri di più sui flag supportati:

Nome del flag Descrizione
enforceIntentFilter Applica una corrispondenza più rigorosa per gli intent in arrivo
nessuno Disattiva tutte le regole di corrispondenza speciali per gli intent in arrivo. Quando specifichi più flag, i valori in conflitto vengono risolti dando la precedenza al flag "none"
allowNullAction Allenta le regole di corrispondenza per consentire intent senza un'azione da associare. Questo flag deve essere utilizzato in combinazione con "enforceIntentFilter" per ottenere un comportamento specifico

Test e debug

Quando l'applicazione è attiva, le app dovrebbero funzionare correttamente se l'autore della chiamata dell'intent ha compilato correttamente l'intent. Tuttavia, gli intent bloccati attiveranno messaggi di log di avviso come "Intent does not match component's intent filter:" e "Access blocked:" con il tag "PackageManager." Questo indica un potenziale problema che potrebbe influire sull'app e richiede attenzione.

Filtro logcat:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

Privacy

Android 16 (livello API 36) include le seguenti modifiche alla privacy.

Autorizzazione di accesso alla rete locale

I dispositivi sulla LAN possono essere accessibili da qualsiasi app che dispone dell'autorizzazione INTERNET. In questo modo, le app possono connettersi facilmente ai dispositivi locali, ma ciò ha anche implicazioni per la privacy, ad esempio la formazione di una impronta dell'utente e il fatto di essere un proxy per la posizione.

Il progetto Protezioni della rete locale ha lo scopo di proteggere la privacy dell'utente impedendo l'accesso alla rete locale dietro una nuova autorizzazione di runtime.

Piano di rilascio

Questa modifica verrà implementata tra due release, rispettivamente 25Q2 e TBD. È fondamentale che gli sviluppatori seguano queste indicazioni per il secondo trimestre del 2022 e condividano il loro feedback, perché queste protezioni verranno applicate in una release successiva di Android. Inoltre, dovranno aggiornare gli scenari che dipendono dall'accesso alla rete locale implicito utilizzando le seguenti indicazioni e prepararsi al rifiuto e alla revoca della nuova autorizzazione da parte dell'utente.

Impatto

Al momento, la LNP è una funzionalità che richiede l'attivazione, il che significa che saranno interessate solo le app che la attivano. Lo scopo della fase di attivazione è consentire agli sviluppatori di app di comprendere quali parti della loro app dipendono dall'accesso alla rete locale implicito in modo da potersi preparare a proteggerle con le autorizzazioni per la prossima release.

Le app saranno interessate se accedono alla rete locale dell'utente utilizzando:

  • Utilizzo diretto o tramite libreria di socket non elaborati sugli indirizzi di rete locale (ad es. protocollo di rilevamento dei servizi mDNS o SSDP)
  • Utilizzo di classi a livello di framework che accedono alla rete locale (ad es. NsdManager)

Il traffico verso e da un indirizzo di rete locale richiede l'autorizzazione di accesso alla rete locale. La seguente tabella elenca alcuni casi comuni:

Operazione di rete a basso livello dell'app Autorizzazione di accesso alla rete locale richiesta
Creazione di una connessione TCP in uscita
Accettare le connessioni TCP in arrivo
Invio di un messaggio unicast, multicast o broadcast UDP
Ricezione di un pacchetto UDP unicast, multicast o broadcast in arrivo

Queste limitazioni sono implementate in profondità nello stack di rete, e pertanto si applicano a tutte le API di rete. Sono inclusi i socket creati in codice nativo o gestito, le librerie di rete come Cronet e OkHttp e qualsiasi API implementata su queste. Il tentativo di risolvere i servizi sulla rete locale (ovvero quelli con il suffisso .local) richiede l'autorizzazione di accesso alla rete locale.

Eccezioni alle regole precedenti:

  • Se il server DNS di un dispositivo si trova su una rete locale, il traffico verso o da questo (sulla porta 53) non richiede l'autorizzazione di accesso alla rete locale.
  • Le applicazioni che utilizzano Output Switcher come selettore in-app non avranno bisogno delle autorizzazioni di rete locale (ulteriori indicazioni saranno disponibili nel quarto trimestre del 2025).

Indicazioni per gli sviluppatori (attivazione)

Per attivare le limitazioni della rete locale:

  1. Esegui il flashing del dispositivo su una build con 25Q2 Beta 3 o successive.
  2. Installa l'app da testare.
  3. Attiva/disattiva il flag Appcompat in adb:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Riavvia il dispositivo

Ora l'accesso della tua app alla rete locale è limitato e qualsiasi tentativo di accedere alla rete locale comporterà errori di socket. Se utilizzi API che svolgono operazioni di rete locale al di fuori del processo dell'app (ad es. NsdManager), queste non saranno interessate durante la fase di attivazione.

Per ripristinare l'accesso, devi concedere l'autorizzazione all'app per NEARBY_WIFI_DEVICES.

  1. Assicurati che l'app dichiari l'autorizzazione NEARBY_WIFI_DEVICES nel file manifest.
  2. Vai a Impostazioni > App > [Nome dell'applicazione] > Autorizzazioni > Dispositivi nelle vicinanze > Consenti.

Ora l'accesso della tua app alla rete locale dovrebbe essere ripristinato e tutti gli scenari dovrebbero funzionare come prima dell'attivazione dell'app.

Una volta avviata l'applicazione della protezione della rete locale, ecco in che modo verrà interessato il traffico di rete dell'app.

Autorizzazione Richiesta LAN in uscita Richiesta di internet in uscita/in entrata Richiesta LAN in entrata
Concesso Works Works Works
Non concesso Fallimenti Works Fallimenti

Utilizza il seguente comando per disattivare il flag App-Compat

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Errori

Gli errori derivanti da queste limitazioni verranno restituiti alla socket di chiamata ogni volta che viene invocato send o una variante di send a un indirizzo di rete locale.

Esempi di errori:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Definizione della rete locale

Una rete locale in questo progetto si riferisce a una rete IP che utilizza un'interfaccia di rete in grado di trasmettere, ad esempio Wi-Fi o Ethernet, ma esclude le connessioni di rete mobile (WWAN) o VPN.

Le seguenti sono considerate reti locali:

IPv4:

  • 169.254.0.0/16 // Link Local
  • 100.64.0.0/10 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6:

  • Locale rispetto al collegamento
  • Percorsi direttamente collegati
  • Reti stub come Thread
  • Più subnet (da definire)

Inoltre, sia gli indirizzi multicast (224.0.0.0/4, ff00::/8) sia l'indirizzo di broadcast IPv4 (255.255.255.255) sono classificati come indirizzi di rete locale.

Foto di proprietà dell'app

When prompted for photo and video permissions by an app targeting SDK 36 or higher on devices running Android 16 or higher, users who choose to limit access to selected media will see any photos owned by the app pre-selected in the photo picker. Users can deselect any of these pre-selected items, which will revoke the app's access to those photos and videos.