Android O är Breaking Apps som överlagrar ovanpå statusfältet

click fraud protection

Android O fasar ut TYPE_SYSTEM_OVERLAY till förmån för TYPE_APPLICATION_OVERLAY, vilket resulterar i att appar som ligger ovanpå statusfältet bryts.

Bråget av inlägg som beskriver nya användarvänliga funktioner som finns i Android O börjar sakta ner nu när användare har haft veckor på sig att testa programvaran på sin enhet. Men det finns många, många förändringar som görs under huven som långsamt avslöjas. Vi skrev om en sådan förändring häromdagen om Nexus- och Pixel-enheter som kör Android O anta SDcardFS. Men idag skulle vi vilja diskutera en förändring som kommer att påverka utvecklare av vissa appar, särskilt de som överlägg överst på statusfältet. Dessa applikationer verkar vara trasig i Android O Developer Preview, som du vid första anblicken kan avfärda som en enkel bugg, men om du dyker djupare in i referensdokumentationen kan detta vara en avsedd förändring av Google.


Android O bryter statusfältsöverlägg

En av mina favoritsaker med Android är hur anpassningsbar den är. Användare som är rotade eller kör anpassade ROM-skivor kan skapa ett naturligt tema för sina systemstatusfält utan i princip inga begränsningar, men om din enhet inte är rotad har du färre alternativ tillgängliga för dig. Lyckligtvis finns det många applikationer i Google Play Butik som låter dig ändra hur statusfältet ser ut på en grundläggande nivå. Detta är möjligt tack vare en smart kombination av System Overlay Windows för att visa en anpassad statusrad över den befintliga, Aviseringslyssnare för att visa aviseringar, och eventuellt en tillgänglighetstjänst för att möjliggöra kontextuell toning av den anpassade statusfältet.

De två skärmbilderna ovan visar hur mitt meddelandefält skulle se ut när jag använder en av de många överlagringsapparna för statusfältet som finns i Play Butik. Dessa skärmdumpar togs på en orootad Huawei Mate 9 som kör EMUI 5.0. För er som inte är bekanta med EMUI ser statusfältet inte ut som ovanstående skärmdumpar. Istället ser det ut så här:

Om du inte har något emot hur din aktiestatusfält ser ut, kan appar som t.ex Status eller Materialstatusfält är gudagåvor. Men om, eller när din enhet uppdateras till Android O, kanske dessa applikationer inte längre fungerar. Så här ser dessa två appar ut på en Google Pixel som kör Android O Developer Preview:

I stället för att överlägget blockerar den ursprungliga statusfältet ser det ut som överlägget överlappar med den ursprungliga statusraden vilket resulterar i en enorm röra.

Tyvärr gör detta effektivt appar som dessa värdelösa. Och det är inte bara dina typiska statusfältstemaapplikationer som påverkas av detta - alla appar som kräver en överlagring för att visas ovanpå statusfältet påverkas.

Här är en lista över några populära appar som kan göras oanvändbara:

  • Status (500 000 - 1 000 000 installationer)
  • Materialstatusfält (1 000 000 - 5 000 000 installationer)
  • Coolt verktyg - Systemstatistik (500 000 - 1 000 000 installationer)
  • Telecine (50 000 - 100 000 installationer)
  • Rengör statusfältet (100 000 - 500 000 installationer)
  • Tinycore (100 000 - 500 000 installationer)

Och en lista över några appar som kommer att fungera, men som inte längre kan läggas ovanpå statusfältet (begränsar tidigare funktionalitet):

  • Skymning (5 000 000 - 10 000 000 installationer)
  • Se upp (100 000 - 500 000 installationer)
  • Resource Monitor Mini (50 000 - 100 000 installationer)
  • Network Monitor Mini (1 000 000 - 5 000 000 installationer)

Det finns många fler appar i Play Butik som använder någon form av överlagring ovanpå statusfältet, men du kan redan se att en sådan förändring kommer att påverka många appar som används av potentiellt miljontals användare. Så vad händer här?


TYPE_SYSTEM_OVERLAY fasas ut

Med varje ny iteration av Android både introducerar och utfaser Google (utpekar som föråldrade och ska tas bort) olika funktioner. Den här gången är funktionen som finns på skärblocket TYPE_SYSTEM_OVERLAY. För att citera referenssida för vad den här funktionen erbjöd utvecklare:

TYPE_SYSTEM_OVERLAY

Fönstertyp: systemöverläggsfönster, som måste visas ovanpå allt annat. Dessa fönster får inte ta ingångsfokus, annars kommer de att störa tangentlåset. I fleranvändarsystem visas endast på den ägande användarens fönster.

I huvudsak tillåter den här fönstertypen en app att rita ovanpå vilket element som helst på skärmen - inklusive statusfältet. Från och med Android O har dock denna fönstertyp fasats ut. För icke-systemappar rekommenderar Google att utvecklare använder TYPE_APPLICATION_OVERLAY istället. För att citera referenssida för vad den här nya fönstertypen gör:

TYPE_APPLICATION_OVERLAY

Fönstertyp: Programöverläggsfönster visas ovanför alla aktivitetsfönster (typer mellan FIRST_APPLICATION_WINDOW och LAST_APPLICATION_WINDOW) men under kritiska systemfönster som statusfältet eller IME.

Systemet kan ändra positionen, storleken eller synligheten för dessa fönster när som helst för att minska visuell röran för användaren och även hantera resurser.

Systemet kommer att justera vikten av processer med denna fönstertyp för att minska risken för att lågminnesdödaren dödar dem.

I fleranvändarsystem visas endast på den ägande användarens skärm.

Som du kan se tillåter denna nya fönstertyp appar att lägga över innehåll ovanpå alla andra aktivitetsfönster bortsett från "kritiska systemfönster som statusfältet eller IME" (IME hänvisar till tangentbordet). Det här är bra för appar som Facebook Messenger, eftersom chatthuvudena som tillhandahålls av den appen inte har något syfte att sitta överst i statusfältet, men detta påverkar negativt de flesta appar jag nämnde tidigare.

Dessutom verkar det inte finnas någon lösning för utvecklare att använda för närvarande. Man kan förvänta sig att utvecklare, för att undvika detta problem på Android O, helt enkelt bygger sina appar för att rikta in sig på SDK 25 (Android 7.1.1). Men som påpekats av utvecklare av Status på Reddit, har Google ersatt TYPE_SYSTEM_OVERLAY med TYPE_APPLICATION_OVERLAY, och ändringen är oberoende av mål-SDK: n version. Utvecklare som använder TYPE_SYSTEM_OVERLAY måste för närvarande använda TYPE_APPLICATION_OVERLAY för att upprätthålla kompatibilitet, så oavsett vilken mål-SDK-version en viss app är baserad på, kan den använder inte längre TYPE_SYSTEM_OVERLAY på Android O.


Vad kan man göra åt detta?

Det är inte riktigt klart varför Google har gjort denna förändring, eftersom de ännu inte har gett någon officiell förklaring. Min gissning är att det är ett försök att förbättra säkerheten på Android genom att förhindra att intet ont anande användare av misstag installerar appar som med uppsåt blockerar eller ersätter deras statusfält. Tyvärr fångar denna förändring många helt legitima applikationer som använder TYPE_SYSTEM_OVERLAY i korselden.

Utvecklare som använder den här funktionen har öppnat felrapporter på Androids Issue Tracker (#260787 och #36574245) för att protestera mot förändringen och be om ett alternativt API, men en Googler kommenterade spåraren med följande uttalande:

Status: kommer inte att åtgärdas (avsett beteende)

Vi har följt upp produkt- och ingenjörsteamet och fått förslag på att utvecklare kan använda SHOW_WHEN_LOCKED aktiviteter för att visa när enheten är låst, men det är avsiktligt inte längre möjligt att visa över låsskärmen / över meddelandeskärmen

För närvarande verkar det som om dessa utvecklare har tur, eftersom utvecklare har påpekat att FLAG_SHOW_WHEN_LOCKED fortfarande inte tillåter att fönster överlagras ovanpå statusfältet. Det är inte klart vad utvecklare av dessa appar kan göra förutom att be att Google ska ändra saker eller ta upp ett helvete om det.

Eftersom detta bara är den första förhandsvisningen av utvecklare för Android O, är det fortfarande möjligt för Google att ändra deras och tillhandahålla denna funktion för appar som inte är inriktade på Android O, eller för Google att återställa TYPE_SYSTEM_OVERLAY. Men om saker och ting förblir som de är för närvarande, kan du kyssa dessa appar hejdå. Och det vore jävligt synd.


Tack till Eli Irvin för att du testade många av dessa appar åt mig!