Omlouvám se za fragmentaci Androidu: Příklad k pochopení trápení vývojářů

Běžného uživatele Androidu už pravděpodobně dávno přestal zajímat „problém Androidu s fragmentací“. Tento problém ale vývojáře stále trápí.

Fragmentace je v Androidu sporným problémem doslova od doby, kdy byl oznámen mobilní operační systém.

Kromě toho, že je to kyj pro trolly k použití v online plamenných válkách, rozmanitost, která přichází s fragmentací, je nyní z velké části vnímána jako čistý pozitivní pro spotřebitele zařízení Android. Koneckonců, máme tolik svobody ve výběru typu zařízení s druhem softwaru, který chceme, že je pro běžného spotřebitele těžké starat se o fragmentaci. Vizualizace neuvěřitelné rozmanitosti zařízení Android vytváří krásnou mozaiku rozmanitého zastoupení Androidu.

Příklad fragmentace zařízení Android na základě instalací aplikací aplikace OpenSignal. Zdroj: OpenSignal

Hardwarová a softwarová fragmentace však nedělá šťastného vývojáře softwaru. Vlastně úplně naopak. Vývoj aplikace napříč tolika různými hardwarovými a softwarovými konfiguracemi se může ukázat jako velká nepříjemnost při ladění. Výrobci OEM mohou provádět velké nebo drobné změny, které je třeba vzít v úvahu při vývoji aplikace, ale pro jednotlivého vývojáře neexistuje snadný způsob, jak zajistit, aby jejich aplikace fungovala univerzálně. Zatímco běžný spotřebitel už dávno zapomněl na debatu o fragmentaci, tento problém stále pronásleduje Android vývojáři aplikací a zdánlivě se s tím nedá nic dělat, než to vysát a vypořádat se s chybami, objevit.


Bohužel stav fragmentace

Zejména jeden OEM dostává velkou porci nenávisti za bolesti hlavy, které způsobují při vývoji aplikace – Samsung. Vývojáři žvaní o Samsungu už léta, někteří dokonce píší tak kousavé kousky jako „V Android Hell je speciální místo pro Samsung“, který popisuje obzvláště frustrující chybu pocházející z Zařízení Samsung a knihovna podpory appcompat. Chtěl bych upozornit zejména na jeden odstavec z hantýrky pana Ambriho, který výtečně nastiňuje, proč si vývojáři stále dávají záležet na fragmentaci:

Pokud jste vývojář Android, vaše nenávist k zařízením Samsung je pravděpodobně bezmezná. Více než průměrný uživatel, pro kterého je Samsung synonymem hloupý Touchwiz a nadměrný bloatware, pohrdáte Samsungem, protože nemáte na výběr. Kvůli Samsungu masivní podíl na trhu, prostě se nemůžete rozhodnout nepodporovat zařízení Samsung. A to bolí nejvíc; skutečnost, že tato volba je vám odebrána!

Ani toto není žvást ze starých let existence Androidu – tento příspěvek byl zveřejněn v polovině prosince loňského roku. Budu předem a uvedu, že si nejsem jistý, zda byl tento problém již oficiálně opraven, nicméně, pane. Ambri poskytl ve svém příspěvku opravu pro každého, kdo narazí na jeho chvástání prostřednictvím vyhledávání Google Chyba. Jediné, co musíte udělat, je použít ProGuard s následujícím jediným řádkem kódu:

# Samsung ruining all nice things-keep class !android.support.v7.view.menu.**, !android.support.design.internal.NavigationMenu, !android.support.design.internal.NavigationMenuPresenter, !android.support.design.internal.NavigationSubMenu, android.support.** {*;}

To není tak špatné, že? Problém je však v tom, že tato oprava byla odstraněna z Stack Overflow. Nechápejte mě špatně, Stack Overflow je skvělý web. Ale ve skutečnosti to není ideální zdroj pro objevování oprav pro vaše aplikace. Nalezení něčeho na Stack Overflow často vyžaduje procházení odkazů po mnoha pokusech a omylech na Googlu. Někdy dokonce zjistíte, že jiný uživatel zmiňuje stejnou chybu, kterou jste měli, ale bez opravy v dohledu. Nebo ještě více frustrující jsou chvíle, kdy najdete vlákno, kde to tvrdil původní plakát našli opravu, ale už dávno opustili své vlákno, aniž by dali ostatním pokyn, jak to opravit problém.

Zdroj: XKCD

Příklad problému jemné fragmentace

Sám nejsem vývojář, ale po letech práce v Taskeru jsem dostatečně obeznámen s možnostmi Androidu, takže jsem začal pseudoprogramovat svá vlastní řešení problémů, kterým jsem čelil. A když na něco nemůžu přijít, dám si to do Googlu, stejně jako všichni ostatní. Zatímco jsem byl v procesu psaní mého předchozího článku o hledání skrytých aktivit v aplikaci Nastavení telefonu, narazil jsem na poněkud zvláštní chybu, kterou jsem nedokázal vysvětlit. Chyba jedinečná pro zařízení Huawei.

Kdykoli jsem se pokusil spustit určité činnosti (například nabídku „Testování“, která obsahuje statistiky používání aplikace) v aplikaci Nastavení, vždy jsem se setkal s chybou oprávnění. Zejména aplikace, kterou jsem používal ke spuštění aktivity, postrádala oprávnění povolení huawei.android. HW_SIGNATURE_OR_SYSTEM. Žádné jiné zařízení, které jsem testoval, nevyžadovalo ke spouštění těchto aktivit Nastavení žádná jedinečná oprávnění, pouze telefony s verzí Androidu od Huawei (EMUI). Analýza com.android.settings odhalilo, že určité aktivity v aplikaci Nastavení byly skutečně pod úrovní ochrany, která vyžadovala buď podpis nebo systémové oprávnění.

Bohužel pro mě to znamená, že pouze aplikace nainstalované pod /system nebo aplikace podepsané stejným podpis, protože aplikace Nastavení by mohla tyto aktivity otevřít způsobem, jakým jsem byl já pokoušející se. Když jsem Google hledal odpověď na tuto chybu, (uhodli jste) narazil na a Závit přetečení zásobníku. Vývojář, který zveřejnil svůj problém, narazil na stejný problém, jaký jsem udělal já (ačkoli jeho byl v procesu skutečného vývoje aplikace). Jeho problém nastal, když se pokusil spustit následující kód:

<span >Intentspan><span > mainIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_MAINspan><span >,span><span >nullspan><span >);span><span >mainIntentspan><span >.span><span >addCategoryspan><span >(span><span >Intentspan><span >.span><span >CATEGORY_LAUNCHERspan><span >);span><span >Intentspan><span > pickIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_PICK_ACTIVITYspan><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_TITLEspan><span >,span><span >"Pick App to Play in"span><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_INTENTspan><span >,span><span > mainIntentspan><span >);span><span >thisspan><span >.span><span >startActivityForResultspan><span >(span><span >pickIntentspan><span >,span><span > REQUEST_PICK_APPLICATIONspan><span >);span>

Soudě podle řetězců v záměru a webové stránky vývojáře se pravděpodobně snažil umožnit uživateli vybrat si aplikaci třetí strany, ve které by přehrál nějaká média. Oprava poskytnutá zkušeným vývojářem CommonsWare, bylo celkem jednoduché: použít Úmysl. CreateChooser namísto ACTION_PICK_ACTIVITY. Nicméně, proč měli bychom tuto opravu implementovat? Proč vyžaduje Huawei toto povolení na prvním místě? Proč museli jsme najít odpověď na StackOverflow pomocí velmi specifického vyhledávání Google?


Paradox volby

Chcete-li najít odpověď, CommonsWare nahlásil chybu na nástroji pro sledování chyb systému Android, který požaduje, aby Google problém prošetřil. Vývojář konkrétně požádal, aby společnost Google zablokovala nezdokumentované požadavky na povolení, aby zabránila aplikacím třetích stran v přístupu k ACTION_PICK_ACTIVITY. Zapsáním těchto požadavků do CTS, Huawei by byl nucen těmto změnám vyhovět.

Abych byl upřímný, tato chyba sama o sobě opravdu není velký problém. I když žádná jiná aplikace, kterou jsem zkoušel (například Tasker), nedokázala toto oprávnění obejít požadavek a spuštění určitých činností v rámci aplikace Nastavení, nebyl jsem zrovna zklamán výsledek. Ale když jsem si vzpomněl na řeč pana Ambriho, uvědomil jsem si, že takové malé změny musí být velmi frustrující, zvláště pak protože jakkoli mohou být maličké, nepochybně jsoupřidat, někdy natolik, že způsobí bolest hlavy. Jedna malá změna v aplikaci Nastavení by mohla mít za následek nezaslouženou negativní recenzi vůči vývojáře. Jedna drobná změna, která je dosti špatně zdokumentovaná a vyžadovala, abych prohledal internet, abych našel vlákno Stack Overflow. Kolik dalších malých chyb je na jiných zařízeních?

Zvýšená konkurence v mobilním prostoru se ukázala jako skvělá pro spotřebitele, ale poté, co viděl, jak se tyto jemné změny v mnoha různých produktových řadách, které mohou ovlivnit vývojáře, jsem začal oceňovat pohled vývojářů fragmentace. Není to tak, že by problémem byla samotná volba, ale spíše to, že komunita nedělá dost pro katalogizaci těchto problémů. Jak ve svém článku naznačil pan Ambri, vývojáři Androidu možná potřebují svou vlastní verzi caniuse.com nebo sdkcritic.com shromáždit všechny nejasné chyby do jedné databáze. Jedinou další alternativou je přimět výrobce OEM, aby tyto změny buď řádně zdokumentovali, nebo je přestali provádět hodně štěstí.

Poděkování za hlavní obrázek: OpenSignal