Le nuove limitazioni delle app in background di Android 12 potrebbero rappresentare un grosso grattacapo per gli utenti esperti

Le nuove limitazioni delle app in background di Android 12 potrebbero rappresentare un grosso grattacapo per gli utenti esperti che utilizzano app come Termux e forse anche Tasker.

Androide 12 ha introdotto molti cambiamenti, anche se non tutti sono realmente rivolti all'utente. Funzionalità come l'enorme riprogettazione del materiale ti vengono ovviamente sbattete in faccia e difficili da perdere, ma qualcosa di simile Chiave digitale dell'auto il supporto potrebbe essere più facile da perdere. Tuttavia, un cambiamento che potrebbe anche essere del tutto non documentato causerà il caos su app come Termux, e questa è l'introduzione di un killer dei processi in background piuttosto aggressivo.

Per contesto, Termux è un emulatore di terminale Linux che puoi ottenere su Android e la gestione dei pacchetti di Termux Il sistema è molto simile all'Advanced Package Tool (APT) di Debian in quanto è possibile cercare, installare e disinstallare con il comando comando adatto. Termux installa appena alcuni pacchetti base pronti all'uso, per ridurre le dimensioni dell'APK sul Play Store, ma ti consente di 

installare eventuali pacchetti aggiuntivi che desideri. Le persone spesso utilizzano Termux per trasformare i vecchi smartphone in mini server o per eseguire altri programmi che in genere non sono destinati agli smartphone. Un utilizzo comune è anche la configurazione nativa di youtube-dl, poiché puoi eseguire script Python utilizzando Termux sul tuo smartphone.

In Android 12, però, è stato scoperto che un meccanismo per monitorare i processi figli biforcati avviati dalle app e li uccide se consumano troppa CPU se l'app è in background (tramite Mishaal Rahman) è stato presentato. Limita inoltre a 32 il numero di processi secondari che i processi principali possono generare, il che limita notevolmente il numero di operazioni che un'app può completare in background. Questo limite di 32 processi secondari riguarda in realtà l'intero sistema, non solo per app, il che significa che anche altre app con processi secondari contribuiranno a tale limite. Ho testato su Google Pixel 6 Pro e posso confermare che PhantomProcessKiller esiste e può potenzialmente devastare Termux.

Il Phantom Process Killer di Android 12 uccide i processi in background

Android 12 ha introdotto un paio di restrizioni sui processi in background; il primo è che i processi secondari delle app che consumano troppa CPU in background verranno terminati se anche il processo principale è in background. La seconda restrizione introdotta è un limite al numero di processi figli che possono essere attivi in ​​un dato momento. Dal commettere la storia, sembrerebbe che Google stesse cercando di reprimere i processi in background non autorizzati.

"Le app potrebbero utilizzare Runtime.exec() per generare processi figli e il framework non avrà idea del suo ciclo di vita. Ora traccia questi processi ogni volta che li troviamo: attualmente durante il campionamento delle statistiche della CPU potrebbero essere individuati. Se consuma troppa CPU mentre anche il processo dell'app principale è in background, interrompilo. Per impostazione predefinita consentiamo fino a 32 processi di questo tipo; il processo con il punteggio oom adj peggiore dei genitori verrà interrotto se ce ne sono troppi."

Naturalmente, gli smartphone Android sono già noti per l’uccisione di app in background. Praticamente tutti i principali OEM si impegnano in questo in qualche modo, forma o forma, e alle aziende piace OnePlus, Samsung e Xiaomi sono considerati tra i peggiori. Sebbene AOSP abbia alcune restrizioni per le app in background, è tipico dei produttori creare le proprie restrizioni su AOSP. Tuttavia, queste sono limitazioni piuttosto rigide per gli utenti esperti e incoraggiano comportamenti contro i quali gli utenti esperti si oppongono apertamente da molto tempo. Forse aumenterà la durata della batteria a lungo termine, ma apparentemente non c'è nemmeno modo di disabilitarlo.

Attivazione del killer del processo Phantom di Android 12

Come dice il commit, sono consentiti 32 processi di questo tipo e l'ho verificato sul mio Google Pixel 6 Pro con il seguente comando.

adb shell "/system/bin/dumpsys activity settings"

Nell'output di questo comando c'è una costante chiamata "max_phantom_processes" con un valore di 32. In questo contesto un "processo fantasma" viene considerato dal sistema Android un processo figlio eseguito in background. Se disponi di un dispositivo Android 12, puoi utilizzare Termux per generare più di 32 processi secondari creando uno script bash da qualche parte nella memoria contenente il seguente codice ed eseguendolo (crediti a agnostico-apollo su GitHub, uno sviluppatore coinvolto con Termux):

for i in $(seq 40); do
sha256sum /dev/zero &
done

Per eseguirlo, in Termux vai alla cartella in cui hai salvato lo script e digita quanto segue:

shfilename.sh

Se il tuo telefono inizia a sembrare lento, significa che funziona. Il codice precedente genera 40 operazioni sha256sum in background (indicate dalla e commerciale) prendendo il /dev/zero file come input. sha256sum fornirà l'hash SHA-256 di qualunque file venga fornito come input. La ragione /dev/zero viene utilizzato è che si tratta di un file di lunghezza infinita che contiene valori nulli per tutto il tempo in cui viene letto, il che significa che il L'operazione sha256sum non raggiungerà mai la fine del file, fungendo da buon stress test per garantire un background continuo operazioni.

Dopo alcuni secondi o un minuto, potrebbe essere visualizzato quanto segue:

"segnale 9" è un segnale inviato al processo che ne forza l'arresto e questo segnale viene inviato dallo scheduler Linux. Il motivo per cui appare il messaggio è che anche il terminale bash è tecnicamente un processo figlio di Termux e Android 12 finisce per uccidere il terminale bash nella dimostrazione sopra. Nell'output di logcat, puoi vedere quanto segue:

11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {623260a 7362:7284:nightwatch.txt/u0a227}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {bf3d88c 24220:24040:nightwatch.txt/u0a237}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {b160bd5 27316:27269:bash/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {bbc1fea 27371:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {9cf12db 27372:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {54bf178 27373:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {fb89051 27374:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {d3450b6 27375:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {2a201b7 27376:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {60aad24 27377:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {124e08d 27378:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.507 1444 1762 I ActivityManager: Killing PhantomProcessRecord {32cc242 27379:27269:sha256sum/u0a340}: Trimming phantom processes
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {b160bd5 27316:27269:bash/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {9cf12db 27372:27269:sha256sum/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {414579a 27434:27269:top/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {32cc242 27379:27269:sha256sum/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {bbc1fea 27371:27269:sha256sum/u0a340} died
11-02 13:01:52.511 1444 1764 I ActivityManager: Process PhantomProcessRecord {bf3d88c 24220:24040:nightwatch.txt/u0a237} died
11-02 13:01:52.512 1444 1764 I ActivityManager: Process PhantomProcessRecord {60aad24 27377:27269:sha256sum/u0a340} died
11-02 13:01:52.516 1444 1764 I ActivityManager: Process PhantomProcessRecord {623260a 7362:7284:nightwatch.txt/u0a227} died
11-02 13:01:52.516 1444 1764 I ActivityManager: Process PhantomProcessRecord {124e08d 27378:27269:sha256sum/u0a340} died
11-02 13:01:52.517 1444 1764 I ActivityManager: Process PhantomProcessRecord {fb89051 27374:27269:sha256sum/u0a340} died
11-02 13:01:52.519 1444 1764 I ActivityManager: Process PhantomProcessRecord {54bf178 27373:27269:sha256sum/u0a340} died
11-02 13:01:52.532 1444 1764 I ActivityManager: Process PhantomProcessRecord {2a201b7 27376:27269:sha256sum/u0a340} died
11-02 13:01:52.545 1444 1764 I ActivityManager: Process PhantomProcessRecord {d3450b6 27375:27269:sha256sum/u0a340} died

La riga importante è quella che menziona che il processo "bash" è stato tagliato e poi è morto, ed è per questo che Termux smette di funzionare. Anche se non sono sicuro di cosa sia "nightwatch.txt", una rapida ricerca su Google sembra suggerire che sia correlato a Facebook e Facebook Messenger, due app che ho installato. L'ho testato con la batteria adattiva spenta e mi sono assicurato che non venissero applicate ottimizzazioni della batteria a Termux.

Dopo aver terminato i test, è probabile che alcune delle operazioni sha256sum continueranno nel file sfondo ancora (e premendo Invio verrà forzata la chiusura di Termux), quindi riapri Termux e digita il file seguente:

killall sha256sum

Sebbene tale limitazione abbia senso per alcune app, le app che gli utenti esperti potrebbero essere più propensi a utilizzare (come Termux) ne risentiranno. Ciò potrebbe avere un effetto anche su altre app utilizzate anche dagli utenti esperti, come Tasker. È una limitazione che non sembra ancora possibile superare e introduce ancora più limitazioni sulle app in background oltre a tutte le altre restrizioni proprietarie imposte dai produttori. Nel thread in corso sul problema di GitHub, agnostic-apollo menziona quanto segue riguardo a un logcat che è stato loro inviato via email:

"Tutti i 32 logcat tracciati PhantomProcessRecord appartengono a com.wsandroid.suite e bash di termux è stato uno dei processi che sono stati uccisi. Quindi, come accennato in precedenza, il limite di 32 processi vale per tutte le app combinate"

In modo divertente, ho eseguito gli stessi test su uno Xiaomi 11T Pro con Android 11 e ho confermato che il comportamento non esiste su quel particolare dispositivo in quella configurazione, anche se i dispositivi Xiaomi sono noti per l'app in background limitazioni. Stranamente, questa è una delle politiche di gestione delle applicazioni in background più rigide introdotte su qualsiasi smartphone Android, poiché non c'è modo di aggirarla. Anche sui dispositivi Xiaomi e sui dispositivi OnePlus è possibile disattivare maggior parte di esso, e per alcune persone, disabilitare tutte le ottimizzazioni della batteria su quei dispositivi è sufficiente per essere felici. Il killer del processo fantasma, al contrario, non può nemmeno essere disabilitato.

Se ti affidi a Termux per molte operazioni sul dispositivo che richiedono molti processi in background, potrebbe valere la pena rimandare l'aggiornamento per ora finché non saranno disponibili ulteriori informazioni. Se non sei un utente esperto, probabilmente non è qualcosa di cui devi davvero preoccuparti.