Android O er Breaking Apps, der overlejrer sig oven på statuslinjen

Android O fraskriver TYPE_SYSTEM_OVERLAY til fordel for TYPE_APPLICATION_OVERLAY, hvilket resulterer i, at apps, der overlejrer oven på statuslinjen, går i stykker.

Den rislen af ​​indlæg, der beskriver nye brugervendte funktioner fundet i Android O begynder at gå langsommere nu, hvor brugerne har haft uger til at teste softwaren på deres enhed. Der er dog mange, mange ændringer, der er lavet under hætten, som langsomt bliver afsløret. Vi skrev om en sådan ændring forleden dag om Nexus- og Pixel-enheder, der kører Android O ved at vedtage SDcardFS. Men i dag vil vi gerne diskutere en ændring, der vil påvirke udviklere af visse apps, især dem, der overlejring oven på statuslinjen. Disse applikationer synes at være ødelagt i Android O Developer Preview, som du ved første øjekast kan afvise som en simpel fejl, men dykker du dybere ned i referencedokumentationen, kan dette være en påtænkt ændring af Google.


Android O bryder statuslinjeoverlejringer

En af mine yndlingsting ved Android er, hvordan den kan tilpasses. Brugere, der er rootet eller kører brugerdefinerede ROM'er, kan tematisere deres systemstatuslinjer indbygget uden nogen begrænsninger, men hvis din enhed ikke er rootet, har du færre muligheder for dig. Heldigvis er der mange applikationer i Google Play Butik, der giver dig mulighed for at ændre, hvordan statuslinjen ser ud på et grundlæggende niveau. Dette er muligt takket være en smart kombination af System Overlay Windows til at vise en brugerdefineret statuslinje over den eksisterende, Notifikationslyttere til at vise notifikationer og eventuelt en tilgængelighedstjeneste for at give mulighed for kontekstuel toning af brugerdefineret statuslinje.

De to skærmbilleder ovenfor viser, hvordan min meddelelseslinje ville se ud, når jeg bruger en af ​​de mange statuslinje-overlejringsapps, der er tilgængelige i Play Butik. Disse skærmbilleder blev taget på en ikke-rodfæstet Huawei Mate 9, der kører EMUI 5.0. For dem af jer, der ikke er bekendt med EMUI, ligner statuslinjen ikke ovenstående skærmbilleder. I stedet ser det sådan ud:

Hvis du ikke har noget imod, hvordan din aktiestatuslinje ser ud, så er apps som f.eks Status eller Materialestatuslinje er gudegaver. Men hvis, eller når din enhed opdaterer til Android O, virker disse applikationer muligvis ikke længere. Sådan ser de samme to apps ud på en Google Pixel, der kører Android O Developer Preview:

I stedet for at overlejringen blokerer den oprindelige statuslinje, ligner den overlejringen overlapper med den originale statuslinje, hvilket resulterer i et kæmpe rod.

Desværre gør dette effektivt apps som disse ubrugelige. Og det er ikke kun dine typiske statuslinje-temaapplikationer, der påvirkes af dette - alle apps, der kræver en overlejring for at blive vist på toppen af ​​statuslinjen, påvirkes.

Her er en liste over nogle populære apps, der kan gøres ubrugelige:

  • Status (500.000 - 1.000.000 installationer)
  • Materialestatuslinje (1.000.000 - 5.000.000 installationer)
  • Cool Tool - Systemstatistik (500.000 - 1.000.000 installationer)
  • Telecine (50.000 - 100.000 installationer)
  • Rens statuslinje (100.000 - 500.000 installationer)
  • Tinycore (100.000 - 500.000 installationer)

Og en liste over nogle apps, der vil fungere, men som ikke længere kan overlejre oven på statuslinjen (begrænser tidligere funktionalitet):

  • Tusmørke (5.000.000 - 10.000.000 installationer)
  • HeadsUp (100.000 - 500.000 installationer)
  • Ressource Monitor Mini (50.000 - 100.000 installationer)
  • Netværksmonitor Mini (1.000.000 - 5.000.000 installationer)

Der er mange flere apps i Play Butik, der bruger en form for overlejring oven på statuslinjen, men du kan allerede se, at en sådan ændring vil påvirke mange apps, der bruges af potentielt millioner af brugere. Så hvad sker der her?


TYPE_SYSTEM_OVERLAY udfases

Med hver ny iteration af Android både introducerer og forælder Google (betegner som forældede og skal fjernes) forskellige funktioner. Denne gang er den funktion, der er på hakkeblokken, TYPE_SYSTEM_OVERLAY. For at citere referenceside for hvad denne funktion tilbød udviklere:

TYPE_SYSTEM_OVERLAY

Vinduestype: systemoverlejringsvinduer, som skal vises oven på alt andet. Disse vinduer må ikke tage inputfokus, ellers vil de forstyrre tastaturlåsen. I flerbrugersystemer vises kun på den ejers brugers vindue.

I bund og grund tillader denne vinduestype en app at tegne oven på ethvert element på skærmen - inklusive statuslinjen. Fra og med Android O er denne vinduestype dog blevet forældet. For ikke-systemapps anbefaler Google, at udviklere bruger TYPE_APPLICATION_OVERLAY i stedet. For at citere referenceside for hvad denne nye vinduestype gør:

TYPE_APPLICATION_OVERLAY

Vinduestype: Programoverlejringsvinduer vises over alle aktivitetsvinduer (typer mellem FIRST_APPLICATION_WINDOW og LAST_APPLICATION_WINDOW), men under kritiske systemvinduer som statuslinjen eller IME.

Systemet kan til enhver tid ændre placeringen, størrelsen eller synligheden af ​​disse vinduer for at reducere visuel rod for brugeren og også administrere ressourcer.

Systemet vil justere vigtigheden af ​​processer med denne vinduestype for at reducere chancen for, at dræberen med lav hukommelse dræber dem.

I flerbrugersystemer vises kun på den ejers brugers skærm.

Som du kan se, giver denne nye vinduestype apps mulighed for at overlejre indhold oven på alle andre aktivitetsvinduer undtagen "kritiske systemvinduer som statuslinjen eller IME" (IME refererer til tastaturet). Dette er fint for apps som Facebook Messenger, da chatheads fra den app ikke har noget formål at sidde oven på statuslinjen, men dette påvirker negativt de fleste af de apps, jeg nævnte tidligere.

Desuden ser der ikke ud til at være en løsning for udviklere at bruge på nuværende tidspunkt. Man kunne forvente, at udviklere, for at undgå dette problem på Android O, simpelthen bygger deres apps til at målrette SDK 25 (Android 7.1.1). Men som påpeget af udvikler af Status på Reddit, har Google erstattet TYPE_SYSTEM_OVERLAY med TYPE_APPLICATION_OVERLAY, og ændringen er uafhængig af mål-SDK version. Udviklere, der bruger TYPE_SYSTEM_OVERLAY, skal i øjeblikket bruge TYPE_APPLICATION_OVERLAY for at opretholde kompatibilitet, og derfor kan den, uanset hvilken mål-SDK-version en bestemt app er baseret på, ikke længere bruge TYPE_SYSTEM_OVERLAY på Android O.


Hvad kan man gøre ved dette?

Det er ikke helt klart, hvorfor Google har foretaget denne ændring, da de endnu ikke har givet en officiel forklaring. Mit gæt er, at det er et forsøg på at forbedre sikkerheden på Android ved at forhindre intetanende brugere i ved et uheld at installere apps, der ondsindet blokerer eller erstatter deres statuslinje. Desværre fanger denne ændring mange helt legitime applikationer, der bruger TYPE_SYSTEM_OVERLAY i krydsilden.

Udviklere, der bruger denne funktion, har åbnet fejlrapporter på Androids Issue Tracker (#260787 og #36574245) for at protestere mod ændringen og bede om en alternativ API, men en Googler kommenterede trackeren med følgende udtalelse:

Status: Løser ikke (tilsigtet adfærd)

Vi har fulgt op med produkt- og ingeniørteamet og fået forslag om, at udviklere kan bruge SHOW_WHEN_LOCKED aktiviteter til at vis, når enheden er låst, men det er med vilje ikke længere muligt at vise over låseskærmen / over meddelelsesskærmen

Indtil videre ser det ud til, at disse udviklere er uheldige, da udviklere har påpeget, at FLAG_SHOW_WHEN_LOCKED stadig ikke tillader, at vinduer overlejres oven på statuslinjen. Det er ikke klart, hvad udviklere af disse apps kan gøre, bortset fra at bede om, at Google ændrer tingene eller rejser helvede til det.

Da dette kun er den første Developer Preview til Android O, er det stadig muligt for Google at ændre deres sind og leverer denne funktionalitet til apps, der ikke er målrettet mod Android O, eller som Google kan gendanne TYPE_SYSTEM_OVERLAY. Men hvis tingene forbliver, som de er i øjeblikket, kan du det kys disse apps farvel. Og det ville være en skam.


Tak til Eli Irvin for at teste mange af disse apps for mig!