Android O отхвърля TYPE_SYSTEM_OVERLAY в полза на TYPE_APPLICATION_OVERLAY, което води до счупване на приложения, които се наслагват върху лентата на състоянието.
Струйката от публикации, очертаващи нови функции, насочени към потребителите, открити в Android O започва да се забавя сега, когато потребителите разполагат със седмици, за да тестват софтуера на своите устройства. Има обаче много, много промени, направени под капака, които бавно се разкриват. Ние публикувахме за една такава промяна само онзи ден относно устройства Nexus и Pixel, работещи с Android O приемане на SDCardFS. Но днес бихме искали да обсъдим промяна, която ще засегне разработчиците на определени приложения, особено тези, които наслагване в горната част на лентата на състоянието. Тези приложения изглежда са повреден в Android O Developer Preview, което на пръв поглед може да отхвърлите като обикновен бъг, но ако се потопите по-дълбоко в референтната документация, това може да е планирана промяна от Google.
Android O прекъсва наслагванията на лентата на състоянието
Едно от любимите ми неща за Android е колко е персонализиран. Потребителите, които са руутнати или изпълняват персонализирани ROM файлове, могат да тематизират системните си ленти за състоянието нативно без никакви ограничения, но ако устройството ви не е руутнато, имате по-малко опции, достъпни за вас. За щастие има много приложения в Google Play Store, които ви позволяват да промените начина, по който изглежда лентата на състоянието на основно ниво. Това е възможно благодарение на умната комбинация от System Overlay Windows за показване на персонализирана лента на състоянието върху съществуващата, Слушатели на известия за показване на известия и по избор услуга за достъпност, която да позволи контекстно оцветяване на персонализирания Лента за състоянието.
Двете екранни снимки по-горе показват как би изглеждала моята лента за известия, когато използвам едно от многото приложения за наслагване на лентата на състоянието, налични в Play Store. Тези екранни снимки са направени на нерутиран Huawei Mate 9, работещ с EMUI 5.0. За тези от вас, които не са запознати с EMUI, лентата на състоянието не прилича на екранните снимки по-горе. Вместо това изглежда така:
Ако нямате нищо против начина, по който изглежда лентата на състоянието на акциите ви, тогава приложения като Статус или Лента за състоянието на материала са божи дарове. Но ако или когато вашето устройство се актуализира до Android O, тези приложения може вече да не работят. Ето как изглеждат същите тези две приложения на Google Pixel, работещ с Android O Developer Preview:
Вместо наслагването да блокира оригиналната лента на състоянието, то изглежда като наслагването припокрива се с оригиналната лента на състоянието, което води до огромна бъркотия.
За съжаление, това на практика прави приложения като тези безполезни. И не само вашите типични приложения за тематизиране на лентата на състоянието са засегнати от това - всички приложения, които изискват наслагване да се показва в горната част на лентата на състоянието, са засегнати.
Ето списък с някои популярни приложения, които могат да бъдат направени безполезни:
- Статус (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 инсталирания)
- Мрежов монитор Mini (1 000 000 - 5 000 000 инсталирания)
Има много повече приложения в Play Store, които използват някакъв вид наслагване в горната част на лентата на състоянието, но вече можете да кажете, че подобна промяна ще засегне много приложения, които се използват от потенциално милиони потребители. И така, какво става тук?
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). Въпреки това, както беше посочено от разработчик на Статус в 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. Но ако нещата останат такива, каквито са в момента, можете целунете тези приложения за сбогом. И това би било адски жалко.
Благодаря на Eli Irvin, че тества много от тези приложения за мен!