Modifiche al comportamento: tutte le app

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. Dovresti testare l'app e poi modificarla come necessario per supportare queste modifiche, se applicabili.

Assicurati di esaminare anche l'elenco delle modifiche del comportamento che interessano solo le app con target Android 16.

Funzionalità di base

Android 16 include le seguenti modifiche che modificano o ampliano 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 di app in standby in cui si trova l'applicazione: in Android 16, i bucket di app 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 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 dell'interruzione dei job vuoti abbandonati

如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters, boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。

依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT

如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。

应用应使用新的停止原因来检测和减少被废弃的作业。

如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。

Ritiro completo di JobInfo#setImportantWhileForeground

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 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_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

如果您的应用执行以下任一操作,可能会受到影响:

  1. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

Modifiche interne all'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 检测到您的应用具有 4 KB 对齐的内存页,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。为了获得最佳性能、可靠性和稳定性,您的应用仍应采用 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

Esperienza utente e interfaccia utente di sistema

Android 16 include le seguenti modifiche volte a creare un'esperienza utente più coerente e intuitiva.

Ritiro 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:

La documentazione di riferimento per l'API announceForAccessibility obsoleta include ulteriori dettagli sulle alternative suggerite.

Supporto della navigazione con tre pulsanti

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

Fattori di forma del dispositivo

Android 16 include le seguenti modifiche per le app quando vengono proiettate sui display dai proprietari di dispositivi virtuali.

Sostituzioni 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, ad esempio un personal computer, 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.

Il proprietario del dispositivo virtuale sullo smartphone crea un dispositivo virtuale che proietta l'app sul display remoto.

Sostituzioni per app

Sui dispositivi con Android 16, i proprietari di dispositivi virtuali possono eseguire l'override delle impostazioni delle app su alcuni dispositivi virtuali gestiti. Ad esempio, per migliorare il layout delle app, un proprietario di un dispositivo virtuale può ignorare le limitazioni relative a orientamento, formato e ridimensionamento durante la proiezione delle app su un display esterno.

Modifiche che provocano un errore comuni

Il comportamento di Android 16 potrebbe influire sull'interfaccia utente della tua app su fattori di forma con schermi di grandi dimensioni, come display dell'auto o Chromebook, in particolare sui layout progettati per schermi di piccole dimensioni in orientamento verticale. Per scoprire come rendere la tua app adattabile a tutti i fattori di forma del dispositivo, consulta Informazioni sui layout adattabili.

Riferimenti

Streaming di app complementari

Sicurezza

Android 16 include modifiche che promuovono la sicurezza del sistema per contribuire a proteggere app e utenti da app dannose.

Maggiore sicurezza contro gli attacchi di reindirizzamento degli intent

Android 16 fornisce sicurezza predefinita contro gli attacchi di reindirizzamento Intent generici, con requisiti minimi di compatibilità e modifiche richieste agli sviluppatori.

Stiamo introducendo soluzioni di rafforzamento della sicurezza predefinite per gli exploit di Intent ridirezione. Nella maggior parte dei casi, le app che utilizzano gli intent normalmente non riscontrano problemi di compatibilità. Abbiamo raccolto le metriche durante il nostro processo di sviluppo per monitorare le app che potrebbero riscontrare interruzioni.

Il reindirizzamento di 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 all'app malintenzionata a lanciare componenti privati nel contesto dell'app vittima, a attivare azioni privilegiate o a ottenere l'accesso tramite URI a dati sensibili, potenzialmente conducendo a 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 al momento del lancio. Ciò potrebbe essere necessario in casi specifici in cui il comportamento di sicurezza predefinito interferisce con casi d'uso legittimi delle app.

Per le applicazioni compilate con l'SDK Android 16 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 per Android 15 (livello API 35) o versioni precedenti

Sebbene non sia consigliato, puoi utilizzare la riflessione 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) }

Connettività

Android 16 include le seguenti modifiche allo stack Bluetooth per migliorare la connettività con i dispositivi periferici.

Gestione migliorata delle perdite di obbligazioni

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。