Нові обмеження фонових додатків Android 12 можуть стати головним болем для досвідчених користувачів

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

Android 12 запровадив багато змін, хоча не всі вони справді призначені для користувача. Такі функції, як масивний редизайн Material You, очевидно, кидаються вам в очі, і їх важко пропустити, але щось на зразок Цифровий автомобільний ключ підтримку може бути легше пропустити. Однак одна зміна, яка може навіть бути зовсім незадокументованою, завдасть хаосу таким програмам, як Termux, і це впровадження досить агресивного вбивці фонових процесів.

Для контексту Termux — це емулятор терміналу Linux, який можна отримати на Android, і керування пакетами Termux система багато в чому схожа на Advanced Package Tool (APT) Debian, оскільки ви можете шукати, встановлювати та видаляти за допомогою команда кв. Termux одразу встановлює лише кілька базових пакетів, щоб зменшити розмір APK у Play Store, але дозволяє встановити додаткові пакети

що ви бажаєте. Люди часто використовують Termux для перетворення старих смартфонів на міні-сервери або використовують його для запуску інших програм, які зазвичай не призначені для смартфонів. Звичайним використанням є навіть початкове налаштування youtube-dl, оскільки ви можете виконувати сценарії Python за допомогою Termux на своєму смартфоні.

Однак в Android 12 це було виявлено що механізм моніторингу розгалужених дочірніх процесів, запущених програмами, і вбиває їх, якщо вони споживають занадто багато ЦП, якщо програма працює у фоновому режимі (через Мішал Рахман) було представлено. Це також обмежує кількість дочірніх процесів, які можуть породжувати батьківські процеси, до 32, що значно обмежує кількість операцій, які програма може виконати у фоновому режимі. Цей ліміт у 32 дочірніх процеси фактично поширюється на всю систему, а не лише на програму, тобто інші програми з дочірніми процесами також сприятимуть цьому обмеженню. Я тестував на Google Pixel 6 Pro і можу підтвердити, що PhantomProcessKiller існує і потенційно може завдати шкоди Termux.

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

Android 12 представив кілька обмежень на фонові процеси; перший полягає в тому, що дочірні процеси програм, які споживають занадто багато ЦП у фоновому режимі, будуть припинені, якщо батьківський процес також працює у фоновому режимі. Друге введене обмеження — це обмеження на кількість дочірніх процесів, які можуть бути активними в будь-який момент часу. Від фіксувати історію, схоже, що Google намагався придушити шахрайські фонові процеси.

«Програми можуть використовувати Runtime.exec() для створення дочірнього процесу, і структура не матиме жодного уявлення про його життєвий цикл. Тепер відстежуйте ці процеси щоразу, коли ми їх знаходимо - наразі під час вибірки статистики ЦП їх можна помітити. Якщо він споживає забагато ЦП, а процес батьківської програми також працює у фоновому режимі, вимкніть його. За замовчуванням ми дозволяємо до 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 для багатьох операцій на пристрої, які є інтенсивними з багатьма фоновими процесами, можливо, варто відкласти оновлення, доки не буде більше інформації. Якщо ви не досвідчений користувач, то, ймовірно, вам не варто хвилюватися про це.