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

Come le release precedenti, Android 16 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 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 ha imposto il formato edge-to-edge per le app destinate ad Android 15 (livello API 35), ma la tua app potrebbe disattivarlo impostando R.attr#windowOptOutEdgeToEdgeEnforcement su true. Per le app che hanno come target Android 16 (livello API 36), R.attr#windowOptOutEdgeToEdgeEnforcement è deprecato e disabilitato e la sua app non può disattivare la visualizzazione edge-to-edge.

  • Se la tua app ha come target Android 16 (livello API 36) ed è in esecuzione su un dispositivo Android 15, R.attr#windowOptOutEdgeToEdgeEnforcement continua a funzionare.
  • Se la tua app ha come target Android 16 (livello API 36) ed è in esecuzione su un dispositivo Android 16, R.attr#windowOptOutEdgeToEdgeEnforcement è disattivato.

Per i test in Android 16 Beta 3, assicurati che l'app supporti il formato edge-to-edge erimuovi qualsiasi utilizzo di R.attr#windowOptOutEdgeToEdgeEnforcement in modo che supporti anche il formato edge-to-edge su un dispositivo Android 15. Per supportare il formato edge-to-edge, consulta le indicazioni relative a Composizione e Visualizzazioni.

Migrazione o disattivazione richiesta per il ritorno predittivo

对于以 Android 16(API 级别 36)或更高版本为目标平台且在 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不会调用 onBackPressed,也不会再调度 KeyEvent.KEYCODE_BACK

如果您的应用拦截了返回事件,并且您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API;或者,在应用的 AndroidManifest.xml 文件的 <application><activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false,以暂时停用此功能。

“返回主页”预测性返回动画。
预测性跨 activity 动画。
预测性跨任务动画。

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 all'orientamento, al ridimensionamento e alle proporzioni delle app vengono ignorate sugli schermi di grandi dimensioni per impostazione predefinita, ma ogni app non completamente pronta può ignorare temporaneamente questo comportamento disattivandolo (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
  • Schermate 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 utilizzano autorizzazioni più granulari in android.permissions.health, che vengono utilizzate anche da Connessione Salute. A partire da Android 16, qualsiasi API che in precedenza richiedeva BODY_SENSORS o BODY_SENSORS_BACKGROUND richiede invece l'autorizzazione corrispondenteandroid.permissions.health. Questo influisce sui seguenti tipi di dati, API e tipi di servizi in primo piano:

Se la tua app utilizza queste API, deve 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, fitness 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

作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。

以 Android 16 为目标平台的应用现在可以:

  • 在检测到远程键盘连接丢失时接收 ACTION_KEY_MISSING intent,以便提供更具信息量的用户反馈并采取适当的措施。
  • 每当链接的加密状态发生变化时,都会收到 ACTION_ENCRYPTION_CHANGE intent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到 ACTION_ENCRYPTION_CHANGE intent 时成功加密了链接,则必须将该绑定视为已恢复。

适应不同的 OEM 实现

虽然 Android 16 引入了这些新 intent,但其实现和广播可能会因不同的设备制造商 (OEM) 而异。为了确保您的应用在所有设备上都能提供一致且可靠的体验,开发者应设计其绑定丢失处理机制,以妥善适应这些潜在的变化。

我们建议您采用以下应用行为:

  • 如果广播 ACTION_KEY_MISSING intent:

    系统会断开 ACL(异步无连接)链接,但会保留设备的配对信息(如此处所述)。

    您的应用应将此 intent 用作检测配对丢失的主要信号,并在发起设备忘记或重新配对之前引导用户确认远程设备是否在范围内。

    如果设备在收到 ACTION_KEY_MISSING 后断开连接,您的应用应谨慎重新连接,因为设备可能已不再与系统绑定。

  • 如果未广播 ACTION_KEY_MISSING intent:

    ACL 链接将保持连接状态,系统会移除设备的配对信息,与 Android 15 中的行为相同。

    在这种情况下,您的应用应继续使用与之前的 Android 版本相同的现有配对丢失处理机制,以检测和管理配对丢失事件。

Nuovo modo per rimuovere il legame Bluetooth

Tutte le app che hanno come target Android 16 ora possono disaccoppiare i dispositivi Bluetooth utilizzando un'API pubblica in CompanionDeviceManager. Se un dispositivo complementare viene gestito come associazione CDM, l'app può attivare la rimozione del legame Bluetooth utilizzando la nuova API removeBond(int) sul dispositivo associato. L'app può monitorare le modifiche dello stato del legame ascoltando l'evento di trasmissione del dispositivo Bluetooth ACTION_BOND_STATE_CHANGED.

Sicurezza

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

Blocco della versione di MediaStore

For apps targeting Android 16 or higher, MediaStore#getVersion() will now be unique to each app. This eliminates identifying properties from the version string to prevent abuse and usage for fingerprinting techniques. Apps shouldn't make any assumptions around the format of this version. Apps should already handle version changes when using this API and in most cases shouldn't need to change their current behavior, unless the developer has attempted to infer additional information that is beyond the intended scope of this 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à si concentrava sull'app di invio, ora con Android 16 il controllo viene trasferito all'app di ricezione, consentendo agli sviluppatori di attivare la risoluzione rigorosa dell'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 Intenti 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'applicazione obbligatoria e all'opt-out 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, 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 cellulari (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

当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。