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 dal 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 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 processi 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

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 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 ad ART

Android 16 include gli aggiornamenti più recenti all'ambiente di runtime Android (ART) che migliorano le prestazioni dell'ambiente di runtime Android (ART) e forniscono il supporto di funzionalità Java aggiuntive. Tramite gli aggiornamenti di sistema di Google Play, questi miglioramenti sono disponibili anche per oltre un miliardo di dispositivi con Android 12 (livello API 31) e versioni successive.

Man mano che queste modifiche vengono rilasciate, le librerie e il codice delle app che si basano sulle strutture interne di ART potrebbero non funzionare correttamente sui dispositivi con Android 16 e sulle versioni precedenti di Android che aggiornano il modulo ART tramite gli aggiornamenti di sistema di Google Play.

Fare affidamento su strutture interne (ad esempio interfacce non SDK) può sempre portare a problemi di compatibilità, ma è particolarmente importante evitare di fare affidamento su codice (o librerie contenenti codice) che sfrutta strutture ART interne, poiché le modifiche ART non sono legate alla versione della piattaforma su cui è in esecuzione il dispositivo e vengono rilasciate su oltre un miliardo di dispositivi tramite gli aggiornamenti di sistema di Google Play.

Tutti gli sviluppatori devono verificare se la loro app è interessata testando le proprie app in modo approfondito su Android 16. Inoltre, controlla i problemi noti per verificare se la tua app dipende da librerie che abbiamo identificato come basate su strutture ART interne. Se hai dipendenze di codice dell'app o della libreria che sono interessate, cerca alternative API pubbliche, se possibile, e richiedi API pubbliche per nuovi casi d'uso creando una richiesta di funzionalità nel nostro issue tracker.

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.

La finestra di dialogo della modalità di compatibilità che viene visualizzata quando il sistema rileva che un'app allineata a 4 KB potrebbe funzionare in modo più ottimale se allineata a 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:

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).

Le animazioni Indietro predittive in modalità di navigazione con tre pulsanti.

Icone delle app a tema automatiche

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

虚拟设备所有者是创建和管理虚拟设备的受信任应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备上,例如手机。

手机上的虚拟设备所有者创建将应用投影到远程显示屏的虚拟设备。

按应用替换项

在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。

常见的重大更改

Android 16 的行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅自适应布局简介

参考文档

配套应用串流

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 sicurezza predefinita contro gli attacchi di reindirizzamento Intent generali, con modifiche minime alla compatibilità e allo sviluppo richieste.

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 cauzione

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

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