Android O přerušuje aplikace, které se překrývají na stavovém řádku

Android O ukončuje podporu TYPE_SYSTEM_OVERLAY ve prospěch TYPE_APPLICATION_OVERLAY, což má za následek přerušení aplikací, které překrývají stavový řádek.

Pramínek příspěvků popisujících nové funkce pro uživatele, které se nacházejí v Android O se začíná zpomalovat, protože uživatelé měli týdny na testování softwaru na svém zařízení. Pod kapotou se však děje mnoho, mnoho změn, které se pomalu odkrývají. O jedné takové změně jsme nedávno zveřejnili informace o zařízeních Nexus a Pixel se systémem Android O přijetí SDCardFS. Ale dnes bychom rádi diskutovali o změně, která ovlivní vývojáře určitých aplikací, zejména těch, které překrytí v horní části stavového řádku. Zdá se, že tyto aplikace jsou přerušeno v náhledu vývojáře Android O, což byste na první pohled mohli odmítnout jako jednoduchou chybu, ale když se ponoříte hlouběji do referenční dokumentace, může to být zamýšlená změna od společnosti Google.


Android O přeruší překrytí stavového řádku

Jednou z mých oblíbených věcí na Androidu je, jak je přizpůsobitelný. Uživatelé, kteří jsou rootovaní nebo používají vlastní ROM, mohou nativně tematizovat stavové lišty svého systému v podstatě bez omezení, ale pokud je vaše zařízení odrootované, máte k dispozici méně možností. Naštěstí je v Obchodě Google Play mnoho aplikací, které vám na základní úrovni umožňují změnit vzhled stavového řádku. To je možné díky chytré kombinaci System Overlay Windows pro zobrazení vlastního stavového řádku nad stávajícím, Posluchače oznámení pro zobrazení oznámení a volitelně služba usnadnění, která umožňuje kontextové tónování vlastních stavový řádek.

Dva snímky obrazovky výše ukazují, jak by můj oznamovací řádek vypadal při použití jedné z mnoha aplikací pro překrytí stavového řádku dostupných v Obchodě Play. Tyto snímky obrazovky byly pořízeny na nerootovaném Huawei Mate 9 s EMUI 5.0. Pro ty z vás, kteří nejsou obeznámeni s EMUI, stavový řádek nevypadá jako výše uvedené snímky obrazovky. Místo toho to vypadá takto:

Pokud vám nevadí, jak vypadá váš stavový řádek akcií, pak aplikace jako např Postavení nebo Stavový řádek materiálu jsou dary z nebes. Ale pokud nebo když se vaše zařízení aktualizuje na Android O, tyto aplikace již nemusí fungovat. Zde je návod, jak tyto dvě stejné aplikace vypadají na zařízení Google Pixel s náhledem vývojáře Android O:

Spíše než překrytí blokující původní stavový řádek to vypadá jako překrytí překrývá s původním stavovým řádkem, což má za následek obrovský nepořádek.

Bohužel to efektivně činí aplikace, jako jsou tyto, k ničemu. A nejsou to jen vaše typické tematické aplikace stavového řádku, které jsou tímto ovlivněny - jsou ovlivněny všechny aplikace, které vyžadují zobrazení překryvné vrstvy v horní části stavového řádku.

Zde je seznam některých oblíbených aplikací, které mohou být zbytečné:

  • Postavení (500 000 – 1 000 000 instalací)
  • Stavový řádek materiálu (1 000 000–5 000 000 instalací)
  • Cool Tool - Statistiky systému (500 000 – 1 000 000 instalací)
  • Telecine (50 000–100 000 instalací)
  • Vyčistěte stavový řádek (100 000–500 000 instalací)
  • Tinycore (100 000–500 000 instalací)

A seznam některých aplikací, které budou fungovat, ale již se nemohou překrývat nad stavovým pruhem (omezují předchozí funkce):

  • Soumrak (5 000 000–10 000 000 instalací)
  • Hlavy vzhůru (100 000–500 000 instalací)
  • Mini monitor zdrojů (50 000–100 000 instalací)
  • Mini monitor sítě (1 000 000–5 000 000 instalací)

V Obchodě Play je mnohem více aplikací, které používají nějaký druh překrytí v horní části stavového řádku, ale již nyní můžete říci, že taková změna ovlivní mnoho aplikací, které používají potenciálně miliony uživatelů. Tak co se tu děje?


TYPE_SYSTEM_OVERLAY je zastaralé

S každou novou iterací Androidu Google zavádí i zavrhuje (označuje jako zastaralé a bude odstraněno) různé funkce. Tentokrát je funkcí, která je na bloku sekání, TYPE_SYSTEM_OVERLAY. Abych citoval referenční stránka za to, co tato funkce vývojářům nabídla:

TYPE_SYSTEM_OVERLAY

Typ okna: systémová překryvná okna, která musí být zobrazena nad vším ostatním. Tato okna se nesmí zaměřit na vstup, jinak budou rušit ochranu klávesnice. Ve víceuživatelských systémech se zobrazuje pouze v okně vlastníka.

Tento typ okna v podstatě umožňuje aplikaci kreslit na jakýkoli prvek na obrazovce – včetně stavového řádku. Počínaje systémem Android O byl však tento typ okna zastaralý. U nesystémových aplikací Google doporučuje, aby vývojáři místo toho používali TYPE_APPLICATION_OVERLAY. Abych citoval referenční stránka pro to, co tento nový typ okna dělá:

TYPE_APPLICATION_OVERLAY

Typ okna: Překryvná okna aplikace se zobrazují nad všemi okny aktivit (typy mezi FIRST_APPLICATION_WINDOW a LAST_APPLICATION_WINDOW), ale pod kritickými systémovými okny, jako je stavový řádek nebo editor IME.

Systém může kdykoli změnit polohu, velikost nebo viditelnost těchto oken, aby snížil vizuální nepořádek pro uživatele a také řídil zdroje.

Systém upraví důležitost procesů s tímto typem okna, aby se snížila šance, že je zabiják s nízkou pamětí zabije.

Ve víceuživatelských systémech se zobrazuje pouze na obrazovce vlastníka.

Jak vidíte, tento nový typ okna umožňuje aplikacím překrývat obsah přes všechna ostatní okna aktivit až na "kritická systémová okna, jako je stavový řádek nebo IME" (IME označuje klávesnici). To je v pořádku pro aplikace jako Facebook Messenger, protože chatovací hlavy poskytované touto aplikací nemají žádný účel sedět na stavovém řádku, ale to negativně ovlivňuje většinu aplikací, které jsem zmínil dříve.

Navíc se zdá, že v tuto chvíli neexistuje řešení, které by vývojáři mohli použít. Dalo by se očekávat, že aby se tomuto problému na Androidu O vyhnuli, vývojáři jednoduše sestavují své aplikace tak, aby cílily na SDK 25 (Android 7.1.1). Jak však podotkl vývojář Status na Redditu, má Google nahrazeno TYPE_SYSTEM_OVERLAY s TYPE_APPLICATION_OVERLAY a změna je nezávisle na cílovém SDK verze. Vývojáři používající TYPE_SYSTEM_OVERLAY v současnosti musí používat TYPE_APPLICATION_OVERLAY, aby byla zachována kompatibilita, a proto bez ohledu na to, na jaké cílové verzi SDK je konkrétní aplikace založena, může již nepoužíváte TYPE_SYSTEM_OVERLAY v systému Android O.


Co se s tím dá dělat?

Není přesně jasné, proč Google tuto změnu provedl, protože zatím neposkytl oficiální vysvětlení. Domnívám se, že jde o pokus o zlepšení zabezpečení v systému Android tím, že zabráníme nic netušícím uživatelům v náhodné instalaci aplikací, které škodlivě blokují nebo nahrazují jejich stavový řádek. Bohužel tato změna zachytí mnoho naprosto legitimních aplikací, které používají TYPE_SYSTEM_OVERLAY v křížové palbě.

Vývojáři, kteří tuto funkci využívají, otevřeli hlášení o chybách na Android Issue Tracker (#260787 a #36574245) protestovat proti změně a požádat o alternativní API, ale zaměstnanec společnosti Google okomentoval sledovač pomocí následující prohlášení:

Stav: Neopraví se (zamýšlené chování)

Navázali jsme na produktový a technický tým a dostali jsme návrh, že vývojáři mohou využít aktivity SHOW_WHEN_LOCKED k zobrazit, kdy je zařízení uzamčeno, ale záměrně již není možné zobrazovat přes zamykací obrazovku / přes oznamovací stínítko

Prozatím to vypadá, že tito vývojáři mají smůlu, protože vývojáři poukázali na to, že FLAG_SHOW_WHEN_LOCKED stále neumožňuje překrytí oken na stavovém řádku. Není jasné, co mohou vývojáři těchto aplikací dělat kromě toho, že se budou modlit, aby Google věci změnil, nebo kvůli tomu vyvolal peklo.

Vzhledem k tomu, že se jedná pouze o první náhled pro vývojáře pro Android O, je stále možné, aby je Google změnil mysli a poskytnout tuto funkci pro aplikace, které necílí na Android O, nebo pro Google k obnovení TYPE_SYSTEM_OVERLAY. Ale pokud věci zůstanou tak, jak jsou nyní, můžete sbohem těmto aplikacím. A to by byla zatracená škoda.


Děkuji Eli Irvinovi za testování mnoha z těchto aplikací pro mě!