Android O maakt apps kapot die over de statusbalk heen liggen

Android O beëindigt TYPE_SYSTEM_OVERLAY ten gunste van TYPE_APPLICATION_OVERLAY, wat ertoe leidt dat apps die over de statusbalk heen liggen, kapot gaan.

Het stroompje berichten waarin nieuwe gebruikersgerichte functies worden beschreven die te vinden zijn in Android O begint te vertragen nu gebruikers weken de tijd hebben gehad om de software op hun apparaat te testen. Er zijn echter heel veel veranderingen onder de motorkap doorgevoerd die langzaam aan het licht komen. We hebben onlangs over zo'n wijziging gepost over Nexus- en Pixel-apparaten met Android O SDCardFS adopteren. Maar vandaag willen we een verandering bespreken die gevolgen zal hebben voor ontwikkelaars van bepaalde apps, vooral voor apps die dat wel doen overlay bovenaan de statusbalk. Deze toepassingen lijken dat wel te zijn gebroken in de Android O Developer Preview, wat je op het eerste gezicht zou kunnen afdoen als een simpele bug, maar als je dieper in de referentiedocumentatie duikt, kan dit het geval zijn een beoogde verandering door Google.


Android O verbreekt statusbalkoverlays

Een van mijn favoriete dingen aan Android is hoe aanpasbaar het is. Gebruikers die geroot zijn of aangepaste ROM's gebruiken, kunnen hun systeemstatusbalken van een native thema voorzien, zonder in principe beperkingen, maar als uw apparaat niet geroot is, heeft u minder opties tot uw beschikking. Gelukkig zijn er veel applicaties in de Google Play Store waarmee je kunt wijzigen hoe de statusbalk er op basisniveau uitziet. Dit is mogelijk dankzij een slimme combinatie van System Overlay Windows om een ​​aangepaste statusbalk over de bestaande weer te geven, Meldingsluisteraars om meldingen weer te geven, en optioneel een toegankelijkheidsservice om de gewoonte contextueel te kunnen aanpassen Statusbalk.

De twee bovenstaande schermafbeeldingen laten zien hoe mijn meldingsbalk eruit zou zien als ik een van de vele overlay-apps voor de statusbalk gebruik die beschikbaar zijn in de Play Store. Deze schermafbeeldingen zijn gemaakt op een niet-geroote Huawei Mate 9 met EMUI 5.0. Voor degenen onder u die niet bekend zijn met EMUI: de statusbalk lijkt in niets op de bovenstaande schermafbeeldingen. In plaats daarvan ziet het er als volgt uit:

Als u het niet erg vindt hoe uw aandelenstatusbalk eruitziet, dan zijn apps zoals Toestand of Materiaalstatusbalk zijn godsgeschenken. Maar als of wanneer uw apparaat wordt bijgewerkt naar Android O, werken deze applicaties mogelijk niet meer. Zo zien deze twee apps eruit op een Google Pixel met de Android O Developer Preview:

In plaats van dat de overlay de oorspronkelijke statusbalk blokkeert, lijkt het op de overlay overlapt met de originele statusbalk, wat resulteert in een enorme puinhoop.

Helaas maakt dit dergelijke apps feitelijk nutteloos. En het zijn niet alleen uw typische statusbalk-thematoepassingen die hierdoor worden beïnvloed - dit geldt voor alle apps waarvoor een overlay bovenaan de statusbalk moet worden weergegeven.

Hier is een lijst met enkele populaire apps die mogelijk nutteloos worden:

  • Toestand (500.000 - 1.000.000 installaties)
  • Materiaalstatusbalk (1.000.000 - 5.000.000 installaties)
  • Coole tool - Systeemstatistieken (500.000 - 1.000.000 installaties)
  • Telecine (50.000 - 100.000 installaties)
  • Statusbalk opschonen (100.000 - 500.000 installaties)
  • Tinycore (100.000 - 500.000 installaties)

En een lijst met enkele apps die zullen werken, maar niet langer over de statusbalk heen kunnen verschijnen (waardoor eerdere functionaliteit wordt beperkt):

  • Schemering (5.000.000 - 10.000.000 installaties)
  • Let op (100.000 - 500.000 installaties)
  • Bronnenmonitor Mini (50.000 - 100.000 installaties)
  • Netwerkmonitor Mini (1.000.000 - 5.000.000 installaties)

Er zijn veel meer apps in de Play Store die een soort overlay bovenop de statusbalk gebruiken, maar je kunt nu al zien dat een dergelijke verandering gevolgen zal hebben voor veel apps die door mogelijk miljoenen mensen worden gebruikt gebruikers. Dus wat is hier aan de hand?


TYPE_SYSTEM_OVERLAY wordt verouderd

Bij elke nieuwe versie van Android introduceert en beëindigt Google verschillende functies (benoemt als verouderd en moeten worden verwijderd). Deze keer is de feature die op het hakblok staat TYPE_SYSTEM_OVERLAY. Om te citeren referentiepagina voor wat deze functie ontwikkelaars te bieden heeft:

TYPE_SYSTEM_OVERLAY

Venstertype: systeemoverlayvensters, die bovenop al het andere moeten worden weergegeven. Deze vensters mogen geen invoerfocus hebben, anders interfereren ze met de toetsenblokkering. In systemen met meerdere gebruikers wordt dit alleen weergegeven in het venster van de eigenaar.

In wezen zorgt dit venstertype ervoor dat een app bovenop elk element op het scherm kan tekenen, inclusief de statusbalk. Vanaf Android O is dit venstertype echter verouderd. Voor niet-systeemapps raadt Google ontwikkelaars aan in plaats daarvan TYPE_APPLICATION_OVERLAY te gebruiken. Om te citeren referentiepagina voor wat dit nieuwe venstertype doet:

TYPE_APPLICATION_OVERLAY

Venstertype: toepassingsoverlayvensters worden boven alle activiteitsvensters weergegeven (types tussen FIRST_APPLICATION_WINDOW En LAST_APPLICATION_WINDOW) maar onder kritieke systeemvensters zoals de statusbalk of IME.

Het systeem kan de positie, grootte of zichtbaarheid van deze vensters op elk moment wijzigen om de visuele rommel voor de gebruiker te verminderen en ook bronnen te beheren.

Het systeem zal het belang van processen met dit venstertype aanpassen om de kans te verkleinen dat de moordenaar met weinig geheugen deze doodt.

In systemen met meerdere gebruikers wordt dit alleen weergegeven op het scherm van de eigenaar.

Zoals u kunt zien, kunnen apps met dit nieuwe venstertype inhoud over alle andere activiteitsvensters heen leggen behalve "kritieke systeemvensters zoals de statusbalk of IME" (IME verwijst naar het toetsenbord). Dit is prima voor apps als Facebook Messenger, omdat de chatheads van die app geen doel hebben om bovenaan de statusbalk te staan, maar dit heeft een negatief effect op de meeste apps die ik eerder noemde.

Bovendien lijkt er op dit moment geen oplossing te zijn die ontwikkelaars kunnen gebruiken. Je zou verwachten dat ontwikkelaars, om dit probleem op Android O te voorkomen, hun apps eenvoudigweg bouwen om SDK 25 (Android 7.1.1) te targeten. Echter, zoals opgemerkt door de ontwikkelaar van Status op Reddit, Google heeft vervangen TYPE_SYSTEM_OVERLAY met TYPE_APPLICATION_OVERLAY, en de verandering is onafhankelijk van de doel-SDK versie. Ontwikkelaars die TYPE_SYSTEM_OVERLAY gebruiken, moeten momenteel TYPE_APPLICATION_OVERLAY gebruiken om de compatibiliteit te behouden. Ongeacht op welke doel-SDK-versie een bepaalde app is gebaseerd, kan deze gebruik TYPE_SYSTEM_OVERLAY niet langer op Android O.


Wat kan hieraan gedaan worden?

Het is niet precies duidelijk waarom Google deze wijziging heeft doorgevoerd, aangezien ze nog geen officiële verklaring hebben gegeven. Ik vermoed dat het een poging is om de beveiliging op Android te verbeteren door te voorkomen dat nietsvermoedende gebruikers per ongeluk apps installeren die op kwaadaardige wijze hun statusbalk blokkeren of vervangen. Helaas zorgt deze wijziging ervoor dat veel volkomen legitieme applicaties die TYPE_SYSTEM_OVERLAY gebruiken in het kruisvuur terechtkomen.

Ontwikkelaars die deze functie gebruiken, hebben bugrapporten geopend op de Issue Tracker van Android (#260787 En #36574245) om tegen de wijziging te protesteren en om een ​​alternatieve API te vragen, maar een Googler gaf commentaar op de tracker met de volgende verklaring:

Status: Kan niet worden opgelost (beoogd gedrag)

We hebben contact opgenomen met het product- en engineeringteam en hebben de suggestie gekregen dat ontwikkelaars SHOW_WHEN_LOCKED-activiteiten kunnen gebruiken om laten zien wanneer het apparaat is vergrendeld, maar het is opzettelijk niet langer mogelijk om via het vergrendelscherm / via het meldingenpaneel te tonen

Voorlopig lijkt het erop dat deze ontwikkelaars geen geluk hebben, aangezien ontwikkelaars erop hebben gewezen dat FLAG_SHOW_WHEN_LOCKED nog steeds niet toestaat dat vensters bovenop de statusbalk worden geplaatst. Het is niet duidelijk wat ontwikkelaars van deze apps kunnen doen, behalve bidden dat Google dingen verandert, of er de boel over ophitsen.

Aangezien dit nog maar de eerste Developer Preview voor Android O is, is het nog steeds mogelijk voor Google om de instellingen te wijzigen geesten en deze functionaliteit bieden voor apps die niet op Android O zijn gericht, of die Google kan herstellen TYPE_SYSTEM_OVERLAY. Maar als de zaken blijven zoals ze nu zijn, dan kan dat wel kus deze apps vaarwel. En dat zou verdomd jammer zijn.


Dank aan Eli Irvin voor het testen van veel van deze apps voor mij!