Nové obmedzenia aplikácií na pozadí pre Android 12 by mohli byť veľkým problémom pre náročných používateľov

Nové obmedzenia aplikácií na pozadí pre Android 12 by mohli byť veľkým problémom pre skúsených používateľov, ktorí používajú aplikácie ako Termux a možno aj Tasker.

Android 12 zaviedla veľa zmien, aj keď nie všetky sú skutočne orientované na používateľa. Funkcie ako masívny redizajn Material You sú vám očividne vtlačené do tváre a je ťažké ich prehliadnuť, ale niečo ako Digitálny kľúč od auta podporu možno ľahšie vynechať. Jedna zmena, ktorá môže byť dokonca úplne nezdokumentovaná, spôsobí zmätok v aplikáciách ako Termux, a to je zavedenie dosť agresívneho zabijaka procesov na pozadí.

Pre kontext je Termux emulátor terminálu Linux, ktorý môžete získať v systéme Android, a správa balíkov spoločnosti Termux systém je podobný ako Debian's Advanced Package Tool (APT) v tom, že môžete vyhľadávať, inštalovať a odinštalovať pomocou príkaz apt. Termux nainštaluje len niekoľko základných balíkov hneď po vybalení, aby zmenšil veľkosť APK v Obchode Play, ale umožňuje vám nainštalovať ďalšie balíčky po ktorom túžiš. Ľudia často využívajú Termux na premenu starších smartfónov na mini servery alebo ho používajú na spúšťanie iných programov, ktoré zvyčajne nie sú zamerané na smartfóny. Bežným zvykom je dokonca natívne nastavenie youtube-dl, pretože skripty Python môžete spúšťať pomocou Termux na vašom smartfóne.

V systéme Android 12 však bolo objavené že mechanizmus na monitorovanie rozvetvených podriadených procesov spustených aplikáciami a zabíja ich, ak spotrebúvajú príliš veľa CPU, ak je aplikácia na pozadí (prostredníctvom Mishaal Rahman) bol predstavený. Obmedzuje tiež počet podriadených procesov, ktoré môžu nadradené procesy vytvoriť, na 32, čo výrazne obmedzuje počet operácií, ktoré môže aplikácia dokončiť na pozadí. Tento limit 32 podriadených procesov sa v skutočnosti vzťahuje na celý systém, nielen na aplikáciu, čo znamená, že k tomuto limitu budú prispievať aj ďalšie aplikácie s podriadenými procesmi. Testoval som na Google Pixel 6 Pro a môžem potvrdiť, že PhantomProcessKiller existuje a môže potenciálne spôsobiť zmätok na Termux.

Phantom Process Killer systému Android 12 zabíja procesy na pozadí

Android 12 zaviedol niekoľko obmedzení procesov na pozadí; prvým je, že podriadené procesy aplikácií, ktoré spotrebúvajú príliš veľa CPU na pozadí, budú zabité, ak je na pozadí aj nadradený proces. Druhým zavedeným obmedzením je obmedzenie počtu podriadených procesov, ktoré môžu byť aktívne v danom čase. Z spáchanie histórieZdá sa, že spoločnosť Google sa snažila zastaviť nečestné procesy na pozadí.

„Aplikácie môžu použiť Runtime.exec() na vytvorenie podriadeného procesu a rámec nebude mať žiadnu predstavu o svojom životnom cykle. Teraz sledujte tieto procesy vždy, keď ich nájdeme - v súčasnosti ich možno spozorovať počas vzorkovania štatistík procesora. Ak spotrebúva príliš veľa procesora, zatiaľ čo proces jeho nadradenej aplikácie je tiež na pozadí, zabite ho. Štandardne povoľujeme až 32 takýchto procesov; proces s najhorším skóre oom adj ich rodičov bude zabitý, ak ich bude príliš veľa."

Samozrejme, smartfóny s Androidom sú už notoricky známe zabíjaním aplikácií na pozadí. Takmer všetci hlavní výrobcovia OEM sa do toho nejakým spôsobom, tvarom alebo formou zapájajú a spoločnostiam sa to páči OnePlus, Samsung a Xiaomi sú považované za najhoršie. Aj keď má AOSP určité obmedzenia aplikácií na pozadí, pre výrobcov je typické, že nad AOSP stavajú svoje vlastné obmedzenia. Toto sú však dosť prísne obmedzenia pre pokročilých používateľov a podporujú správanie, proti ktorému boli pokročilí používatelia už dlhú dobu. Možno to z dlhodobého hľadiska zvýši výdrž batérie, ale zdá sa, že neexistuje žiadny spôsob, ako to vypnúť.

Spustenie Android 12 Phantom Process Killer

Ako hovorí záväzok, je povolených 32 takýchto procesov a overil som to na svojom Google Pixel 6 Pro pomocou nasledujúceho príkazu.

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

Vo výstupe tohto príkazu je konštanta s názvom „max_phantom_processes“ s hodnotou 32. V tejto súvislosti systém Android vyhodnotí „fantómový proces“ ako podriadený proces bežiaci na pozadí. Ak máte zariadenie so systémom Android 12, môžete pomocou Termuxu vytvoriť viac ako 32 podriadených procesov vytvorenie bash skriptu niekde vo vašom úložisku obsahujúceho nasledujúci kód a jeho spustenie (úvery na agnostik-apollo na GitHub, vývojár zapojený do Termux):

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

Ak ho chcete spustiť, v Termuxe prejdite do priečinka, do ktorého ste skript uložili, a zadajte nasledujúce:

shfilename.sh

Ak váš telefón začne pociťovať oneskorenie, znamená to, že funguje. Vyššie uvedený kód vytvorí na pozadí 40 operácií súčtu sha256 (označených ampersandom), pričom /dev/zero súbor ako vstup. sha256sum poskytne hash SHA-256 akéhokoľvek súboru, ktorý je zadaný ako vstup. Dôvod /dev/zero sa používa je, že ide o súbor s nekonečnou dĺžkou, ktorý obsahuje hodnoty null tak dlho, ako sa číta, čo znamená, že Operácia sha256sum nikdy nedosiahne koniec súboru, čo slúži ako dobrý záťažový test na zabezpečenie nepretržitého pozadia operácií.

Po niekoľkých sekundách až minúte sa môže zobraziť nasledovné:

„signál 9“ je signál odoslaný procesu, ktorý ho prinúti vypnúť, a tento signál posiela plánovač Linuxu. Dôvod, prečo sa správa objavuje, je ten, že bash terminál je tiež technicky podriadený proces Termuxu a Android 12 nakoniec zabije bash terminál vo vyššie uvedenej demonštrácii. Vo výstupe logcat môžete vidieť nasledovné:

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

Dôležitý riadok je ten, ktorý spomína, že proces „bash“ bol orezaný a potom zomrel, a preto Termux prestáva fungovať. Aj keď si nie som istý, čo je „nightwatch.txt“, zdá sa, že zbežné vyhľadávanie Google naznačuje, že to súvisí s Facebookom a Facebook Messengerom, dvoma aplikáciami, ktoré mám nainštalované. Testoval som to s vypnutou adaptívnou batériou a uistil som sa, že ani na Termux neboli aplikované žiadne optimalizácie batérie.

Po dokončení testovania je pravdepodobné, že niektoré operácie súčtu sha256 budú pokračovať v pozadie stále (a stlačenie klávesu Enter vynúti zatvorenie Termuxu), takže znova otvorte Termux a zadajte nasledujúce:

killall sha256sum

Zatiaľ čo takéto obmedzenie dáva zmysel pre niektoré aplikácie, aplikácie, ktoré by mohli mať väčší sklon používať používatelia (napríklad Termux), budú trpieť. To môže mať vplyv aj na ďalšie aplikácie, ktoré používajú aj pokročilí používatelia, ako napríklad Tasker. Je to obmedzenie, ktoré sa zatiaľ nezdá možné prekonať a zavádza ešte viac obmedzení pre aplikácie na pozadí nad všetky ostatné proprietárne obmedzenia, ktoré výrobcovia ukladajú. V prebiehajúcom vlákne problémov GitHub uvádza agnostic-apollo nasledujúce informácie o logcat, ktorý im bol zaslaný e-mailom:

„Všetkých 32 sledovaných logcat PhantomProcessRecord patrí do com.wsandroid.suite a termuxov bash bol jedným z procesov, ktoré boli zabité. Takže ako je uvedené vyššie, limit 32 procesov je pre všetky aplikácie spolu."

Je zábavné, že som vykonal rovnaké testy na Xiaomi 11T Pro so systémom Android 11 a potvrdil som, že toto správanie neexistuje na tomto konkrétnom zariadení v danej konfigurácii, aj keď sú zariadenia Xiaomi notoricky známe aplikáciou na pozadí obmedzenia. Toto je, napodiv, jedna z najprísnejších zásad správy aplikácií na pozadí zavedená na akomkoľvek smartfóne so systémom Android, pretože neexistuje spôsob, ako to obísť. Dokonca aj na zariadeniach Xiaomi a OnePlus je možné zakázať najviac a niektorým ľuďom ku šťastiu stačí vypnúť všetky optimalizácie batérie na týchto zariadeniach. Na rozdiel od toho, zabíjač fantómových procesov sa nedá ani vypnúť.

Ak sa spoliehate na Termux pri mnohých operáciách na zariadení, ktoré sú náročné s mnohými procesmi na pozadí, možno by stálo za to odložiť aktualizáciu, kým nebude k dispozícii viac informácií. Ak nie ste skúsený používateľ, pravdepodobne to nie je niečo, o čo by ste sa mali skutočne starať.