Ограниченията на новите фонови приложения на Android 12 могат да бъдат голямо главоболие за опитните потребители

Новите ограничения на фоновите приложения на Android 12 може да са голямо главоболие за опитни потребители, които използват приложения като Termux и може би дори Tasker.

Android 12 въведе много промени, въпреки че не всички от тях наистина са ориентирани към потребителите. Характеристики като масивния материал, който препроектирате, очевидно са ви набутани в лицето и е трудно да ги пропуснете, но нещо като Цифров ключ за кола поддръжка може да бъде по-лесно да пропуснете. Въпреки това, една промяна, която може дори да е напълно недокументирана, ще предизвика хаос в приложения като Termux и това е въвеждането на доста агресивен убиец на фонови процеси.

За контекст, Termux е терминален емулатор на Linux, който можете да получите на Android, и управлението на пакети на Termux системата е много подобна на Advanced Package Tool (APT) на Debian, тъй като можете да търсите, инсталирате и деинсталирате с команда ап. Termux инсталира само няколко основни пакета веднага, за да намали размера на APK в Play Store, но ви позволява да 

инсталирайте всички допълнителни пакети че желаете. Хората често ще използват Termux, за да превърнат по-стари смартфони в мини сървъри или да го използват за стартиране на други програми, които обикновено не са насочени към смартфони. Често срещано използване е дори естествено настройване на youtube-dl, тъй като можете да изпълнявате Python скриптове с помощта на Termux на вашия смартфон.

В Android 12 обаче, беше открито че механизъм за наблюдение на разклонени дъщерни процеси, стартирани от приложения, и ги убива, ако консумират твърде много CPU, ако приложението е във фонов режим (чрез Мишал Рахман) беше въведен. Той също така ограничава броя на дъщерните процеси, които родителските процеси могат да генерират до 32, което значително ограничава броя на операциите, които приложението може да изпълни във фонов режим. Това ограничение от 32 дъщерни процеса всъщност е в цялата система, а не само за приложение, което означава, че други приложения с дъщерни процеси също ще допринесат за това ограничение. Тествах на Google Pixel 6 Pro и мога да потвърдя, че PhantomProcessKiller съществува и потенциално може да причини хаос на Termux.

Phantom Process Killer на Android 12 убива фоновите процеси

Android 12 въведе няколко ограничения върху фоновите процеси; първият е, че дъщерните процеси на приложения, които консумират твърде много CPU във фонов режим, ще бъдат убити, ако родителският процес също е във фонов режим. Второто въведено ограничение е ограничение за броя дъщерни процеси, които могат да бъдат активни във всеки един момент. От ангажимент история, изглежда, че Google се опитва да ограничи измамните фонови процеси.

„Приложенията могат да използват Runtime.exec() за създаване на дъщерен процес и рамката няма да има представа за неговия жизнен цикъл. Сега проследявайте тези процеси, когато ги открием - в момента по време на вземането на проби от статистиката на процесора те могат да бъдат забелязани. Ако консумира твърде много CPU, докато процесът на родителското му приложение също е във фонов режим, убийте го. По подразбиране разрешаваме до 32 такива процеса; процесът с най-лошия oom adj резултат на техните родители ще бъде убит, ако има твърде много от тях."

Разбира се, смартфоните с Android вече са известни с убиването на фонови приложения. Почти всички големи производители на оригинално оборудване участват в него по някакъв начин, форма или форма и компаниите харесват OnePlus, Samsung и Xiaomi се смятат за едни от най-лошите. Въпреки че AOSP има някои ограничения за фонови приложения, за производителите е типично да създават свои собствени ограничения върху AOSP. Въпреки това, това са доста строги ограничения за опитни потребители и насърчават поведение, срещу което опитните потребители се противопоставят от дълго време. Може би това ще увеличи живота на батерията в дългосрочен план, но изглежда също няма начин да го деактивирате.

Задействане на Android 12 Phantom Process Killer

Както се казва в ангажимента, разрешени са 32 такива процеса и аз проверих това на моя Google Pixel 6 Pro със следната команда.

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

В изхода на тази команда има константа, наречена "max_phantom_processes" със стойност 32. В този контекст "фантомният процес" се оценява от системата Android като дъщерен процес, работещ във фонов режим. Ако имате устройство с Android 12, можете да използвате Termux, за да създадете повече от 32 дъщерни процеса чрез създаване на bash скрипт някъде във вашето хранилище, съдържащ следния код и неговото изпълнение (кредити към агностик-аполон на GitHub, разработчик, участващ в Termux):

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

За да го изпълните, в Termux отидете до папката, в която сте запазили скрипта, и въведете следното:

shfilename.sh

Ако телефонът ви започне да закъснява, това означава, че работи. Горният код ражда 40 операции sha256sum във фонов режим (обозначени с амперсанд), вземайки /dev/zero файл като вход. sha256sum ще даде SHA-256 хеш на всеки файл, който е даден като вход. Причината /dev/zero се използва е, че това е файл с безкрайна дължина, който съдържа нулеви стойности, докато се чете, което означава, че операцията sha256sum никога няма да достигне края на файла, което служи като добър стрес тест за осигуряване на непрекъснат фон операции.

След няколко секунди до минута може да се появи следното:

"сигнал 9" е сигнал, изпратен към процеса, който го принуждава да се изключи, и този сигнал се изпраща от програмата за планиране на Linux. Причината, поради която се появява съобщението, е, че bash терминалът технически също е дъщерен процес на Termux и Android 12 в крайна сметка убива bash терминала в горната демонстрация. В изхода на logcat можете да видите следното:

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

Важният ред е този, който споменава, че процесът "bash" е бил отрязан и след това е умрял и затова Termux спира да работи. Въпреки че не съм сигурен какво е „nightwatch.txt“, бегло търсене в Google изглежда предполага, че е свързано с Facebook и Facebook Messenger, две приложения, които наистина съм инсталирал. Тествах това с изключена адаптивна батерия и се уверих, че няма оптимизации на батерията, приложени и към Termux.

След като приключите с тестването, вероятно някои от операциите на sha256sum ще продължат в фон все още (и натискането на enter ще затвори принудително Termux), така че отворете отново Termux и въведете следното:

killall sha256sum

Въпреки че такова ограничение има смисъл за някои приложения, приложенията, които опитните потребители може да са по-склонни да използват (като Termux), ще пострадат. Това може да има ефект и върху други приложения, които опитни потребители също използват, като Tasker. Това е ограничение, което все още не изглежда възможно да бъде преодоляно и въвежда още повече ограничения върху фоновите приложения в допълнение към всички други собственически ограничения, които производителите налагат. В текущата тема на GitHub, следното се споменава от agnostic-apollo относно logcat, който им е изпратен по имейл:

„Всичките 32 проследени logcat PhantomProcessRecord принадлежат на com.wsandroid.suite и bash на termux беше един от процесите, които бяха убити. Както бе споменато по-горе, ограничението от 32 процеса е за всички приложения заедно"

Забавно, проведох същите тестове на Xiaomi 11T Pro с Android 11 и потвърдих, че поведението не съществува на това конкретно устройство в тази конфигурация, въпреки че устройствата на Xiaomi са известни с приложението си във фонов режим ограничения. Странно, това е една от най-строгите политики за управление на фонови приложения, въведени на всеки смартфон с Android, тъй като няма начин да се заобиколи. Дори на устройства Xiaomi и устройства OnePlus е възможно да се деактивира повечето от него и за някои хора деактивирането на всички оптимизации на батерията на тези устройства е достатъчно, за да бъдат щастливи. За разлика от това фантомният убиец на процеси дори не може да бъде деактивиран.

Ако разчитате на Termux за много операции на устройството, които са интензивни с много фонови процеси, може би си струва да отложите надграждането засега, докато има повече информация. Ако не сте опитен потребител, тогава това вероятно не е нещо, за което наистина трябва да се тревожите.