Modifiche del comportamento: tutte le app

La piattaforma Android 13 include modifiche del comportamento che potrebbero influire sulla tua app. Le seguenti modifiche del comportamento si applicano a tutte le app quando vengono eseguite su Android 13, indipendentemente da targetSdkVersion. Devi testare l'app e poi modificarla in base alle esigenze per supportarla correttamente, ove applicabile.

Assicurati di esaminare anche l'elenco delle modifiche del comportamento che interessano solo le app che hanno come target Android 13.

Prestazioni e batteria

Task Manager

Nella parte inferiore del riquadro a scomparsa delle notifiche è presente un pulsante che indica il numero di app attualmente in esecuzione in background. Quando premi questo pulsante, viene visualizzata una finestra di dialogo che elenca i nomi delle diverse app. Il pulsante Interrompi si trova a destra di ogni app
Figura 1. Flusso di lavoro per Task Manager , che consente agli utenti di interrompere le app con servizi in primo piano in corso. Questo flusso di lavoro viene visualizzato solo sui dispositivi con Android 13 o versioni successive.

A partire da Android 13 (livello API 33), gli utenti possono completare un flusso di lavoro dal riquadro di notifica a scomparsa per interrompere le app con servizi in primo piano in corso, come mostrato nella figura 1. L'offerta è nota come Task Manager. Le app devono essere in grado di gestire questo arresto avviato dall'utente.

Migliora la gestione del job di precaricamento mediante JobScheduler

JobScheduler consente alle app di contrassegnare job specifici come job di "precaricamento" (utilizzando JobInfo.Builder.setPrefetch()), il che significa che idealmente dovrebbero essere eseguiti vicino, e prima, al prossimo lancio dell'app per migliorare l'esperienza utente. In passato, JobScheduler utilizzava l'indicatore solo per consentire ai job di precaricamento di utilizzare in modo opportunistico dati senza costi o in eccesso.

In Android 13 (livello API 33) e versioni successive, il sistema tenta di determinare all'avvio successivo di un'app e utilizza questa stima per eseguire job di precaricamento. Le app dovrebbero provare a utilizzare job di precaricamento per tutte le attività che vogliono svolgere prima del prossimo lancio dell'app.

Utilizzo delle risorse della batteria

Android 13 (livello API 33) offre al sistema i seguenti modi per gestire meglio la durata della batteria del dispositivo:

  • Sono state aggiornate le regole relative al momento in cui il sistema inserisce la tua app nel bucket di standby delle app"limitato".
  • Nuove limitazioni sul lavoro che la tua app può svolgere quando l'utente imposta l'app nello stato "limitato" per l'utilizzo della batteria in background.

Quando testi la tua app con queste modifiche, assicurati di controllare quanto segue:

  • Verifica la risposta della tua app quando il sistema la inserisce nel bucket di standby delle app"limitato". Utilizza il seguente comando Android Debug Bridge (ADB) per assegnare la tua app a questo bucket:

    adb shell am set-standby-bucket PACKAGE_NAME restricted
    
  • Verifica come la tua app risponde alle seguenti restrizioni che si applicano comunemente alle app in uno stato "limitato" per l'utilizzo della batteria in background:

    • Impossibile avviare i servizi in primo piano
    • I servizi in primo piano esistenti vengono rimossi dal primo piano
    • Le sveglie non vengono attivate
    • I job non vengono eseguiti

    Usa il seguente comando ADB per impostare la tua app in questo stato "limitato":

    adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
    

Quote di Firebase Cloud Message (FCM) con priorità elevata

Android 13 (livello API 33) aggiorna le quote di Firebase Cloud Messaging (FCM) per migliorare l'affidabilità della distribuzione FCM ad alta priorità per le app che mostrano notifiche in risposta a FCM ad alta priorità. In Android 13 (livello API 33) è cambiato quanto segue:

  • I bucket di standby delle app non determinano più il numero di FCM ad alta priorità che un'app può utilizzare.
  • Le quote FCM ad alta priorità vengono scalate in proporzione al numero di notifiche mostrate all'utente in risposta a FCM con priorità elevata.

Come nelle versioni precedenti di Android, i FCM ad alta priorità che superano la quota vengono sottoposti a downgrade a priorità normale. Quando avvii i servizi in primo piano (FGS) in risposta a un FCM, ti consigliamo di controllare il risultato di RemoteMessage.getPriority() e di verificare che sia PRIORITY_HIGH e/o di gestire eventuali potenziali eccezioni ForegroundServiceStartNotAllowedException.

Se la tua applicazione non pubblica sempre notifiche in risposta a FCM con priorità elevata, ti consigliamo di modificare la priorità di questi FCM impostandola su normale in modo che i messaggi che comportano una notifica non vengano sottoposti a downgrade.

Privacy

Autorizzazione di runtime per le notifiche

Android 13 (livello API 33) introduce un'autorizzazione di notifica di runtime: POST_NOTIFICATIONS. Questa modifica consente agli utenti di concentrarsi sulle notifiche per loro più importanti.

Ti consigliamo vivamente di scegliere come target Android 13 o versioni successive il prima possibile per ottenere gli effetti del controllo e della flessibilità aggiuntivi di questa funzionalità.

Scopri di più sulle best practice relative alle autorizzazioni app.

Nascondi i contenuti sensibili dagli appunti

Se la tua app consente agli utenti di copiare negli appunti contenuti sensibili, come password o dati della carta di credito, dovrai aggiungere un flag a ClipDescription di ClipData prima di chiamare ClipboardManager#setPrimaryClip(). L'aggiunta di questo flag impedisce che i contenuti sensibili vengano visualizzati nell'anteprima dei contenuti.

Anteprima del testo copiata senza segnalare contenuti sensibili
Anteprima del testo copiata senza segnalare contenuti sensibili.
Anteprima del testo copiato che segnala contenuti sensibili.
Anteprima del testo copiata per segnalare contenuti sensibili.

Per segnalare contenuti sensibili, aggiungi un extra booleano a ClipDescription. Questa operazione dovrebbe essere eseguita da tutte le app, indipendentemente dal livello API target.


// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app is compiled with a lower SDK
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

Per saperne di più sulla nuova UI degli Appunti, visita la pagina della funzionalità Copia e incolla.

Sicurezza

Esegui la migrazione dall'ID utente condiviso

Se la tua app utilizza l'attributo deprecato android:sharedUserId e non dipende più dalla funzionalità dell'attributo, puoi impostare l'attributo android:sharedUserMaxSdkVersion su 32, come mostrato nel seguente snippet di codice:

<manifest ...>
    <!-- To maintain backward compatibility, continue to use
         "android:sharedUserId" if you already added it to your manifest. -->
    android:sharedUserId="SHARED_PACKAGE_NAME"
    android:sharedUserMaxSdkVersion="32"
    ...
</manifest>

Questo attributo indica al sistema che la tua app non si basa più su uno User-ID condiviso. Se la tua app dichiara android:sharedUserMaxSdkVersion ed è stata installata di recente su dispositivi con Android 13 o versioni successive, l'app si comporta come se non avessi mai definito android:sharedUserId. Le app aggiornate continueranno a utilizzare l'ID utente condiviso esistente.

Gli ID utente condivisi causano comportamenti non deterministici all'interno del gestore di pacchetti. L'app dovrebbe invece utilizzare meccanismi di comunicazione adeguati, come servizi e fornitori di contenuti, per facilitare l'interoperabilità tra componenti condivisi.

Esperienza utente

Notifiche dei servizi in primo piano ignorabili

Sui dispositivi con Android 13 o versioni successive, gli utenti possono ignorare le notifiche associate ai servizi in primo piano per impostazione predefinita.

Funzionalità di base

Copia legacy dell'implementazione del servizio vocale rimossa

Android 13 rimuove l'implementazione SpeechService, inclusi l'IME di Voice, RecognitionService e un'API basata sull'intent, dall'app Google.

In Android 12 sono state apportate le seguenti modifiche:

  • È stata eseguita la migrazione delle funzionalità di SpeechService nell'app Servizi vocali di Google, che è diventata il provider SpeechService predefinito.
  • La funzionalità di RecognitionService è stata spostata nell'app Android System Intelligence per supportare il riconoscimento vocale sul dispositivo.

Per contribuire a mantenere la compatibilità delle app su Android 12, l'app Google utilizza un trampolino per deviare il traffico verso l'app Servizi vocali di Google. In Android 13, questo trampolino viene rimosso.

Le app dovrebbero usare il provider predefinito del dispositivo per SpeechService anziché hardcoded di un'app specifica.