La piattaforma Android 16 include modifiche al comportamento che potrebbero influire sulla tua app.
Le seguenti modifiche al comportamento si applicano a tutte le app quando vengono eseguite su Android 16,
indipendentemente da targetSdkVersion
. Devi testare la tua app e poi modificarla
in base alle necessità per supportare queste modifiche, ove applicabile.
Assicurati di esaminare anche l'elenco delle modifiche al comportamento che interessano solo le app che hanno come target Android 16.
Funzionalità di base
Android 16 (livello API 36) include le seguenti modifiche che modificano o espandono varie funzionalità di base del sistema Android.
Ottimizzazioni delle quote di JobScheduler
A partire da Android 16, stiamo modificando la quota di tempo di esecuzione per l'esecuzione di job regolari e accelerati in base ai seguenti fattori:
- Il bucket in standby dell'app in cui si trova l'applicazione: in Android 16, i bucket in standby attivi inizieranno a essere applicati da una quota di runtime generosa.
- Se il job inizia l'esecuzione mentre l'app è in uno stato superiore: in Android 16, i job avviati mentre l'app è visibile all'utente e continuano dopo che l'app diventa invisibile, rispetteranno la quota di tempo di esecuzione del job.
- Se il job è in esecuzione durante l'esecuzione di un servizio in primo piano: in Android 16, i job in esecuzione contemporaneamente a un servizio in primo piano rispetteranno la quota di tempo di esecuzione del job. Se utilizzi i job per il trasferimento di dati avviato dall'utente, ti consigliamo di utilizzare i job di trasferimento di dati avviati dall'utente.
Questa modifica interessa le attività pianificate utilizzando WorkManager, JobScheduler e DownloadManager. Per eseguire il debug del motivo dell'interruzione di un job, ti consigliamo di registrare il motivo dell'interruzione chiamando WorkInfo.getStopReason()
(per i job JobScheduler, chiama JobParameters.getStopReason()
).
Per informazioni su come lo stato dell'app influisce sulle risorse che può utilizzare, consulta Limiti delle risorse per la gestione dell'alimentazione. Per ulteriori informazioni sulle best practice per l'ottimizzazione dell'utilizzo della batteria per le API di pianificazione delle attività, consulta le indicazioni su come ottimizzare l'utilizzo della batteria per le API di pianificazione delle attività.
Ti consigliamo inoltre di utilizzare la nuova API JobScheduler#getPendingJobReasonsHistory
introdotta in Android 16 per capire perché un job non è stato eseguito.
Test
Per testare il comportamento dell'app, puoi attivare l'override di determinate ottimizzazioni della quota di job, a condizione che l'app sia in esecuzione su un dispositivo Android 16.
Per disattivare l'applicazione dell'impostazione "lo stato superiore rispetterà la quota di runtime del job", esegui il seguente comando adb
:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
Per disattivare l'applicazione forzata del criterio "i job in esecuzione contemporaneamente a un servizio in primo piano rispetteranno la quota di tempo di esecuzione del job", esegui il seguente comando adb
:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
Per testare determinati comportamenti del bucket in standby dell'app, puoi impostare il bucket in standby dell'app utilizzando il seguente comando adb
:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
Per capire il bucket in cui si trova la tua app, puoi ottenere il bucket in standby della tua app utilizzando il seguente comando adb
:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Motivo di interruzione dei job vuoti abbandonati
An abandoned job occurs when the JobParameters
object associated with the job
has been garbage collected, but JobService#jobFinished(JobParameters,
boolean)
has not been called to signal job completion. This indicates that
the job may be running and being rescheduled without the app's awareness.
Apps that rely on JobScheduler, don't maintain a strong reference to the
JobParameters
object, and timeout will now be granted the new job stop reason
STOP_REASON_TIMEOUT_ABANDONED
, instead of STOP_REASON_TIMEOUT
.
If there are frequent occurrences of the new abandoned stop reason, the system will take mitigation steps to reduce job frequency.
Apps should use the new stop reason to detect and reduce abandoned jobs.
If you're using WorkManager, AsyncTask, or DownloadManager, you aren't impacted because these APIs manage the job lifecycle on your app's behalf.
Ritiro completo di JobInfo#setImportantWhileForeground
Il metodo JobInfo.Builder#setImportantWhileForeground(boolean)
indica l'importanza di un job quando l'app di pianificazione è in primo piano o quando è temporaneamente esente dalle limitazioni in background.
Questo metodo è stato ritirato da Android 12 (livello API 31). A partire da Android 16, non funziona più in modo efficace e la chiamata di questo metodo verrà ignorata.
Questa rimozione di funzionalità si applica anche a
JobInfo#isImportantWhileForeground()
. A partire da Android
16, se il metodo viene chiamato, restituisce false
.
L'ambito della priorità di trasmissione ordinata non è più globale
Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority
属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority()
API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。
在 Android 16 中,无法保证使用 android:priority
属性或 IntentFilter#setPriority()
在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。
此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY
+ 1, SYSTEM_HIGH_PRIORITY
- 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITY
、SYSTEM_HIGH_PRIORITY
设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Modifiche interne ad ART
Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。
发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。
依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。
所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。
Modalità di compatibilità con le dimensioni pagina di 16 kB
Android 15 ha introdotto il supporto per le pagine di memoria da 16 KB per ottimizzare le prestazioni della piattaforma. Android 16 aggiunge una modalità di compatibilità, che consente ad alcune app create per pagine di memoria da 4 KB di essere eseguite su un dispositivo configurato per pagine di memoria da 16 KB.
Quando la tua app viene eseguita su un dispositivo con Android 16 o versioni successive, se Android rileva che la tua app ha pagine di memoria allineate a 4 KB, utilizza automaticamente la modalità di compatibilità e mostra una finestra di dialogo di notifica all'utente. L'impostazione della proprietà android:pageSizeCompat
in AndroidManifest.xml
per attivare la modalità di compatibilità con le versioni precedenti impedisce la visualizzazione della finestra di dialogo al momento dell'avvio dell'app. Per utilizzare la proprietà android:pageSizeCompat
, compila l'app
utilizzando l'SDK Android 16.
Per ottenere le migliori prestazioni, affidabilità e stabilità, la tua app deve comunque essere allineata a 16 KB. Per ulteriori dettagli, consulta il nostro recente post del blog sull'aggiornamento delle app per supportare le pagine di memoria di 16 KB.

Esperienza utente e UI di sistema
Android 16 (livello API 36) include le seguenti modifiche volte a creare un'esperienza utente più coerente e intuitiva.
Ritiro degli annunci di accessibilità invasivi
Android 16 ritira gli annunci di accessibilità, caratterizzati dall'utilizzo di
announceForAccessibility
o dall'invio di
TYPE_ANNOUNCEMENT
eventi di accessibilità. Ciò può creare esperienze utente incoerenti per gli utenti di TalkBack e dello screen reader di Android e le alternative soddisfano meglio una gamma più ampia di esigenze degli utenti in una serie di tecnologie per la disabilità di Android.
Esempi di alternative:
- Per modifiche significative all'interfaccia utente, come le modifiche alle finestre, utilizza
Activity.setTitle(CharSequence)
esetAccessibilityPaneTitle(java.lang.CharSequence)
. In Scrivi, usaModifier.semantics { paneTitle = "paneTitle" }
- Per informare l'utente delle modifiche all'interfaccia utente di importanza critica, utilizza
setAccessibilityLiveRegion(int)
. In Scrivi, usaModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. Questi annunci devono essere utilizzati con parsimonia, in quanto potrebbero generare annunci ogni volta che una visualizzazione viene aggiornata. - Per notificare gli utenti degli errori, invia un
AccessibilityEvent
di tipoAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
e impostaAccessibilityNodeInfo#setError(CharSequence)
oppure utilizzaTextView#setError(CharSequence)
.
La documentazione di riferimento per l'API announceForAccessibility
obsoleta include ulteriori dettagli sulle alternative suggerite.
Supporto della navigazione con tre pulsanti
Android 16 introduce il supporto del pulsante Indietro predittivo alla navigazione con tre pulsanti per le app che hanno effettuato correttamente la migrazione al pulsante Indietro predittivo. Se premi a lungo il pulsante Indietro, viene avviata un'animazione di Indietro predittiva che ti mostra un'anteprima della destinazione del gesto Indietro.
Questo comportamento si applica a tutte le aree del sistema che supportano le animazioni Indietro predittive, incluse le animazioni di sistema (torna alla schermata Home, passaggio da un'attività all'altra e così via).
Supporto della navigazione con tre pulsanti
A partire da Android 16 QPR 2, Android applica automaticamente i temi alle icone delle app per creare un'esperienza coerente nella schermata Home. Ciò si verifica se un'app non fornisce la propria icona dell'app a tema. Le app possono controllare il design dell'icona dell'app a tema includendo un livello monocromatico nell'icona adattiva e visualizzando l'aspetto dell'icona dell'app in Android Studio.
Fattori di forma dei dispositivi
Android 16 (livello API 36) include le seguenti modifiche per le app quando vengono proiettate sui display dai proprietari di dispositivi virtuali.
Override del proprietario del dispositivo virtuale
Un proprietario di dispositivo virtuale è un'app attendibile o con privilegi che crea e gestisce un dispositivo virtuale. I proprietari di dispositivi virtuali eseguono app su un dispositivo virtuale e poi le proiettano sul display di un dispositivo remoto, come un computer personale, un dispositivo di realtà virtuale o un sistema di infotainment per auto. Il proprietario del dispositivo virtuale si trova su un dispositivo locale, ad esempio un cellulare.

Override per app
Sui dispositivi con Android 16 (livello API 36), i proprietari di dispositivi virtuali possono ignorare le impostazioni delle app su determinati dispositivi virtuali gestiti dai proprietari di dispositivi virtuali. Ad esempio, per migliorare il layout delle app, il proprietario di un dispositivo virtuale può ignorare le limitazioni di orientamento, proporzioni e ridimensionamento durante la proiezione delle app su un display esterno.
Modifiche che provocano un errore comuni
Il comportamento di Android 16 potrebbe influire sulla UI della tua app su fattori di forma con schermi di grandi dimensioni, come display per auto o Chromebook, in particolare sui layout progettati per display piccoli in orientamento verticale. Per scoprire come rendere la tua app adattabile a tutti i fattori di forma dei dispositivi, consulta Informazioni sui layout adattabili.
Riferimenti
Streaming di app complementari
Sicurezza
Android 16 (livello API 36) include modifiche che promuovono la sicurezza del sistema per proteggere app e utenti da app dannose.
Maggiore sicurezza contro gli attacchi di reindirizzamento degli intent
Android 16 offre una protezione predefinita dagli attacchi di reindirizzamento Intent
generali, con modifiche minime richieste per la compatibilità e gli sviluppatori.
Stiamo introducendo soluzioni di hardening della sicurezza per impostazione predefinita per Intent
gli exploit di reindirizzamento. Nella maggior parte dei casi, le app che utilizzano intent non
riscontrano problemi di compatibilità. Abbiamo raccolto metriche durante il nostro
processo di sviluppo per monitorare quali app potrebbero riscontrare interruzioni.
Il reindirizzamento degli intent in Android si verifica quando un malintenzionato può controllare parzialmente o completamente i contenuti di un intent utilizzato per avviare un nuovo componente nel contesto di un'app vulnerabile, mentre l'app vittima avvia un intent di livello secondario non attendibile in un campo extra di un intent ("di primo livello"). Ciò può portare l'app malintenzionata ad avviare componenti privati nel contesto dell'app vittima, ad attivare azioni privilegiate o a ottenere l'accesso URI a dati sensibili, con conseguente furto di dati ed esecuzione di codice arbitrario.
Disattivare la gestione del reindirizzamento degli intent
Android 16 introduce una nuova API che consente alle app di disattivare le protezioni di sicurezza all'avvio. Ciò potrebbe essere necessario in casi specifici in cui il comportamento di sicurezza predefinito interferisce con casi d'uso legittimi dell'app.
Per le applicazioni compilate con l'SDK Android 16 (livello API 36) o versioni successive
Puoi utilizzare direttamente il metodo removeLaunchSecurityProtection()
sull'oggetto Intent.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Per le applicazioni compilate su Android 15 (livello API 35) o versioni precedenti
Anche se non è consigliato, puoi utilizzare la reflection per accedere al metodo removeLaunchSecurityProtection()
.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
// Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }
Le app complementari non ricevono più notifiche relative ai timeout di rilevamento
Android 16 introduce un nuovo comportamento durante il percorso di accoppiamento del dispositivo complementare per proteggere la privacy della posizione dell'utente dalle app dannose. Tutte le app complementari in esecuzione su Android 16 non ricevono più una notifica diretta del timeout di rilevamento utilizzando RESULT_DISCOVERY_TIMEOUT
. L'utente viene invece informato degli eventi di timeout con una finestra di dialogo visiva. Quando l'utente chiude la finestra di dialogo, l'app viene avvisata dell'errore di associazione con RESULT_USER_REJECTED
.
La durata della ricerca è stata estesa rispetto ai 20 secondi iniziali e la ricerca del dispositivo può essere interrotta dall'utente in qualsiasi momento durante la ricerca. Se viene rilevato almeno un dispositivo nei primi 20 secondi dall'avvio della ricerca, il CDM interrompe la ricerca di altri dispositivi.
Connettività
Android 16 (livello API 36) include le seguenti modifiche nello stack Bluetooth per migliorare la connettività con i dispositivi periferici.
Gestione migliorata della perdita di obbligazioni
A partire da Android 16, lo stack Bluetooth è stato aggiornato per migliorare la sicurezza e l'esperienza utente quando viene rilevata una perdita del legame remoto. In precedenza, il sistemarimuoveva automaticamente il legame e avviava una nuova procedura di accoppiamento, che poteva portare a un'accoppiata non intenzionale. In molti casi abbiamo notato che le app non gestiscono l'evento di perdita del legame in modo coerente.
Per unificare l'esperienza, Android 16 ha migliorato la gestione della perdita del legame con il sistema. Se un dispositivo Bluetooth accoppiato in precedenza non può essere autenticato al nuovo collegamento, il sistema scollega il link, conserva le informazioni sull'accoppiamento locale e mostra una finestra di dialogo di sistema che informa gli utenti della perdita dell'accoppiamento e li invita a eseguire nuovamente l'accoppiamento.