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 della quota di JobScheduler
A partire da Android 16, stiamo modificando la quota di runtime per l'esecuzione di job regolari e rapidi in base ai seguenti fattori:
- In quale bucket standby app si trova l'applicazione: in Android 16, i bucket standby attivi inizieranno a essere applicati da una generosa quota di runtime.
- Se l'esecuzione del job inizia mentre l'app è in primo piano: in Android 16, i job avviati mentre l'app è visibile all'utente e continuano dopo che l'app diventa invisibile, rispettano la quota di runtime del job.
- Se il job viene eseguito durante l'esecuzione di un servizio in primo piano: in Android 16, i job eseguiti contemporaneamente a un servizio in primo piano rispettano la quota di runtime del job. Se utilizzi i job per il trasferimento di dati avviato dall'utente, valuta la possibilità di utilizzare i job di trasferimento di dati avviato dall'utente.
Questa modifica influisce sulle attività pianificate utilizzando WorkManager, JobScheduler e
DownloadManager. Per eseguire il debug del motivo per cui un job è stato interrotto, ti consigliamo di registrare il motivo per cui il job è stato interrotto 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 di gestione dell'alimentazione. Per ulteriori informazioni sulle best practice per l'ottimizzazione della batteria, 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 della tua app, puoi attivare l'override di alcune ottimizzazioni della quota di job purché l'app sia in esecuzione su un dispositivo Android 16.
Per disattivare l'applicazione di "top state will adhere to job runtime quota", esegui il seguente comando adb:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
Per disattivare l'applicazione di "i job in esecuzione contemporaneamente a un servizio in primo piano rispetteranno la quota di runtime del job", esegui questo comando adb:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
Per testare il comportamento di determinati bucket di standby delle app, puoi impostare il bucket di standby delle app
della tua app utilizzando il seguente comando adb:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
Per capire in quale bucket di standby dell'app si trova la tua app, puoi recuperare il bucket di standby dell'app utilizzando il seguente comando adb:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Motivo di interruzione dei job vuoti abbandonati
如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters,
boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。
依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT。
如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。
应用应使用新的停止原因来检测和减少被废弃的作业。
如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。
Deprecazione completa di JobInfo#setImportantWhileForeground
The JobInfo.Builder#setImportantWhileForeground(boolean)
method indicates the importance of a job while the scheduling app is in the
foreground or when temporarily exempted from background restrictions.
This method has been deprecated since Android 12 (API level 31). Starting in Android 16, it no longer functions effectively and calling this method will be ignored.
This removal of functionality also applies to
JobInfo#isImportantWhileForeground(). Starting in Android
16, if the method is called, the method returns false.
L'ambito di priorità della trasmissione ordinata non è più globale
Le app per Android possono definire le priorità per i ricevitori di trasmissione per controllare
l'ordine in cui i ricevitori ricevono ed elaborano la trasmissione. Per i gestori dichiarati nel file manifest, le app possono utilizzare l'attributo android:priority per definire la priorità e per i gestori registrati nel contesto, le app possono utilizzare l'API IntentFilter#setPriority() per definire la priorità. Quando viene inviata una trasmissione, il sistema la consegna ai ricevitori in ordine di priorità, dalla più alta alla più bassa.
In Android 16, l'ordine di invio delle trasmissioni che utilizzano l'attributo android:priority o IntentFilter#setPriority() in diversi processi non sarà garantito. Le priorità di trasmissione verranno rispettate solo all'interno della stessa procedura di applicazione e non in tutte le procedure.
Inoltre, le priorità di trasmissione verranno automaticamente limitate all'intervallo
(SYSTEM_LOW_PRIORITY + 1,
SYSTEM_HIGH_PRIORITY - 1). Solo i componenti di sistema potranno impostare SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY come priorità di trasmissione.
La tua app potrebbe essere interessata se esegue una delle seguenti azioni:
- La tua applicazione ha dichiarato più processi con lo stesso intento di trasmissione e si aspetta di ricevere questi intent in un determinato ordine in base alla priorità.
- La procedura di applicazione interagisce con altri processi e ha aspettative sulla ricezione di un'intenzione di trasmissione in un determinato ordine.
Se le procedure devono coordinarsi tra loro, devono comunicare utilizzando altri canali di coordinamento.
Modifiche interne di 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 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。
当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。
为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 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.
Deprecazione degli annunci di accessibilità che causano interruzioni
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
AccessibilityEventdi tipoAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORe 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).
Icone delle app a tema automatiche
从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。
Fattori di forma del dispositivo
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 del 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 che gestiscono. 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 dell'auto o Chromebook, in particolare sui layout progettati per piccoli display 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 rafforzamento della sicurezza per impostazione predefinita per gli exploit di reindirizzamento Intent. 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 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 associazione
从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。
为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。