Nowe ograniczenia aplikacji działających w tle w Androidzie 12 mogą być poważnym problemem dla zaawansowanych użytkowników korzystających z aplikacji takich jak Termux, a może nawet Tasker.
Androida 12 wprowadził wiele zmian, choć nie wszystkie z nich są tak naprawdę skierowane do użytkownika. Funkcje takie jak ogromny, przeprojektowany materiał Material You są oczywiście rzucane w oczy i trudne do przeoczenia, ale coś w tym stylu Cyfrowy kluczyk samochodowy wsparcie może być łatwiejsze do przeoczenia. Jednak jedna zmiana, która może być nawet całkowicie nieudokumentowana, spowoduje spustoszenie w aplikacjach takich jak Termux, a jest nią wprowadzenie dość agresywnego zabójcy procesów w tle.
Dla kontekstu Termux to emulator terminala Linux, który można pobrać na Androida, oraz zarządzanie pakietami Termux system przypomina zaawansowane narzędzie pakietowania Debiana (APT), w którym można wyszukiwać, instalować i odinstalowywać za pomocą pliku Komenda trafny. Termux instaluje tylko kilka podstawowych pakietów, aby zmniejszyć rozmiar pliku APK w Sklepie Play, ale pozwala
zainstaluj dodatkowe pakiety że pragniesz. Ludzie często korzystają z Termux, aby zamienić starsze smartfony w miniserwery lub używać go do uruchamiania innych programów, które zazwyczaj nie są przeznaczone dla smartfonów. Powszechnym zastosowaniem jest nawet natywna konfiguracja youtube-dl, ponieważ możesz wykonywać skrypty Pythona za pomocą Termux na swoim smartfonie.Jednak w Androidzie 12 zostało odkryte że mechanizm monitorowania rozwidlonych procesów potomnych uruchamianych przez aplikacje i zabija je, jeśli zużywają zbyt dużo procesora, jeśli aplikacja działa w tle (przez Miszaala Rahmana) został wprowadzony. Ogranicza także liczbę procesów potomnych, które mogą odrodzić się procesy nadrzędne, do 32, co znacznie ogranicza liczbę operacji, które aplikacja może wykonać w tle. Ten limit 32 procesów podrzędnych obowiązuje w całym systemie, a nie tylko w jednej aplikacji, co oznacza, że inne aplikacje z procesami podrzędnymi również będą miały udział w tym limicie. Testowałem na Google Pixel 6 Pro i mogę potwierdzić, że PhantomProcessKiller istnieje i może potencjalnie siać spustoszenie w Termux.
Phantom Process Killer w Androidzie 12 zabija procesy w tle
Android 12 wprowadził kilka ograniczeń dotyczących procesów w tle; po pierwsze, procesy potomne aplikacji zużywających zbyt dużo procesora w tle zostaną zatrzymane, jeśli proces nadrzędny również będzie działał w tle. Drugie wprowadzone ograniczenie to ograniczenie liczby procesów potomnych, które mogą być aktywne w danym momencie. Z popełnić historię, wygląda na to, że Google próbował ograniczyć nielegalne procesy działające w tle.
„Aplikacje mogą używać Runtime.exec() do tworzenia procesów potomnych, a framework nie będzie miał pojęcia o jego cyklu życia. Teraz śledź te procesy, gdy tylko je znajdziemy — obecnie podczas próbkowania statystyk procesora można je wykryć. Jeśli zużywa zbyt dużo procesora, gdy proces aplikacji nadrzędnej również działa w tle, zabij go. Domyślnie dopuszczamy do 32 takich procesów; proces z najgorszym wynikiem oom adj spośród swoich rodziców zostanie zabity, jeśli będzie ich zbyt wielu.
Oczywiście smartfony z Androidem są już znane z zabijania aplikacji działających w tle. Prawie wszyscy główni producenci OEM angażują się w to w jakiś sposób, w jakimś kształcie lub formie, a firmy lubią OnePlus, Samsung i Xiaomi są uważane za najgorsze. Chociaż AOSP ma pewne ograniczenia dotyczące aplikacji działających w tle, typową praktyką producentów jest tworzenie własnych ograniczeń na podstawie AOSP. Są to jednak dość rygorystyczne ograniczenia dla zaawansowanych użytkowników i zachęcają do zachowań, którym użytkownicy zaawansowani głośno sprzeciwiali się przez długi czas. Być może na dłuższą metę wydłuży to żywotność baterii, ale najwyraźniej nie ma też możliwości wyłączenia tego.
Uruchamianie narzędzia Phantom Process Killer w systemie Android 12
Jak mówi zatwierdzenie, dozwolone są 32 takie procesy i zweryfikowałem to na moim Google Pixel 6 Pro za pomocą następującego polecenia.
adb shell "/system/bin/dumpsys activity settings"
Na wyjściu tego polecenia znajduje się stała o nazwie „max_phantom_processes” o wartości 32. W tym kontekście system Android ocenia „proces fantomowy” jako proces potomny działający w tle. Jeśli masz urządzenie z Androidem 12, możesz użyć Termux do odrodzenia ponad 32 procesów potomnych utworzenie skryptu bash gdzieś w pamięci zawierającego następujący kod i wykonanie go (podziękowania dla agnostyk-apollo na GitHub, programista związany z Termux):
for i in $(seq 40); do
sha256sum /dev/zero &
done
Aby go wykonać, w Termuxie przejdź do folderu, w którym zapisałeś skrypt i wpisz:
shfilename.sh
Jeśli Twój telefon zaczyna działać z opóźnieniem, oznacza to, że działa. Powyższy kod uruchamia 40 operacji sha256sum w tle (oznaczonych ampersandem), biorąc pod uwagę /dev/zero plik jako wejście. sha256sum da skrót SHA-256 dowolnego pliku podanego jako dane wejściowe. Powód /dev/zero jest to, że jest to plik o nieskończonej długości, który zawiera wartości null tak długo, jak jest czytany, co oznacza, że Operacja sha256sum nigdy nie dotrze do końca pliku, co służy jako dobry test warunków skrajnych w celu zapewnienia ciągłego tła operacje.
Po kilku sekundach do minuty może pojawić się następujący komunikat:
„sygnał 9” to sygnał wysyłany do procesu, zmuszający go do zamknięcia, i sygnał ten jest wysyłany przez program planujący Linuksa. Powodem pojawienia się komunikatu jest to, że terminal bash jest technicznie również procesem potomnym Termux, a Android 12 kończy się zabijaniem terminala bash w powyższej demonstracji. W wynikach logcat można zobaczyć następujące informacje:
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
Ważną linijką jest ta, która wspomina, że proces „bash” został przycięty, a następnie umarł i dlatego Termux przestaje działać. Chociaż nie mam pewności, co to jest plik „nightwatch.txt”, pobieżne wyszukiwanie w Google wydaje się sugerować, że jest on powiązany z Facebookiem i Facebook Messengerem – dwiema aplikacjami, które faktycznie zainstalowałem. Przetestowałem to przy wyłączonej baterii adaptacyjnej i upewniłem się, że w Termuxie nie zastosowano żadnych optymalizacji baterii.
Po zakończeniu testowania prawdopodobnie niektóre operacje sha256sum będą kontynuowane w pliku tło nadal (a naciśnięcie Enter wymusi zamknięcie Termux), więc otwórz ponownie Termux i wpisz następny:
killall sha256sum
Chociaż takie ograniczenie ma sens w przypadku niektórych aplikacji, ucierpią na tym aplikacje, z których użytkownicy zaawansowani mogą być bardziej skłonni korzystać (takie jak Termux). Może to mieć również wpływ na inne aplikacje, z których korzystają również zaawansowani użytkownicy, takie jak Tasker. Jest to ograniczenie, które nie wydaje się jeszcze możliwe do pokonania i wprowadza jeszcze więcej ograniczeń dla aplikacji działających w tle, oprócz wszystkich innych zastrzeżonych ograniczeń nałożonych przez producentów. W bieżącym wątku dotyczącym problemów z GitHubem agnostic-apollo wspomina o następującym wpisie dotyczącym logcat, który został do nich wysłany e-mailem:
„Wszystkie 32 śledzone logcat PhantomProcessRecord należą do com.wsandroid.suite, a bash termuxa był jednym z procesów, który został zabity. Jak wspomniano powyżej, limit 32 procesów dotyczy wszystkich aplikacji łącznie”
Co zabawne, przeprowadziłem te same testy na Xiaomi 11T Pro z Androidem 11 i potwierdziłem, że takie zachowanie nie istnieje na tym konkretnym urządzeniu w tej konfiguracji, mimo że urządzenia Xiaomi słyną z aplikacji działających w tle ograniczenia. Co dziwne, jest to jedna z najsurowszych zasad zarządzania aplikacjami w tle wprowadzonych na dowolnym smartfonie z Androidem, ponieważ nie można jej obejść. Nawet na urządzeniach Xiaomi i OnePlus można wyłączyć bardzo z tego, a niektórym osobom do szczęścia wystarczy wyłączenie wszystkich optymalizacji baterii na tych urządzeniach. Natomiast fantomowego zabójcy procesów nie można nawet wyłączyć.
Jeśli polegasz na Termuxie w przypadku wielu operacji na urządzeniu, które są intensywne i wymagają wielu procesów w tle, warto na razie wstrzymać się z aktualizacją, dopóki nie będzie więcej informacji. Jeśli nie jesteś zaawansowanym użytkownikiem, prawdopodobnie nie jest to coś, czym naprawdę musisz się martwić.