Ospravedlňujúci sa stav fragmentácie systému Android: Príklad na pochopenie situácie vývojárov

Bežného používateľa Androidu už pravdepodobne dávno prestal zaujímať „problém s fragmentáciou“ Androidu. Tento problém však stále prenasleduje vývojárov.

Fragmentácia je v Androide sporným problémom doslova od ohlásenia mobilného operačného systému.

Okrem toho, že je to palica pre trollov na použitie v online plameňových vojnách, rozmanitosť, ktorá prichádza s fragmentáciou, je teraz do značnej miery vnímaná ako čisté pozitívum pre spotrebiteľov zariadení so systémom Android. Koniec koncov, máme toľko slobody pri výbere typu zariadenia s druhom softvéru, ktorý chceme, že pre bežného spotrebiteľa je ťažké starať sa o fragmentáciu. Vizualizácia neuveriteľnej rozmanitosti zariadení so systémom Android vytvára nádhernú mozaiku rozmanitého zastúpenia systému Android.

Príklad fragmentácie zariadenia Android založenej na inštaláciách aplikácie OpenSignal. Zdroj: OpenSignal

Hardvérová a softvérová fragmentácia však nerobí šťastného vývojára softvéru. V skutočnosti práve naopak. Vývoj aplikácie v toľkých rôznych hardvérových a softvérových konfiguráciách sa môže ukázať ako veľká nepríjemnosť pri ladení. Výrobcovia OEM môžu urobiť veľké alebo jemné zmeny, ktoré je potrebné zohľadniť pri vývoji aplikácie, ale pre jednotlivého vývojára skutočne neexistuje jednoduchý spôsob, ako zabezpečiť, aby ich aplikácia fungovala univerzálne. Zatiaľ čo bežný spotrebiteľ už dávno zabudol na diskusiu o fragmentácii, tento problém stále prenasleduje Android vývojári aplikácií a zdanlivo sa s tým nedá nič robiť, iba to vysať a vysporiadať sa s chybami, objaviť.


Prepáčte stav fragmentácie

Najmä jeden OEM dostáva veľkú porciu nenávisti za bolesti hlavy, ktoré spôsobujú pri vývoji aplikácie – Samsung. Vývojári o Samsungu kričia už roky, niektorí dokonca píšu také štipľavé články ako „V Android Hell je špeciálne miesto pre Samsung“, ktorý popisuje obzvlášť frustrujúcu chybu pochádzajúcu z Zariadenia Samsung a podporná knižnica appcompat. Chcel by som upriamiť pozornosť najmä na jeden odsek z vyčíňania pána Ambriho, ktorý vynikajúco načrtáva, prečo vývojárom stále záleží na fragmentácii:

Ak ste vývojár Androidu, vaša nenávisť k zariadeniam Samsung je pravdepodobne bezhraničná. Viac ako bežný používateľ, pre ktorého je Samsung synonymom hlúpy Touchwiz a nadmerný bloatware, opovrhujete Samsungom, pretože nemáte na výber. Kvôli Samsungu masívny podiel na trhu, jednoducho sa nemôžete rozhodnúť nepodporovať zariadenia Samsung. A to bolí najviac; skutočnosť, že táto voľba je vám odobratá!

Ani toto nie je výhovorka zo starých rokov existencie Androidu – tento príspevok bol zverejnený v polovici decembra minulého roka. Budem vopred a poviem, že si nie som istý, či bol tento problém už oficiálne vyriešený, ale p. Ambri poskytol vo svojom príspevku opravu pre každého, kto narazí na jeho chválospev prostredníctvom vyhľadávania Google chyba. Všetko, čo musíte urobiť, je použiť ProGuard s nasledujúcim jedným riadkom 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 už nie je také zlé, však? Problém je však v tom, že táto oprava bola stiahnutá zo Stack Overflow. Nechápte ma zle, Stack Overflow je skvelá webová stránka. Ale v skutočnosti to nie je ideálny zdroj na objavovanie opráv pre vaše aplikácie. Hľadanie niečoho na Stack Overflow často zahŕňa ponorenie sa hlboko do odkazov po mnohých pokusoch a omyloch na Googli. Niekedy dokonca zistíte, že iný používateľ spomenul rovnakú chybu, ktorú ste mali vy, ale bez opravy. Alebo ešte viac frustrujúce sú chvíle, keď nájdete vlákno, kde to tvrdil pôvodný plagát našli opravu, ale už dávno opustili svoje vlákno bez toho, aby inštruovali ostatných, ako to opraviť problém.

Zdroj: XKCD

Príklad problému jemnej fragmentácie

Sám nie som vývojár, ale po rokoch práce v Taskeri som dostatočne oboznámený s možnosťami Androidu, takže som začal pseudoprogramovať svoje vlastné riešenia problémov, ktorým som čelil. A keď na niečo neviem prísť, dám si to do Googlu, tak ako všetci ostatní. Kým som písal svoj predchádzajúci článok o hľadanie skrytých aktivít v aplikácii Nastavenia v telefóne, narazil som na dosť zvláštnu chybu, ktorú som nevedel vysvetliť. Chyba jedinečná pre zariadenia Huawei.

Kedykoľvek som sa pokúsil spustiť určité aktivity (napríklad ponuku „Testovanie“, ktorá obsahuje štatistiky používania aplikácie) v aplikácii Nastavenia, vždy som sa stretol s chybou povolenia. Najmä aplikácii, ktorú som používal na spustenie aktivity, chýbalo povolenie huawei.android.povolenie. HW_SIGNATURE_OR_SYSTEM. Žiadne iné zariadenie, ktoré som testoval, nevyžadovalo na spustenie týchto aktivít nastavení žiadne jedinečné povolenia, iba telefóny s verziou Androidu od Huawei (EMUI). Analýza com.android.settings odhalili, že určité aktivity v aplikácii Nastavenia boli skutočne pod úrovňou ochrany, ktorá si vyžadovala buď podpis alebo systémové oprávnenie.

Nanešťastie to pre mňa znamená, že iba aplikácie nainštalované pod /system alebo aplikácie podpísané rovnakým podpis, pretože aplikácia Nastavenia by mohla tieto aktivity otvárať spôsobom, akým som bol ja pokúšajúc sa. Keď som v Google hľadal odpoveď na túto chybu, (uhádli ste) narazil na a Stack Overflow vlákno. Vývojár, ktorý uverejnil svoj problém, narazil na rovnaký problém ako ja (hoci jeho bol práve v procese vývoja aplikácie). Jeho problém nastal, keď sa pokúsil spustiť nasledujúci 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>

Súdiac podľa reťazcov v zámere a webovej stránky vývojára sa pravdepodobne pokúšal umožniť používateľovi, aby si vybral aplikáciu tretej strany na prehrávanie niektorých médií. Oprava, ktorú poskytol skúsený vývojár CommonsWare, bolo celkom jednoduché: použiť Zámer. CreateChooser namiesto ACTION_PICK_ACTIVITY. však prečo mali by sme túto opravu implementovať? Prečo? vyžaduje Huawei toto povolenie v prvom rade? Prečo? potrebovali sme nájsť odpoveď na StackOverflow pomocou veľmi špecifického vyhľadávania Google?


Paradox voľby

Ak chcete nájsť odpoveď, CommonsWare nahlásil chybu na nástroji na sledovanie chýb systému Android, ktorý požaduje, aby spoločnosť Google problém preskúmala. Vývojár konkrétne požiadal, aby spoločnosť Google zablokovala nezdokumentované požiadavky na povolenia, ktoré by bránili aplikáciám tretích strán v prístupe k ACTION_PICK_ACTIVITY. Zapísaním týchto požiadaviek do CTS, Huawei by bol nútený vyhovieť týmto zmenám.

Aby som bol úprimný, táto chyba sama o sebe naozaj nie je veľký problém. Aj keď žiadna iná aplikácia, ktorú som skúšal (napríklad Tasker), nedokázala toto povolenie obísť požiadavku a spúšťanie určitých činností v rámci aplikácie Nastavenia ma nesklamali výsledok. Ale keď som si spomenul na žvásty pána Ambriho, uvedomil som si, že malé zmeny, ako sú tieto, musí byť veľmi frustrujúce, najmä pretože akokoľvek maličkí môžu byť, nepochybnesčítať, niekedy natoľko, že spôsobí bolesť hlavy. Jedna malá zmena v aplikácii Nastavenia by mohla viesť k nezaslúženej negatívnej recenzii voči vývojárovi. Jedna malá zmena, ktorá je dosť slabo zdokumentovaná a vyžadovala si, aby som prehľadal internet a našiel vlákno Stack Overflow. Koľko ďalších malých chýb je na iných zariadeniach?

Zvýšená konkurencia v mobilnom priestore sa ukázala ako skvelá pre spotrebiteľa, ale po tom, čo videl, ako sa tieto jemné zmeny V mnohých rôznych produktových radoch, ktoré môžu ovplyvniť vývojárov, som si začal vážiť pohľad vývojárov fragmentácia. Problémom nie je samotný výber, ale skôr to, že komunita nerobí dosť pre katalogizáciu týchto problémov. Ako naznačil pán Ambri vo svojom článku, vývojári Androidu možno potrebujú svoju vlastnú verziu caniuse.com alebo sdkcritic.com zhromaždiť všetky nejasné chyby do jednej databázy. Jedinou ďalšou alternatívou je prinútiť výrobcov OEM, aby tieto zmeny riadne zdokumentovali alebo ich prestali robiť veľa šťastia s tým.

Poďakovanie za hlavné obrázky: OpenSignal