Žalosno stanje fragmentacije Androida: primjer za razumijevanje nevolje programera

Prosječni korisnik Androida vjerojatno je odavno prestao mariti za Androidov "problem fragmentacije". Ali problem još uvijek proganja programere.

Fragmentacija je bila sporno pitanje u Androidu doslovno otkad je mobilni operativni sustav najavljen.

Osim što je batina koju trolovi koriste u online vatrenim ratovima, raznolikost koja dolazi s fragmentacijom sada se uglavnom smatra neto pozitivno za potrošače Android uređaja. Uostalom, dana nam je tolika sloboda u odabiru vrste uređaja s vrstom softvera koji želimo da je prosječnom potrošaču teško brinuti o fragmentaciji. Vizualizacija nevjerojatne raznolikosti Android uređaja stvara prekrasan mozaik raznolike reprezentacije Androida.

Primjer fragmentacije Android uređaja na temelju instalacije aplikacije OpenSignal. Izvor: OpenSignal

Ali fragmentacija hardvera i softvera ne čini sretnog programera softvera. Zapravo, sasvim suprotno. Razvijanje aplikacije na toliko različitih konfiguracija hardvera i softvera može se pokazati kao velika smetnja prilikom uklanjanja pogrešaka. OEM-ovi mogu napraviti velike ili suptilne promjene koje se moraju uzeti u obzir pri razvoju aplikacije, ali stvarno ne postoji jednostavan način da individualni razvojni programer osigura da će njihova aplikacija raditi univerzalno. Iako je prosječni potrošač odavno zaboravio na raspravu o fragmentaciji, to pitanje još uvijek proganja Android razvojni programeri aplikacija i naizgled nema ništa za učiniti u vezi s tim osim usisati i riješiti pogreške dok pojaviti se.


Žalosno stanje rascjepkanosti

Jedan OEM posebno dobiva veliku porciju mržnje zbog glavobolja koje izazivaju pri razvoju aplikacije – Samsung. Programeri već godinama laprdaju o Samsungu, neki čak pišu oštre članke poput "Postoji posebno mjesto za Samsung u Android paklu" koji opisuje posebno frustrirajuću pogrešku koja proizlazi iz Samsung uređaji i knjižnica podrške appcompat. Želio bih posebno skrenuti pozornost na jedan paragraf iz govora g. Ambrija, koji izvrsno ocrtava zašto programeri još uvijek brinu o fragmentaciji:

Ako ste Android programer, vaša mržnja prema Samsung uređajima je vjerojatno bezgranična. Više od prosječnog korisnika, za kojeg je Samsung sinonim glupi Touchwiz i pretjerani bloatware, prezirete Samsung jer nemate izbora. Zbog Samsunga ogroman tržišni udio, jednostavno ne možete odabrati da ne podržavate Samsung uređaje. I to je ono što najviše boli; činjenica da vam je ovaj izbor oduzet!

Ni ovo nije lupetanje iz davnih godina postojanja Androida – ovaj post je objavljen sredinom prosinca prošle godine. Bit ću otvoren i reći ću da nisam siguran je li ovaj problem još službeno riješen, međutim, g. Ambri je u svom postu pružio rješenje za svakoga tko naiđe na njegovo brbljanje putem Google pretraživanja za buba. Sve što trebate učiniti je koristiti ProGuard sa sljedećim jednim retkom koda:

# 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 i nije tako loše, zar ne? Međutim, problem je u tome što je ovaj popravak izvučen iz Stack Overflowa. Nemojte me krivo shvatiti, Stack Overflow je sjajna web stranica. Ali to zapravo nije idealan izvor za otkrivanje popravaka za vaše aplikacije. Pronalaženje nečega na Stack Overflowu često uključuje dubinsko ronjenje kroz veze nakon brojnih pokušaja i pogrešaka Google pretraživanja. Ponekad ćete čak pronaći drugog korisnika koji spominje istu pogrešku koju ste vi imali, ali bez rješenja na vidiku. Ili su još frustrirajući trenuci kada nađete nit tamo gdje je originalni poster tvrdio su pronašli popravak, ali su odavno napustili svoju nit, a da nisu uputili druge kako da poprave problem.

Izvor: XKCD

Primjer suptilnog problema s fragmentacijom

Ja osobno nisam programer, ali dovoljno sam upoznat s mogućnostima Androida nakon godina petljanja u Taskeru da sam počeo pseudoprogramirati vlastita rješenja za probleme s kojima sam se suočavao. A kad nešto ne mogu shvatiti, guglam, kao i svi drugi. Dok sam bio u procesu pisanja svog prethodnog članka o kopajući po aplikaciji Postavke vašeg telefona u potrazi za skrivenim aktivnostima, naišao sam na prilično čudan bug koji nisam mogao objasniti. Greška jedinstvena za Huawei uređaje.

Kad god bih pokušao pokrenuti određene aktivnosti (kao što je izbornik "Testiranje" koji sadrži statistiku upotrebe aplikacije) unutar aplikacije Postavke, uvijek bi se susreo s pogreškom dopuštenja. Konkretno, aplikacija koju sam koristio za pokretanje aktivnosti nije imala dopuštenje huawei.android.dopuštenje. HW_SIGNATURE_OR_SYSTEM. Nijedan drugi uređaj koji sam testirao nije zahtijevao nikakve jedinstvene dozvole za pokretanje ovih aktivnosti postavki, samo telefoni koji koriste Huaweijevu verziju Androida (EMUI). Analiza od com.android.postavke otkrio je da su određene aktivnosti unutar aplikacije Postavke doista pod razinom zaštite koja zahtijeva ili potpis ili dopuštenje sustava.

Na moju žalost, to znači da su samo aplikacije instalirane pod /system ili aplikacije potpisane istim potpis jer bi aplikacija Postavke mogla otvoriti te aktivnosti koristeći metodu koju sam ja koristio pokušavajući. Kad sam Googleom tražio odgovor na ovu pogrešku, (pogađate) naišao sam na Stack Overflow nit. Programer koji je objavio svoj problem naišao je na isti problem kao i ja (iako je bio u procesu razvoja aplikacije). Njegov problem je nastao kada je pokušao pokrenuti sljedeći kod:

<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>

Sudeći po nizovima u namjeri i web stranici programera, vjerojatno je pokušavao dopustiti korisniku da odabere aplikaciju treće strane za reprodukciju medija. Popravak, osigurao iskusni programer CommonsWare, bilo je prilično jednostavno: koristiti Namjera. CreateChooser umjesto ACTION_PICK_ACTIVITY. Međutim, zašto trebamo li implementirati ovaj popravak? Zašto treba li Huawei uopće ovo dopuštenje? Zašto jesmo li morali pronaći odgovor na StackOverflowu korištenjem vrlo specifičnog Google pretraživanja?


Paradoks izbora

Da pronađem odgovor, CommonsWare je prijavio grešku na Android alatu za praćenje bugova tražeći da Google istraži problem. Konkretno, razvojni programer je zatražio da Google zabrani nedokumentiranim zahtjevima za dopuštenje da aplikacijama trećih strana onemogući pristup ACTION_PICK_ACTIVITY. Upisivanjem ovih zahtjeva u CTS, Huawei bi bio prisiljen uskladiti se s ovim promjenama.

Međutim, da budem iskren, ovaj bug sam po sebi nije velika stvar. Iako nijedna druga aplikacija koju sam isprobao (kao što je Tasker) nije uspjela zaobići ovu dozvolu zahtjeva i pokrenuti određene aktivnosti unutar aplikacije Postavke, nisam baš razočaran ishod. Ali kad sam se sjetio govora g. Ambrija, shvatio sam da su male promjene poput ovih vrlo frustrirajuće za suočavanje, posebno jer koliko god maleni bili, oni nedvojbenozbrojiti, ponekad dovoljno da izazove glavobolju. Jedna mala promjena u aplikaciji Postavke mogla bi rezultirati nezasluženom negativnom recenzijom protiv programera. Jedna sićušna promjena koja je prilično slabo dokumentirana i zahtijevala je da pretražim Internet u potrazi za temom Stack Overflow. Koliko drugih malih grešaka ima na drugim uređajima?

Povećana konkurencija u mobilnom prostoru pokazala se odličnom za potrošača, ali nakon što smo vidjeli kako ove suptilne promjene u toliko različitih linija proizvoda može utjecati na programere, počeo sam cijeniti pogled razvojnih programera prema fragmentacija. Nije problem u izboru, već u tome što zajednica ne čini dovoljno da katalogizira te probleme. Kao što je g. Ambri predložio u svom članku, možda programeri za Android trebaju vlastitu verziju caniuse.com ili sdkcritic.com prikupiti sve opskurne greške u jednu bazu podataka. Jedina druga alternativa je natjerati OEM-e da ispravno dokumentiraju te promjene ili da ih uopće prestanu raditi, ali sretno s tim.

Zasluge za istaknutu sliku: OpenSignal