Kameros tinkintuose ROM: kaip kūrėjai užtikrina, kad aparatinė įranga veiktų be šaltinio kodo

Kaip kūrėjai be šaltinio kodo gali gauti techninės įrangos komponentus, pvz., fotoaparatus, veikiančius pasirinktiniuose ROM? Atsakymas yra BLOB, tarpiklis ir daug derinimo.

Išleidus „Android Oreo“ ir daugelį įrenginių, tokių kaip Xiaomi Redmi Note 3, Google Nexus 5 ir kiti ją gauna neoficialiai, tikriausiai verta stebėtis, kodėl tos pačios funkcijos (dažniausiai fotoaparatas) dažniausiai sugenda, kai kūrėjai perkelia „Android Open Source Project“ (AOSP) pagrįstą ROM. Tikriausiai matėte XDA forumo ROM gijas su ilgu sugedusių funkcijų sąrašu. „Kas veikia“, po kurio seka veikiančių funkcijų sąrašas, o apačioje – ikoninis „Kas neveikia? Tu man pasakyk!" yra du populiarūs mūsų forumų susitraukimai, kurie praktiškai tapo memu tokiose vietose kaip Reddit ir Twitter.

Kodėl tiek daug funkcijų sugenda, kai kūrėjas bando prijungti AOSP ROM į savo įrenginį? Pagrindinis atsakymas yra tas, kad skirtingose ​​„Android“ versijose funkcijos keičiasi, todėl senos įrenginių tvarkyklės, supakuotos kaip BLOB, neveiks su naujesnėmis „Android“ versijomis ar net tik su atsargine AOSP. Siekdami tai įveikti, kūrėjai naudoja vadinamąjį „tarpiklį“, tačiau procesas yra sudėtingas, reikalauja daug laiko ir kartais labai sunku derinti.

Šiame straipsnyje apžvelgsime, kaip veikia tarpinės, ypač atsižvelgiant į tai, kad fotoaparatas tinkamai veiktų AOSP pagrįstuose ROM. Kaip pavyzdį naudosime „OnePlus 3T“. Atminkite, kad sunkumai, susiję su šių funkcijų veikimu, labai priklauso nuo įrenginio.

„OnePlus 3T“, kuriame veikia „OxygenOS“. Nors „OnePlus“ telefonai yra žinomi dėl patogumo kurti, kūrėjai atlieka daug darbo užkulisiuose, kad sukurtų stabilius AOSP prievadus.


Kas yra tarpiklis arba BLOB?

Kad net pradėtume suprasti dalį to, ką kūrėjai daro, pirmiausia turime paaiškinti keletą dalykų. Nors „Android“ OS yra atvirojo kodo (ji ne veltui vadinama „Android Open Source Project“), programinė įranga (be branduolio), siunčiama tūkstančiuose „Android“ įrenginių, nėra tokia. Kūrėjai neturi prieigos prie šaltinio kodo Samsung patirtis, EMUI, OxygenOS, arba bet kuri kita trečiųjų šalių „Android“ versija.

Dabar kūrėjams, perkeliantiems atsargines AOSP į ne „Google“ įrenginį, tikriausiai nerūpi šių „Android“ apvalkalų šaltinio kodas, nes jie nebus tokie. modifikuoti ir kurti šiuos ROM. Tai būtų tiesa, jei ne dėl vienos didelės, didelės priežasties: visų pirma reikalingų dalių, kad fotoaparatas tinkamai veiktų į fotoaparatas HAL (Aparatinės įrangos abstrakcijos sluoksnis), yra taip pat uždaras šaltinis.

Ne tik kameros HAL, bet ir ROM uždarojo šaltinio problema yra ta, kad kūrėjai, dirbantys perkeldami AOSP į savo įrenginį, bus dirbantis aklas. Uždaro šaltinio OĮG ROM gali puikiai susieti su fotoaparato HAL, nes OĮG turi prieigą prie fotoaparato HAL šaltinio. Kamera HAL leidžia ROM „kalbėtis“ su fotoaparato aparatine įranga – be jos kamera neveiktų. Pagalvokite apie fotoaparatą HAL kaip apie automobilio vairą ir pedalus. Vairas / pedalai leidžia valdyti vidinius transporto priemonės komponentus, suteikiant vairuotojui išorinę sąsają (ROM), kad galėtų naudotis vidiniais komponentais.

Grafika, rodanti fotoaparato architektūrą. Šaltinis: Google

Kadangi fotoaparato aparatinė įranga tampa vis sudėtingesnė ( dvigubų kamerų atsiradimasPavyzdžiui), turint prieigą prie kameros HAL šaltinio, AOSP ROM perkėlimas su funkcine kamera būtų daug lengvesnis.

Tačiau originalios įrangos gamintojai nesuteikia prieigos prie fotoaparato HAL šaltinio dėl įvairių priežasčių. Pirma, jei jie neturi visų nuosavybės teisių į fotoaparatą HAL (pvz., kai įtraukia kitų įmonių intelektinę nuosavybę), jie negali platinti šaltinio. Antra, fotoaparato HAL šaltinio išleidimas gali kelti pavojų jų pačių intelektinei nuosavybei. Galiausiai, įmonės neprivalo pateikti šio šaltinio kodo (skirtingai nuo branduolio šaltinio kodo, kuris jos yra). įpareigotas išleisti pagal GPL), todėl jie neturi paskatų jo išleisti. Taigi, be prieigos prie fotoaparato HAL šaltinio, kaip kūrėjai gali priversti kamerą veikti AOSP ROM? Atsakymas yra BLOB, tarpiklis ir daug, daug derinimo.

Įrenginys BLOBAS (Binary Large OBject) yra iš anksto supakuoti dvejetainiai failai, kurie yra sudaryta programinės įrangos forma. Šiuo atveju fotoaparato HAL šaltinį sukompiliuoja OĮG ir į įrenginius pristato kaip dvejetainį failą. Kai kūrėjai kalba apie BLOB, jie nurodo tuos dvejetainius failus, kurie siunčiami tiesioginiuose įrenginiuose, kuriuos jie gali išgauti. Dabar yra „kameros BLOB“ tema ilgai kankino OnePlus daugelį mėnesių, tačiau tiesa ta, kad kūrėjai visada turėjo prieigą prie fotoaparato BLOB. The fotoaparato HAL šaltinio kodas yra auksinis bilietas kūrėjams čia, bet tai bus niekada, niekada nebus paleistas dėl teisinio pavojaus tai įtrauktų tokias įmones kaip „OnePlus“.

Taigi kūrėjams, norintiems įrenginyje įdiegti AOSP, lieka tik kameros HAL BLOB, kurių šaltinio kodo jie neturi. Retai kada nors kūrėjas gali susieti savo AOSP ROM kodą su fotoaparatu HAL BLOB ir tikėtis, kad jis veiks, todėl norėdami užpildyti atotrūkį tarp jų, kūrėjai sukuria vadinamąjį „tarpiklis.”

„Smulkinti“ reiškia „įkalti (kažką) arba užpildyti erdvę“. Tai iš tikrųjų yra tai, ką kūrėjas daro kada rašydami tarpinį kodą – jie prideda kodą, kad BLOB galėtų susieti su jų naudojamu AOSP šaltinio kodu su. Plokštelės naudojamos tam, kad visų rūšių BLOB dirbtų su AOSP, tačiau dažniausiai būtent fotoaparato BLOB reikia labiausiai blizginti. Kaip minėjome anksčiau, keitimas reikalingas ne tik naujesnėms „Android“ versijoms perkeliant į įrenginį (pvz., visi tie neoficialūs Android Oreo ROM), bet taip pat reikalingi, kai į jį perkeliama tos pačios Android versijos AOSP prietaisas.

Rekomenduojama literatūra: Iš parduotuvės į lentyną: nuodugnus paaiškinimas, kodėl MSM8974 įrenginiai neįtraukti į Nugos

Pavyzdžiui, „OnePlus 2“ jį gavo paskutinis oficialus pagrindinis OS atnaujinimas Android 6.0 Marshmallow forma. Tačiau prietaisas iš tikrųjų turi pilnai veikiantys pasirinktiniai AOSP pagrįsti ROM pagrįsta „Android Nougat“, ir tai yra dėka sunkaus kūrėjų darbo ir jų tarpiklių. Išskaidysime kai kuriuos tarpiklių pavyzdžius, bet pirmiausia turime pakalbėti apie tai, kaip tiksliai veikia tarpikliai.


Kaip veikia blizginimas?

Kadangi kūrėjai neturi prieigos prie fotoaparato HAL arba OEM ROM šaltinio (ir tik iš anksto sukompiliuotų dvejetainių failų), jie negali žinoti, kokių funkcijų kamera HAL tikisi. Dėl šios priežasties dažnai nesutampa funkcijos, kurios ieško HAL fotoaparatas, ir tikrojo funkcijos pavadinimo AOSP kode, su kuriuo kūrėjas dirba.

Norėdami išspręsti šią problemą, kūrėjas tiesiog sukuria naują funkciją, kuri naudoja tą patį pavadinimą funkcija, kurios tikisi fotoaparatas HAL BLOB, tačiau ši nauja funkcija tiesiog vykdo tai, ko nori kūrėjas tai prie. Ši nauja funkcija, veikianti kaip tarpininkas tarp BLOB ir AOSP, yra tarpiklis. Šis konkretus scenarijus, kai BLOB neranda ieškomos funkcijos, yra vienas iš labiausiai paplitusių scenarijų, kai reikia tarpiklio.

Labai paprasta MS dažų schema, rodanti, kur reikia tarpiklio.

Galbūt viskas bus šiek tiek prasmingesnė su hipotetiniu pavyzdžiu, susijusiu su „OnePlus 3T“. Sukursime pavyzdį naudodami OxygenOS ir OnePlus kamerą. Jei naudosime fotoaparato BLOB, paimtus iš „OxygenOS Nougat“, skirtą „OnePlus 3T“, kad sukurtume AOSP pagrįstą „Nougat“ ROM, gali kilti problemų. Taip yra todėl, kad fotoaparato BLOB (kuriuos iš pradžių sudarė OĮG) galės nurodyti visas jai reikalingas „OxygenOS“ funkcijas, tačiau kadangi Sukompiliuota AOSP ROM gali neturėti tų funkcijų arba gali būti sukompiliuota kitu pavadinimu (todėl funkcijų simboliai nesutampa), bus klaida. Tai galima išspręsti sukūrus naują funkciją AOSP ROM pavadinimu, kurio tikisi BLOB – mūsų tarpiklis.

Simboliai programavimo kontekste naudojami nurodyti konkrečias kodo funkcijas. Simboliai būtini, nes redaguojant kodą funkcijos padėtis gali pasikeisti, taigi, kad būtų išvengta kodavimo. nuorodų į funkcijas, kompiliatorius sukuria simbolių lentelę, kurią kitos funkcijos gali naudoti norėdami visada nurodyti dešinę funkcija. Kai prieš kompiliavimą pakeičiate funkcijos pavadinimą, pasikeičia ir jos simbolis, taigi iš esmės pasikeičia visi kurį OĮG sukuria fotoaparato HAL šaltiniui prieš kompiliavimą, kūrėjai turės sukurti naują tarpiklis.

Simbolių lentelės peržiūra su bunkeriu. Šaltinis: Aprioritas

Iš paaiškinimo, kurį iki šiol siūlėme, atrodo, kad tarpiklius sukurti lengva. Pakeisti keletą funkcijų pavadinimų čia ir ten neskamba per sunku, tiesa? Jei tik tai būtų taip lengva. Tinklų realybė apima ne tik funkcijų pervardijimą. Kalbėjomės su XDA pripažintu kūrėju Sultanxda, kuris galėjo mums pateikti vienos iš sudėtingesnių tarpiklių, prie kurių jis dirbo, pavyzdį.


Shimming – ne taip paprasta, kaip atrodo

Tiems, kurie nėra susipažinę su „OnePlus 3T“, priekinė kamera iš pradžių buvo sugedusi. AOSP pagrįsti pasirinktiniai ROM. Iš pradžių bandant padaryti bet kokią nuotrauką, didesnę nei 8 MP, rezultatas būtų griūva. Bandydamas išspręsti šią problemą, Sultanxda padarė keletą tarpikliai kad „OnePlus 3T“ priekinė kamera tinkamai veiktų.

1 tarpiklis – fotoaparato paketo pavadinimo keitimas

Siekdama, kad priekinė kamera nesudužtų, kai vartotojas nufotografavo daugiau nei 8 MP, Sultanxda privertė fotoaparatą HAL identifikuoti visas kameras kaip „OnePlus“ kamerą. Taip daroma, nes „OnePlus“ nusprendė tam tikroms programoms skirti pagalbinę funkciją (isOnePlusCamera, isFacebookCamerair pan.) dėl tam tikrų priežasčių. Sultanxda tai ištaisė aptaisydama kamerą HAL, kad ji nukreiptų į naują funkciją, kuri visada grąžina „true“, tarsi vartotojas naudotų „OnePlus“ kamerą, net kai jos nenaudoja.

2 tarpiklis – išjungti QuadraCfa

Kitam tarpikliui jis turėjo išjungti QuadraCfa, kuri tikriausiai yra patentuota Qualcomm technologija, susijusi su fotoaparatu. Sakome tikriausiai todėl, kad nei aš, nei „Sultanxda“ nesame tiksliai tikri, kas yra „QuadraCfa“, tačiau „Sultanxda“ žino, kad sulaužė priekinę kamerą, kai tik buvo įjungta.

Jis pastebėjo, kad „QuadraCfa“ kažkaip įgalins save, tačiau nebuvo tikras, kodėl ir kaip tai daro. Norėdami tai išspręsti, iš jo pusės reikėjo gana netradicinės modifikacijos. Įprastoje tarpinėje tarpiklio funkcija, kai ji yra sudaryta, pateikia trūkstamą simbolį, kurio ieško BLOB. Šiuo atveju BLOB jau turėjo reikiamus simbolius – tuos, kurie, tikėtina, reprezentavo funkcijas, kurios paleido QuadraCfa.

Palaimink Hex redaktorių. Naudota programa Sultanxda.

Taigi jam reikėjo nepaisyti fotoaparato HAL naudojamų simbolių ir iš esmės padaryti juos „trūksta“, kad jo tarpikliai pateiktų tuos „trūkstamus“ simbolius. Vienintelis būdas tai padaryti yra per šešioliktainis pačios kameros HAL redagavimas. Šešioliktainis redagavimas iš esmės yra neorganizuotas blevyzgas dvejetainių duomenų pavidalu, siekiant rasti adatą šieno kupetoje – funkciją arba eilutę, kurią norite redaguoti.

Šešioliktainis funkcijos redagavimas yra daug sunkesnis nei šešioliktainis redaguoti eilutę, bet, laimei, Sultanxda sugebėjo išvengti šešioliktainio režimo redagavimo už QuadraCfa funkcijų. šešioliktainis simbolių pavadinimų redagavimas, kad šie simboliai būtų anuliuoti.

3 tarpiklis – ryškiai šviesus smūgio pataisymas

Toliau Sultanxda nustatė, kad fotografuojant iš priekinės kameros esant ryškiam apšvietimui, fotoaparatas sudužtų. Siekdamas atkurti šią klaidą savo įrenginyje, Sultanxda iš tikrųjų įjungė savo OnePlus One žibintuvėlio funkciją ir apšvietė šviesą priešais OnePlus 3T priekinę kamerą kad jis sudužtų ir pagamintų tinkamus rąstus! Sužinojęs, kokia funkcija sukėlė avariją, jis sukūrė tarpiklį, kad priverstų įrenginį visą laiką naudoti silpno apšvietimo režimą priekinei kamerai.

4 tarpiklis – mažos raiškos priekinės kameros nuotraukos

Ištaisius ryškios šviesos gedimą ankstesne tarpine, Sultanxda aptiko dar vieną klaidą, kuri iš tikrųjų atsirado dėl tiesioginio šio tarpiklio: mažos raiškos priekinės kameros nuotraukos. Užuot fotografavęs naudotojo pageidaujama raiška (pvz., 16 MP), gautas vaizdas būtų nufotografuotas 4 MP.

Norint tai išspręsti, reikėjo, kad jis pakeistų funkcijas handleSuperResolution ir isSuperResolution kad visada būtų teisinga, bet TIK tada, kai aktyvi priekinė kamera (nes priešingu atveju fotoaparatas sudužtų fotografuojant iš galinio jutiklio).


Išmokta pamoka – švytėjimas gali būti sunkus

Sultanxda pripažįsta, kad tarpinės, kurias jis turėjo sukurti, kad „OnePlus 3T“ priekinė kamera veiktų, nėra tipiškas tarpiklio pavyzdys. Jis gana didžiuojasi savo tarpikliu, atsižvelgiant į jo sudėtingumą ir retą būtinybę šešioliktaiškai redaguoti patį BLOB. Tačiau šis pavyzdys tik parodo, kaip sunku gali būti, kad fotoaparato aparatinė įranga veiktų tam tikruose įrenginiuose.

Tegul jūsų nuotykiai su fotoaparatu bus mažiau skausmingi nei mano. -Sultanxda

Rąstai, rąstai ir dar daugiau rąstų. Neturėdami nuoseklaus būdo atkurti avariją ir be žurnalų, kūrėjai turi mažai vilčių rasti problemos šaltinį. Net jei jie randa problemos priežastį, tai ne visada yra paprastas sprendimas. Visas šių klaidų radimo ir pašalinimo procesas gali užtrukti kelias dienas ar savaites, todėl fotoaparato taisymas AOSP ROM yra viena iš sunkesnių užduočių.

Jei jūsų įrenginyje yra AOSP ROM su visiškai veikiančia aparatūra, tikimės, kad galėsite pradėti vertiname kovą, kurią galėjo išgyventi tie kūrėjai, kad juos pristatytų funkcijos. Įvertinkite juos už jų darbą, nes tai nėra lengva. Tai daug darbo, kurio didžioji dauguma vartotojų net nepastebės, nes talentingi kūrėjai mūsų forumuose rūpinasi daugybe nematytų Android dalių.

Norėtume ypač padėkoti Sultanxda už daugybę indėlių, kuriuos jis pasiūlė rengiant šį straipsnį.