Ako vývojári bez zdrojového kódu získajú hardvérové komponenty, ako sú napríklad fotoaparáty pracujúce vo vlastných ROM? Odpoveď je BLOB, podložka a veľa ladenia.
S vydaním systému Android Oreo a mnohých zariadení, ako je napr Xiaomi Redmi Note 3, Google Nexus 5 a iní to neoficiálne dostávajú, je pravdepodobne spravodlivé sa čudovať, prečo tie isté funkcie (väčšinou fotoaparát) majú tendenciu byť poškodené, keď vývojári portujú ROM založenú na Android Open Source Project (AOSP). Pravdepodobne ste už videli vlákna ROM na fóre XDA s dlhým zoznamom nefunkčných funkcií. „Čo funguje“, za ktorým nasleduje zoznam pracovných funkcií a pod ním ikonické „Čo nefunguje? Povedz mi!" sú dva populárne refrény na našich fórach, ktoré sa prakticky stali meme na miestach ako Reddit a Twitter.
Prečo je toľko funkcií poškodených vždy, keď sa vývojár pokúsi preniesť AOSP ROM do svojho zariadenia? Základnou odpoveďou je, že keďže funkcie sa v rôznych verziách Androidu menia, staré ovládače zariadení zabalené ako BLOB nebudú fungovať s novšími verziami Androidu, dokonca ani len so skladovým AOSP. Aby to vývojári prekonali, používajú to, čo sa nazýva „shim“, ale príslušný proces je zložitý, časovo náročný a niekedy je veľmi ťažké ho odladiť.
V tomto článku načrtneme, ako fungujú podložky, najmä pokiaľ ide o správne fungovanie fotoaparátu na ROM založených na AOSP. Ako príklad použijeme OnePlus 3T. Všimnite si, že ťažkosti spojené s fungovaním týchto funkcií sú vysoko špecifické pre zariadenie.
OnePlus 3T so systémom OxygenOS. Aj keď sú telefóny OnePlus známe svojou prívetivosťou k vývoju na mieru, vývojári robia v zákulisí veľa práce, aby vytvorili stabilné porty AOSP.
Čo je podložka alebo BLOB?
Aby sme dokonca začali chápať časť toho, čo vývojári robia, musíme najprv vysvetliť niekoľko vecí. Hoci operačný systém Android je open source (z nejakého dôvodu sa nazýva Android Open Source Project), softvér (bez jadra) dodávaný na tisíckach zariadení Android ním nie je. Vývojári nemajú prístup k zdrojovému kódu Skúsenosti Samsung, EMUI, OxygenOSalebo akejkoľvek inej verzie Androidu tretích strán.
Teraz vývojári, ktorí prenášajú akcie AOSP na zariadenia, ktoré nepochádzajú od Googlu, sa pravdepodobne nestarajú o zdrojový kód týchto vzhľadov systému Android, pretože nebudú úpravy a budovanie týchto ROM. To by bola pravda, ak nie z jedného veľkého, veľkého dôvodu: hlavne súčiastky potrebné na správne fungovanie fotoaparátu na kamera HAL (Hardware Abstraction Layer), sú aj uzavretý zdroj.
Problém s uzavretým zdrojom nielen pre HAL fotoaparátu, ale aj s ROM je, že vývojári pracujúci na portovaní AOSP do svojho zariadenia budú pracujúci slepý. Uzavretý zdroj OEM ROM sa dokáže dobre prepojiť s kamerou HAL, pretože výrobca OEM má prístup k zdroju HAL kamery. Kamera HAL umožňuje ROM „hovoriť“ s hardvérom kamery – bez nej by kamera bola nefunkčná. Predstavte si kameru HAL ako volant a pedále auta. Volant/pedály umožňujú ovládanie vnútorných komponentov vozidla poskytnutím externého rozhrania pre vodiča (ROM) na využitie vnútorných komponentov.
Ako sa hardvér fotoaparátu stáva čoraz zložitejším ( nástup duálnych fotoaparátovnapríklad), prístup k zdroju HAL kamery by uľahčil prenos AOSP ROM s funkčnou kamerou.
Výrobcovia OEM však z rôznych dôvodov neposkytujú prístup k zdroju HAL fotoaparátu. Po prvé, ak nemajú všetky vlastnícke práva na kameru HAL (napríklad keď zahŕňajú duševné vlastníctvo od iných spoločností), nemôžu šíriť zdroj. Po druhé, uvoľnenie zdroja HAL fotoaparátu môže ohroziť ich vlastné duševné vlastníctvo. Napokon, spoločnosti nemajú žiadnu zákonnú povinnosť poskytnúť tento zdrojový kód (na rozdiel od zdrojového kódu jadra, ktorým sú povinný vydať podľa GPL), preto nemajú motiváciu ho uvoľniť. Takže bez prístupu k zdroju HAL fotoaparátu, ako presne vývojári spustia fotoaparát na AOSP ROM? Odpoveď je BLOB, podložka a veľa, veľa ladenia.
Zariadenie BLOB (Binary Large OBject) obsahuje vopred zabalené binárne súbory, ktoré sú skompilovanou formou softvéru. V tomto prípade je zdroj HAL fotoaparátu zostavený výrobcom OEM a dodaný na zariadeniach ako binárne súbory. Keď vývojári hovoria o BLOB, odkazujú na tie binárne súbory, ktoré sa dodávajú na živých zariadeniach, ktoré sú schopní extrahovať. Teraz je tu téma „kamerových BLOBov“. dlho trápil OnePlus po mnoho mesiacov, ale pravdou je, že vývojári mali vždy prístup k objektom BLOB fotoaparátu. The Zdrojový kód kamery HAL je zlatým lístkom pre vývojárov tu, ale to bude nikdy, nikdy nebude prepustený kvôli právnemu ohrozeniu by to vnieslo spoločnosti ako OnePlus.
Vývojárom, ktorí chcú zaviesť AOSP do zariadenia, teda zostávajú iba objekty BLOB HAL fotoaparátu, pre ktoré nemajú prístup k zdrojovému kódu. Zriedka, ak vôbec, môže vývojár spárovať svoj kód AOSP ROM s kamerou HAL BLOB a očakávať, že bude fungovať, takže s cieľom preklenúť priepasť medzi týmito dvoma vývojármi vytvoria to, čo sa nazýva „shim.”
„Prehadzovať“ znamená „zaklinovať (niečo) alebo vyplniť priestor“. To je efektívne to, čo vývojár robí, keď písanie shim – pridávajú kód, ktorý umožní BLOB prepojiť sa so zdrojovým kódom AOSP, na ktorom pracujú s Podložky sa používajú na to, aby objekty BLOB všetkých rôznych druhov fungovali s AOSP, ale zvyčajne je to fotoaparát BLOB, ktorý vyžaduje najviac podložiek. Ako sme už spomenuli, shimming je potrebný nielen na prenos novších verzií Androidu do zariadenia (ako napr všetky tieto neoficiálne ROM Android Oreo), ale sú potrebné aj pri portovaní AOSP rovnakej verzie Androidu zariadenie.
Odporúčané čítanie: Z obchodu do regálu: Hĺbková kapitulácia toho, prečo sú zariadenia MSM8974 vylúčené z Nougatu
Svoje dostal napríklad OnePlus 2 posledná oficiálna veľká aktualizácia OS v podobe Androidu 6.0 Marshmallow. Zariadenie však v skutočnosti má plne funkčné vlastné ROM založené na AOSP založené na Androide Nougat, a to vďaka tvrdej práci vývojárov a ich shimov. Rozoberieme niekoľko príkladov podložiek, ale najprv si musíme povedať, ako presne podložky fungujú.
Ako funguje shimming?
Keďže vývojári nemajú prístup k zdroju HAL fotoaparátu alebo OEM ROM (a iba k predkompilovaným binárnym súborom), nemôžu vedieť, aké funkcie HAL fotoaparátu očakáva. Z tohto dôvodu často dochádza k nesúladu medzi názvom funkcie, ktorú kamera HAL hľadá, a skutočným názvom funkcie v kóde AOSP, s ktorým vývojár pracuje.
Na vyriešenie tohto problému vývojár jednoducho vytvorí novú funkciu, ktorá používa rovnaký názov funkcia, ktorú kamera HAL BLOB očakáva, ale táto nová funkcia len vykoná to, čo vývojár chce to. Táto nová funkcia, ktorá funguje ako prostredník medzi BLOB a AOSP, je podložka. Tento konkrétny scenár, v ktorom BLOB nedokáže nájsť funkciu, ktorú hľadá, je jedným z najbežnejších scenárov, kde je potrebná podložka.
Možno budú veci dávať o niečo väčší zmysel s hypotetickým príkladom zahŕňajúcim OnePlus 3T. Vytvoríme príklad pomocou OxygenOS a fotoaparátu OnePlus. Ak použijeme objekty BLOB fotoaparátu prevzaté z OxygenOS Nougat pre OnePlus 3T na vytvorenie ROM Nougat založenej na AOSP, môžeme naraziť na problémy. Je to preto, že objekty BLOB fotoaparátu (ktoré boli pôvodne zostavené výrobcom OEM) budú schopné odkazovať na všetky funkcie, ktoré potrebuje v rámci OxygenOS, ale keďže kompilovaná AOSP ROM nemusí mať tieto funkcie alebo ich mohla skompilovať pod iným názvom (čo vedie k nesúladu medzi funkčnými symbolmi), dôjde k chyba. Dá sa to vyriešiť vytvorením novej funkcie v AOSP ROM s názvom, ktorý BLOB očakáva – náš shim.
Symboly v kontexte programovania sa používajú na označenie špecifických funkcií v kóde. Symboly sú potrebné, pretože pozícia funkcie sa môže zmeniť, keď sa kód upraví, a tak sa vyhnete zakódovaniu odkazy na funkcie, kompilátor vytvorí tabuľku symbolov, pomocou ktorých môžu ostatné funkcie odkazovať vždy vpravo funkciu. Keď zmeníte názov funkcie pred kompiláciou, zmení sa aj jej symbol, teda v podstate akékoľvek zmeny ktorý výrobca OEM vytvorí so zdrojom HAL fotoaparátu pred kompiláciou, bude od vývojárov vyžadovať vytvorenie nového shim.
Vysvetlenie, ktoré sme doteraz ponúkli, znie, že vytváranie podložiek je jednoduché. Zmeniť niekoľko názvov funkcií tu a tam neznie príliš ťažko, však? Len keby to bolo také ľahké. Realita podložiek zahŕňa viac než len premenovanie funkcií. Hovorili sme s uznávaným vývojárom XDA Sultanxda, ktorý nám bol schopný poskytnúť príklad jednej z ťažších podložiek, na ktorých pracoval.
Shimming - Nie je to také jednoduché, ako to znie
Pre tých, ktorí nepoznajú OnePlus 3T, bola predná kamera spočiatku dosť rozbitá Vlastné ROM založené na AOSP. Po prvé, pokus nasnímať akýkoľvek obrázok s rozlíšením viac ako 8 MP by mal za následok zrútenie. Vo svojom pokuse vyriešiť tento problém, Sultanxda urobil niekoľko podložky aby predná kamera OnePlus 3T fungovala správne.
Shim #1 - Zmena názvu balíka fotoaparátu
Aby sa zabránilo zlyhaniu prednej kamery vždy, keď používateľ nasnímal obrázok s rozlíšením viac ako 8 MP, Sultanxda prinútil fotoaparát HAL identifikovať všetky fotoaparáty ako fotoaparát OnePlus. Deje sa tak preto, lebo OnePlus sa rozhodol venovať pomocnú funkciu určitým aplikáciám (isOnePlusCamera
, isFacebookCamera
, atď.) z nejakého dôvodu. Sultanxda to vyriešil posunutím HAL kamery, takže ukazuje na novú funkciu, ktorá sa vždy vráti ako „pravda“, ako keby používateľ používal kameru OnePlus – aj keď nie.
Podložka č. 2 - Zakázať QuadraCfa
Pre svoj ďalší shim musel vypnúť QuadraCfa, čo je pravdepodobne patentovaná technológia Qualcomm súvisiaca s fotoaparátom. Hovoríme pravdepodobne preto, že ani ja, ani Sultanxda si nie sme úplne istí, čo je QuadraCfa, ale Sultanxda vie, že rozbil prednú kameru vždy, keď bola povolená.
Všimol si, že QuadraCfa sa nejako aktivuje, ale nebol si istý, prečo alebo ako to robí. Riešenie si z jeho strany vyžiadalo dosť netradičnú úpravu. V konvenčnej vložke funkcia shim po zostavení poskytuje chýbajúci symbol, ktorý BLOB hľadá. V tomto prípade BLOB už mal symboly, ktoré potreboval – tie, ktoré pravdepodobne reprezentovali funkcie, ktoré spúšťali QuadraCfa.
Preto potreboval prepísať symboly používané kamerou HAL a v podstate ich urobiť „chýbajúcimi“, takže jeho vložky by poskytli tieto „chýbajúce“ symboly. Jediný spôsob, ako to urobiť, je cez hex úprava samotnej kamery HAL. Hexové úpravy sú v podstate prezeraním množstva neorganizovaných nezmyslov vo forme binárnych údajov, aby ste našli ihlu v kope sena – buď funkciu alebo reťazec, ktorý chcete upraviť.
Hexadecimálna úprava funkcie je podstatne náročnejšia ako hexová úprava reťazca, ale našťastie sa Sultanxda dokázal vyhnúť nutnosti hex upravovať funkcie za QuadraCfa namiesto toho. hexadecimálna úprava názvov symbolov, aby sa tieto symboly zrušili.
Shim #3 - Bright Light Crash Fix
Ďalej Sultanxda zistil, že fotografovanie prednou kamerou pri jasnom osvetlení by spôsobilo zrútenie fotoaparátu. S cieľom reprodukovať túto chybu na svojom vlastnom zariadení, Sultanxda v skutočnosti zapol funkciu baterky svojho OnePlus One a posvietil si na prednú kameru OnePlus 3T aby to havarovalo a produkovalo použiteľné polená! Keď zistil, aká funkcia spôsobila haváriu, vytvoril podložku, aby zariadenie prinútilo neustále používať režim slabého osvetlenia pre prednú kameru.
Podložka č. 4 - Obrázky z prednej kamery s nízkym rozlíšením
Po oprave havárie pri jasnom svetle pomocou predchádzajúcej podložky Sultanxda objavil ďalšiu chybu, ktorá v skutočnosti vznikla ako priamy dôsledok tejto podložky: obrázky prednej kamery s nízkym rozlíšením. Namiesto fotografovania v rozlíšení požadovanom používateľom (napr. 16 MP), výsledný obrázok by sa nasnímal s rozlíšením 4 MP.
Vyriešenie tohto problému si vyžadovalo podloženie funkcií handleSuperResolution
a isSuperResolution
aby sa vždy vrátila hodnota true, ale LEN vtedy, keď je aktívny predný fotoaparát (pretože inak by fotoaparát pri fotografovaní zo zadného snímača havaroval).
Ponaučenie - Shimming môže byť ťažké
Sultanxda pripúšťa, že podložky, ktoré musel vytvoriť, aby fungoval predný fotoaparát OnePlus 3T, nepredstavujú váš typický príklad podložky. Je dosť hrdý na svoju podložku vzhľadom na jej zložitosť a vzácnu potrebu upravovať samotný BLOB hex. Tento príklad však len ukazuje, aké ťažké môže byť fungovanie hardvéru fotoaparátu na určitých zariadeniach.
Nech sú vaše dobrodružstvá s fotoaparátom menej bolestivé ako tie moje. -Sultanxda
Denníky, denníky a ďalšie denníky. Bez konzistentného spôsobu reprodukcie zlyhania a bez protokolov majú vývojári malú nádej na nájdenie zdroja problému. Aj keď zistia, čo spôsobuje problém, nie je to vždy jednoduché riešenie. Celý proces hľadania a odstraňovania týchto chýb môže trvať niekoľko dní alebo týždňov a je dôvodom, prečo je oprava fotoaparátu na AOSP ROM jednou z náročnejších úloh.
Ak má vaše zariadenie portovanú AOSP ROM s plne funkčným hardvérom, dúfajme, že môžete začať oceňte boj, ktorým mohli títo vývojári prejsť, aby vám ich priniesli Vlastnosti. Oceňujte ich za ich prácu, pretože to nie je ľahké. Je to veľa práce, ktorú si drvivá väčšina používateľov ani nevšimne, keďže o mnohé nevídané časti Androidu sa starajú talentovaní vývojári na našich fórach.
Chceli by sme sa špeciálne poďakovať Sultanxdovi za mnohé príspevky, ktoré navrhol pri tvorbe tohto článku.