Kamere v ROM-ih po meri: Kako razvijalci poskrbijo, da strojna oprema deluje brez izvorne kode

Kako lahko razvijalci brez izvorne kode zagotovijo strojne komponente, kot so kamere, ki delujejo v ROM-ih po meri? Odgovor je BLOB, shim in veliko odpravljanja napak.

Z izdajo Androida Oreo in številnih naprav, kot je Xiaomi Redmi Note 3, Google Nexus 5 in drugi, ki ga prejemajo neuradno, se je verjetno pošteno vprašati, zakaj se iste funkcije (večinoma kamera) pokvarijo, ko razvijalci prenesejo ROM, ki temelji na projektu Android Open Source Project (AOSP). Verjetno ste na forumu XDA videli teme ROM-ov z dolgim ​​seznamom nedelujočih funkcij na vrhu. »Kaj deluje«, ki mu sledi seznam delujočih funkcij, nato spodaj ikonično »Kaj ne deluje? Ti mi povej!" sta dva priljubljena refrena na naših forumih, ki sta praktično postala meme na mestih, kot sta Reddit in Twitter.

Zakaj je toliko funkcionalnosti pokvarjenih, ko razvijalec poskuša prenesti AOSP ROM na svojo napravo? Osnovni odgovor je, da ker se funkcije spreminjajo v različnih različicah Androida, stari gonilniki naprav, zapakirani kot BLOB, ne bodo delovali z novejšimi različicami Androida ali celo samo z osnovnim AOSP. Da bi to premagali, razvijalci uporabljajo tako imenovani »shim«, vendar je vključeni postopek težaven, časovno intenziven in včasih ga je zelo težko odpraviti.

V tem članku bomo opisali, kako delujejo podložke, zlasti glede pravilnega delovanja kamere na ROM-ih, ki temeljijo na AOSP. Za primer bomo uporabili OnePlus 3T. Upoštevajte, da so težave pri zagotavljanju delovanja teh funkcij zelo specifične za napravo.

OnePlus 3T z operacijskim sistemom OxygenOS. Čeprav so telefoni OnePlus znani po svoji prijaznosti do razvoja po meri, razvijalci v zakulisju opravijo veliko dela, da ustvarijo stabilna vrata AOSP.


Kaj je shim ali BLOB?

Da bi sploh začeli razumeti del tega, kar počnejo razvijalci, moramo najprej razložiti nekaj stvari. Čeprav je operacijski sistem Android odprtokoden (z razlogom se imenuje Android Open Source Project), programska oprema (brez jedra), dostavljena na tisoče naprav Android, ni. Razvijalci nimajo dostopa do izvorne kode Samsung Experience, EMUI, OxygenOS, ali katero koli drugo različico Androida tretjih oseb.

Razvijalcem, ki prenašajo osnovni AOSP v napravo, ki ni Googlova, verjetno ni mar za izvorno kodo teh preoblek za Android, saj jih ne bo spreminjanje in gradnjo teh ROM-ov. To bi bilo res, če ne zaradi enega velikega, velikega razloga: v glavnem zaradi delov, ki so potrebni za pravilno delovanje kamere the kamera HAL (Hardware Abstraction Layer), so tudi zaprt vir.

Težava z zaprto kodo fotoaparata HAL, ampak tudi ROM-a je v tem, da bodo razvijalci, ki delajo na prenosu AOSP na svoje naprave, delo na slepo. Zaprti izvorni ROM OEM je sposoben vzpostaviti vmesnik s kamero HAL v redu, ker ima OEM dostop do vira HAL kamere. HAL kamere je tisto, kar ROM-u omogoča, da se "pogovarja" s strojno opremo kamere - brez nje kamera ne bi delovala. Predstavljajte si kamero HAL kot volan in stopalke avtomobila. Volan/pedali omogočajo nadzor nad notranjimi komponentami vozila z zagotavljanjem zunanjega vmesnika za voznika (ROM) za uporabo notranjih komponent.

Grafika, ki prikazuje arhitekturo kamere. Vir: Google

Ker strojna oprema kamere postaja vse bolj zapletena ( pojav dvojnih kamer, na primer), če bi imeli dostop do vira HAL kamere, bi bil prenos AOSP ROM-a s funkcionalno kamero veliko lažji podvig.

Vendar proizvajalci originalne opreme iz različnih razlogov ne omogočajo dostopa do vira HAL kamere. Prvič, če nimajo vseh lastniških pravic do kamere HAL (na primer, ko vključijo intelektualno lastnino drugih podjetij), potem ne morejo distribuirati vira. Drugič, sprostitev vira HAL kamere lahko ogrozi njihovo lastno intelektualno lastnino. Nazadnje, podjetja niso zakonsko zavezana k zagotavljanju te izvorne kode (za razliko od izvorne kode jedra, ki so dolžan izdati v skladu z GPL), zato nimajo nobene spodbude, da bi ga izdali. Torej, brez dostopa do vira HAL kamere, kako natančno lahko razvijalci dosežejo, da kamera deluje na AOSP ROM-ih? Odgovor je BLOB, shim in veliko in veliko odpravljanja napak.

Naprava BLOB (Binary Large OBject) vsebuje vnaprej zapakirane binarne datoteke, ki so prevedena oblika programske opreme. V tem primeru vir HAL za kamero sestavi proizvajalec originalne opreme in ga pošlje napravam kot binarne datoteke. Ko razvijalci govorijo o BLOB-jih, mislijo na tiste binarne datoteke, ki so dobavljene v živih napravah in jih lahko ekstrahirajo. Zdaj pa je tema "camera BLOBs". dolgo mučen OnePlus več mesecev, toda resnica je, da so razvijalci vedno imeli dostop do kamer BLOB. The izvorna koda fotoaparata HAL je zlata vstopnica za razvijalce tukaj, ampak to bo nikoli, nikoli ne bo izpuščen zaradi pravne nevarnosti, v katero bi spravil podjetja, kot je OnePlus.

Tako razvijalci, ki želijo prenesti AOSP v napravo, ostanejo samo z BLOB-i HAL kamere, za katere nimajo dostopa do izvorne kode. Redko, če sploh kdaj, lahko razvijalec združi svojo kodo AOSP ROM s kamero HAL BLOB in pričakuje, da bo delovala, zato, da bi premostili vrzel med obema, razvijalci ustvarijo tako imenovano "podložka.”

"Shim" pomeni "zagozditi (nekaj) ali zapolniti prostor." To dejansko počne razvijalec, ko pisanje podložke – dodajo kodo, ki omogoča, da se BLOB poveže z izvorno kodo AOSP, ki jo delajo z. Podložke se uporabljajo, da BLOB-ji vseh različnih vrst delujejo z AOSP, vendar je običajno kamera BLOB tista, ki zahteva največ utripanja. Kot smo že omenili, shimming ni potreben samo za prenos novejših različic Androida v napravo (kot je npr. vsi tisti neuradni ROM-i Android Oreo), vendar so potrebni tudi pri prenosu AOSP iste različice Androida na to napravo.

Priporočeno branje: Od trgovine do police: poglobljena kapitulacija o tem, zakaj so naprave MSM8974 izključene iz Nougata

OnePlus 2 je na primer prejel svoje zadnja uradna velika posodobitev OS v obliki Android 6.0 Marshmallow. Naprava pa dejansko ima popolnoma delujoči ROM-i po meri, ki temeljijo na AOSP temelji na sistemu Android Nougat, in to zahvaljujoč trdemu delu razvijalcev in njihovih podstavkov. Razčlenili bomo nekaj primerov podložk, a najprej se moramo pogovoriti o tem, kako natančno podložke delujejo.


Kako deluje shiming?

Ker razvijalci nimajo dostopa do vira HAL kamere ali OEM ROM (in samo vnaprej prevedenih binarnih datotek), ne morejo vedeti, katere funkcije HAL kamere pričakuje. Zaradi tega pogosto pride do neskladja med imenom funkcije, ki jo išče kamera HAL, in dejanskim imenom funkcije v kodi AOSP, s katero dela razvijalec.

Da bi rešil to težavo, razvijalec preprosto ustvari novo funkcijo, ki uporablja isto ime funkcije funkcijo, ki jo kamera HAL BLOB pričakuje, vendar ta nova funkcija samo izvaja tisto, kar želi razvijalec to za. Ta nova funkcija, ki deluje kot posrednik med BLOB in AOSP, je shim. Ta poseben scenarij, v katerem BLOB ne najde funkcije, ki jo išče, je eden najpogostejših, kjer je potrebna podložka.

Zelo preprost diagram barve MS, ki prikazuje, kje je potrebna podložka.

Morda bodo stvari nekoliko bolj smiselne s hipotetičnim primerom, ki vključuje OnePlus 3T. Ustvarili bomo primer z uporabo OxygenOS in kamere OnePlus. Če za izdelavo Nougat ROM-a, ki temelji na AOSP, uporabimo BLOB-je kamere, vzete iz OxygenOS Nougat za OnePlus 3T, lahko naletimo na težave. To je zato, ker se bodo BLOB-ji kamere (ki jih je prvotno prevedel proizvajalec originalne opreme) lahko sklicevali na vse funkcije, ki jih potrebuje znotraj OxygenOS, a ker preveden AOSP ROM morda nima teh funkcij ali pa jih je prevedel pod drugim imenom (kar vodi do neujemanja med simboli funkcij), bo prišlo do napaka. To je mogoče popraviti tako, da ustvarite novo funkcijo znotraj AOSP ROM z imenom, ki ga pričakuje BLOB – naš podstavek.

Simboli v kontekstu programiranja se uporabljajo za sklicevanje na določene funkcije v kodi. Simboli so potrebni, ker se položaj funkcije lahko spremeni, ko je koda urejena, in zato, da se izognemo trdemu kodiranju sklicevanja na funkcije, prevajalnik ustvari tabelo simbolov, ki jo lahko druge funkcije uporabijo za vedno sklicevanje na desno funkcijo. Ko spremenite ime funkcije pred prevajanjem, se spremeni tudi njen simbol, torej v bistvu vse spremembe ki jih proizvajalec originalne opreme pred prevajanjem naredi viru HAL fotoaparata, bodo morali razvijalci ustvariti novo podložka.

Ogled tabele simbolov s Hopperjem. Vir: Apriorit

Razlaga, ki smo jo ponudili do sedaj, kaže, da je ustvarjanje podložk preprosto. Spreminjanje nekaj imen funkcij tu in tam se ne sliši preveč težko, kajne? Ko bi le bilo tako enostavno. Resničnost podstavkov vključuje več kot le preimenovanje funkcij. Pogovarjali smo se s priznanim razvijalcem XDA Sultanxda, ki nam je lahko ponudil primer ene težjih podstavkov, na katerih je delal.


Šimiranje – ni tako enostavno, kot se sliši

Za tiste, ki ne poznate OnePlus 3T, je bila sprednja kamera na začetku precej pokvarjena. ROM-i po meri, ki temeljijo na AOSP. Za začetek bi poskus fotografiranja katere koli slike nad 8 MP povzročil strmoglavljenje. V svojem poskusu rešitve tega vprašanja je Sultanxda naredil več podložke da omogočite pravilno delovanje sprednje kamere OnePlus 3T.

Shim #1 - Spreminjanje imena paketa kamere

Da bi preprečil, da bi se sprednja kamera zrušila, ko je uporabnik posnel sliko nad 8 MP, je Sultanxda prisilil kamero HAL, da identificira vse kamere kot kamero OnePlus. To je storjeno, ker se je OnePlus odločil, da bo nekaterim aplikacijam namenil funkcijo pomoči (isOnePlusCamera, isFacebookCamera, itd.) iz nekega razloga. Sultanxda je to popravila tako, da je kamero osvetlila HAL, tako da kaže na novo funkcijo, ki vedno vrne »true«, kot da uporabnik uporablja kamero OnePlus – tudi če je ne uporablja.

Podloga #2 - Onemogoči QuadraCfa

Za svojo naslednjo podlogo je moral onemogočiti QuadraCfa, ki je domnevno lastniška tehnologija Qualcomm, povezana s kamero. Rečemo domnevno, ker niti jaz niti Sultanxda nisva povsem prepričana, kaj je QuadraCfa, vendar Sultanxda ve, da je pokvaril sprednjo kamero, kadar koli je bila omogočena.

Opazil je, da se bo QuadraCfa nekako omogočila, vendar ni bil prepričan, zakaj ali kako to počne. Rešitev tega je zahtevala precej nekonvencionalno modifikacijo z njegove strani. V običajnem shimu funkcija shim, ko je prevedena, zagotovi manjkajoči simbol, ki ga išče BLOB. V tem primeru je BLOB že imel simbole, ki jih je potreboval – tiste, ki so domnevno predstavljali funkcije, ki so zagnale QuadraCfa.

Bless Hex Editor. Uporabljen program Sultanxda.

Tako je moral preglasiti simbole, ki jih uporablja kamera HAL, in jih v bistvu narediti "manjkajoče", tako da njegov podložke bi zagotovile te "manjkajoče" simbole. Edini način za to je prek hex urejanje same kamere HAL. Hex urejanje je v bistvu pregledovanje kopice neorganiziranega blebetanja v obliki binarnih podatkov, da bi našli iglo v kupu sena – bodisi funkcijo ali niz, ki ga želite urediti.

Šestnajstiško urejanje funkcije je bistveno težje kot šestnajstiško urejanje niza, a na srečo se je Sultanxda izognila heksadekacijskemu urejanju funkcij za QuadraCfa hex urejanje imen simbolov, da razveljavi te simbole.

Shim #3 - Bright Light Crash Fix

Nato je Sultanxda ugotovil, da bi fotografiranje s sprednjo kamero pri močni svetlobi povzročilo zrušitev kamere. Da bi reproducirali to napako na svoji napravi, Sultanxda pravzaprav vklopil funkcijo svetilke svojega OnePlus One in osvetlil pred sprednjo kamero OnePlus 3T da se zruši in ustvari uporabne dnevnike! Ko je odkril, katera funkcija je povzročila zrušitev, je ustvaril podložek, ki prisili napravo, da ves čas uporablja način šibke svetlobe za sprednjo kamero.

Shim #4 - Slike s sprednjo kamero nizke ločljivosti

Potem ko je s prejšnjim šimom popravil zrušitev močne svetlobe, je Sultanxda odkril še eno napako, ki je dejansko nastala kot neposredna posledica tega šima: slike sprednje kamere nizke ločljivosti. Namesto fotografiranja z ločljivostjo, ki jo zahteva uporabnik (npr. 16MP), bi nastala slika bila posneta pri 4MP.

Rešitev tega je zahtevala, da je podprl funkcije handleSuperResolution in isSuperResolution da vedno vrne true, vendar SAMO, ko je sprednja kamera aktivna (ker drugače bi se kamera zrušila pri fotografiranju z zadnjim senzorjem).


Naučena lekcija – šivanje je lahko težko

Sultanxda priznava, da podložke, ki jih je moral ustvariti, da je sprednja kamera OnePlus 3T delovala, ne predstavljajo tipičnega primera podložke. Precej ponosen je na svoj podstavek glede na njegovo zapletenost in redko potrebo po hex urejanju samega BLOB-a. Toda ta primer samo kaže, kako težko je doseči, da strojna oprema fotoaparata deluje na določenih napravah.

Naj bodo vaše dogodivščine s premikanjem fotoaparata manj boleče, kot so bile moje. -Sultandža

Polena, polena in še več polen. Brez doslednega načina za reprodukcijo zrušitve in brez dnevnikov razvijalci nimajo veliko upanja, da bodo našli vir težave. Tudi če najdejo vzrok težave, to ni vedno enostavna rešitev. Celoten proces iskanja in odpravljanja teh hroščev lahko traja dneve ali tedne in je razlog, zakaj je popravljanje kamere na AOSP ROM-ih ena težjih nalog.

Če je v vašo napravo prenesen AOSP ROM s popolnoma delujočo strojno opremo, upajmo, da lahko začnete cenite boj, skozi katerega so morda šli ti razvijalci, da bi vam jih prinesli Lastnosti. Cenite jih za njihovo delo, saj ni lahko. To je veliko dela, ki ga velika večina uporabnikov sploh ne bo opazila, saj nadarjeni razvijalci na naših forumih skrbijo za številne nevidne dele Androida.

Posebno bi se radi zahvalili Sultanxdi za številne prispevke, ki jih je predlagal pri nastajanju tega članka.