Congelatore delle app memorizzate nella cache

Android 11 QPR3 o versioni successive supportano il blocco delle app memorizzate nella cache. Questa funzionalità interrompe l'esecuzione dei processi memorizzati nella cache e riduce l'utilizzo delle risorse da parte di app con comportamento anomalo che potrebbero tentare di funzionare mentre sono memorizzate nella cache. Il framework blocca le app memorizzate nella cache eseguendo la migrazione dei relativi processi in un cgroup bloccato. In questo modo, si riduce il consumo di CPU attivo e inattivo in presenza di app memorizzate nella cache attive. Il blocco delle app può essere attivato utilizzando un flag di configurazione di sistema o un'opzione per sviluppatori.

Implementare il congelamento delle app

Il congelatore delle app memorizzate nella cache utilizza il congelatore cgroup v2 del kernel. I dispositivi spediti con un kernel compatibile possono (facoltativamente) attivarlo. Per farlo, attiva l'opzione sviluppatore "Sospendi esecuzione per app memorizzate nella cache" o imposta il flag di configurazione del dispositivo activity_manager_native_boot use_freezer su true. Ad esempio:

adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot

Il congelatore è disattivato quando il flag use_freezer è impostato su false o l'opzione sviluppatore è disattivata. Puoi attivare/disattivare questa impostazione modificando la configurazione di un dispositivo in una release o un aggiornamento software.

Il freezer delle app non espone API ufficiali (e non ha un client di implementazione di riferimento), ma utilizza le API di sistema nascoste setProcessFrozen e enableFreezer. Per informazioni dettagliate su queste API, consulta Process.java di ActivityManager e l'API ActivityManagerService. Gli sviluppatori possono anche fare riferimento al codice client in ActivityManager per gli esperimenti.

Gestire le funzionalità personalizzate

In genere, non è previsto che i processi svolgano attività quando vengono memorizzati nella cache, ma alcune app potrebbero avere funzionalità personalizzate supportate da processi che devono essere eseguiti mentre sono memorizzati nella cache. Quando il blocco delle app è attivato su un dispositivo che esegue un'app di questo tipo, i processi memorizzati nella cache vengono bloccati e potrebbero impedire il funzionamento delle funzionalità personalizzate.

Come soluzione alternativa, se un'app ha un processo che deve eseguire attività durante la memorizzazione nella cache, modifica lo stato del processo in non memorizzato nella cache (ad esempio Bound ForeGround Service (BFGS) o in primo piano) prima che il processo debba eseguire qualsiasi operazione per consentire all'app di rimanere attiva.

Testare il congelatore delle app

Per verificare che il blocco delle app funzioni come previsto, utilizza le seguenti risorse:

  • Controlla un elenco di processi bloccati utilizzando il comando adb shell dumpsys activity e cerca Apps frozen:.

  • Controlla la presenza del file /sys/fs/cgroup/uid_0/cgroup.freeze.

  • Visualizza logcat, che mostra le voci bloccate e sbloccate ogni volta che un processo viene spostato all'interno o all'esterno del freezer. Ad esempio:

    adb logcat | grep -i "\(freezing\|froze\)"