Android O порушує роботу програм, які накладаються на панель стану

Android O припиняє підтримку TYPE_SYSTEM_OVERLAY на користь TYPE_APPLICATION_OVERLAY, у результаті чого програми, які накладаються поверх рядка стану, не працюють.

Потік дописів із описом нових функцій для користувачів, знайдених у Android O починає сповільнюватися, оскільки користувачі мали тижні, щоб перевірити програмне забезпечення на своїх пристроях. Однак є багато, багато змін, зроблених під капотом, які повільно розкриваються. Нещодавно ми опублікували одну з таких змін щодо пристроїв Nexus і Pixel під управлінням Android O прийняття SDCardFS. Але сьогодні ми хотіли б обговорити зміни, які вплинуть на розробників певних програм, зокрема тих, які поверх рядка стану. Ці програми, здається, є зламано в Android O Developer Preview, яку на перший погляд ви можете відкинути як звичайну помилку, але заглибившись у довідкову документацію, це може бути намічена зміна від Google.


Android O порушує накладення рядка стану

Одна з моїх улюблених речей про Android – це те, наскільки він настроюється. Користувачі, які користуються рутованими правами або використовують користувацькі ПЗУ, можуть створювати теми для рядків стану своєї системи без жодних обмежень, але якщо ваш пристрій не рутований, у вас буде менше можливостей. На щастя, у магазині Google Play є багато програм, які дозволяють змінювати вигляд рядка стану на базовому рівні. Це можливо завдяки розумній комбінації System Overlay Windows для відображення спеціального рядка стану поверх наявного, Прослуховувачі сповіщень для відображення сповіщень і, за бажанням, служба доступності, щоб дозволити контекстне відтінювання настроюваного Рядок стану.

Два знімки екрана вище показують, як виглядала б моя панель сповіщень під час використання однієї з багатьох програм для накладання панелі стану, доступних у Play Store. Ці скріншоти зроблено на Huawei Mate 9 без рутування під керуванням EMUI 5.0. Для тих із вас, хто не знайомий із EMUI, рядок стану зовсім не схожий на скріншоти вище. Натомість це виглядає так:

Якщо ви не заперечуєте, як виглядає рядок стану вашого запасу, то такі програми, як Статус або Рядок стану матеріалу є знахідками. Але якщо або коли ваш пристрій оновиться до Android O, ці програми можуть більше не працювати. Ось як виглядають ці дві програми на Google Pixel із попереднім переглядом розробника Android O:

Замість того, щоб накладка блокувала оригінальний рядок стану, вона виглядає як накладка перекриття з оригінальним рядком стану, що призводить до величезного безладу.

На жаль, це фактично робить такі програми марними. І це стосується не лише типових програм для оформлення панелі стану – впливають на всі програми, які вимагають відображення накладки вгорі рядка стану.

Ось список деяких популярних програм, які можуть бути марними:

  • Статус (500 000 - 1 000 000 встановлень)
  • Рядок стану матеріалу (1 000 000 - 5 000 000 встановлень)
  • Класний інструмент - системна статистика (500 000 - 1 000 000 встановлень)
  • телекіно (50 000 - 100 000 встановлення)
  • Очистити рядок стану (100 000 - 500 000 встановлень)
  • Tinycore (100 000 - 500 000 встановлень)

І список деяких програм, які працюватимуть, але більше не можуть накладатися на рядок стану (обмежують попередні функції):

  • Сутінки (5 000 000 - 10 000 000 встановлень)
  • HeadsUp (100 000 - 500 000 встановлень)
  • Міні-монітор ресурсів (50 000 - 100 000 встановлення)
  • Мережевий монітор міні (1 000 000 - 5 000 000 встановлень)

У магазині Play є багато інших програм, які використовують певне накладення вгорі рядка стану, але ви вже можете сказати, що така зміна вплине на багато додатків, які потенційно використовуються мільйонами користувачів. Так що тут відбувається?


TYPE_SYSTEM_OVERLAY припиняється

З кожною новою ітерацією Android Google одночасно вводить і припиняє підтримку (визначає як застарілі та має бути видалено) різні функції. Цього разу функція, яка знаходиться на рубашці, — TYPE_SYSTEM_OVERLAY. Цитувати довідкова сторінка для чого ця функція запропонувала розробникам:

TYPE_SYSTEM_OVERLAY

Тип вікна: системні накладні вікна, які потрібно відображати поверх усього іншого. Ці вікна не повинні приймати фокус введення, інакше вони заважатимуть блокуванню клавіатури. У багатокористувацьких системах відображається лише у вікні власника користувача.

По суті, цей тип вікна дозволяє програмі малювати поверх будь-якого елемента на екрані, включаючи рядок стану. Однак, починаючи з Android O, цей тип вікна застарів. Для несистемних програм Google рекомендує розробникам використовувати замість них TYPE_APPLICATION_OVERLAY. Цитувати довідкова сторінка для чого цей новий тип вікна:

TYPE_APPLICATION_OVERLAY

Тип вікна: накладені вікна програми відображаються над усіма вікнами активності (типи між FIRST_APPLICATION_WINDOW і LAST_APPLICATION_WINDOW), але нижче критичних системних вікон, таких як рядок стану або IME.

Система може будь-коли змінити положення, розмір або видимість цих вікон, щоб зменшити візуальний безлад для користувача, а також керувати ресурсами.

Система регулюватиме важливість процесів із цим типом вікна, щоб зменшити ймовірність того, що вбивця з низьким обсягом пам’яті вб’є їх.

У багатокористувацьких системах відображається лише на екрані власника користувача.

Як бачите, цей новий тип вікна дозволяє програмам накладати вміст поверх усіх інших вікон активності крім «критичні системні вікна, такі як рядок стану або IME» (IME відноситься до клавіатури). Це добре для таких програм, як Facebook Messenger, оскільки заголовки чату, надані цією програмою, не мають мети розміщуватися вгорі рядка стану, але це негативно впливає на більшість програм, про які я згадував раніше.

Крім того, здається, що наразі розробники не можуть використовувати обхідний шлях. Можна очікувати, що для того, щоб уникнути цієї проблеми на Android O, розробники просто створюють свої програми для SDK 25 (Android 7.1.1). Однак, як зазначив в розробник Status на Reddit, має Google замінено TYPE_SYSTEM_OVERLAY з TYPE_APPLICATION_OVERLAY, і зміна незалежно від цільового SDK версія. Розробники, які використовують TYPE_SYSTEM_OVERLAY, наразі мають використовувати TYPE_APPLICATION_OVERLAY, щоб підтримувати сумісність, отже, незалежно від того, на якій цільовій версії SDK базується конкретна програма, вона може більше не використовувати TYPE_SYSTEM_OVERLAY на Android O.


Що з цим можна зробити?

Не зовсім зрозуміло, чому Google вніс цю зміну, оскільки вони ще не надали офіційного пояснення. Я припускаю, що це спроба покращити безпеку Android, запобігши випадковому встановленню користувачами програм, які зловмисно блокують або замінюють рядок стану. На жаль, ця зміна ловить багато цілком законних програм, які використовують TYPE_SYSTEM_OVERLAY у перехресному вогні.

Розробники, які використовують цю функцію, відкрили звіти про помилки в системі відстеження проблем Android (#260787 і #36574245), щоб протестувати проти змін і попросити альтернативний API, але співробітник Google прокоментував трекер із наступне твердження:

Статус: не виправляється (запланована поведінка)

Ми зв’язалися з командою розробки продуктів і розробниками й отримали пропозицію, щоб розробники могли використовувати дії SHOW_WHEN_LOCKED для показувати, коли пристрій заблоковано, але навмисно більше не можна показувати на екрані блокування / на панелі сповіщень

Наразі схоже, що цим розробникам не пощастило, оскільки розробники зазначили, що FLAG_SHOW_WHEN_LOCKED все ще не дозволяє накладати вікна поверх рядка стану. Незрозуміло, що розробники цих додатків можуть зробити, окрім як молитися, щоб Google щось змінив, або здійняти з цього приводу пекло.

Оскільки це лише перший попередній перегляд для розробників для Android O, Google все ще може змінити їх і надати цю функцію для програм, які не націлені на Android O, або для відновлення Google TYPE_SYSTEM_OVERLAY. Але якщо все залишиться так, як зараз, ви можете поцілуй ці додатки до побачення. І це було б проклятою ганьбою.


Дякую Елі Ірвіну за тестування багатьох із цих програм для мене!