Kamera di ROM Kustom: Bagaimana Pengembang Membuat Perangkat Keras Bekerja tanpa Kode Sumber

Tanpa kode sumber, bagaimana cara pengembang membuat komponen perangkat keras seperti kamera berfungsi di ROM khusus? Jawabannya adalah BLOB, shim, dan banyak debugging.

Dengan dirilisnya Android Oreo dan banyak perangkat seperti Xiaomi Redmi Catatan 3, Google Perhubungan 5 Dan yang lain secara tidak resmi menerimanya, mungkin wajar untuk bertanya-tanya mengapa fitur yang sama (kebanyakan kamera) cenderung rusak ketika pengembang mem-porting ROM berbasis Android Open Source Project (AOSP). Anda mungkin pernah melihat rangkaian ROM di forum XDA dengan daftar panjang fitur rusak di bagian atas. “Apa yang berhasil” diikuti dengan daftar fitur yang berfungsi, lalu di bawahnya terdapat ikon “Apa yang tidak berhasil? Kamu beritahu aku!" adalah dua refrain populer di forum kami yang praktis menjadi meme di tempat-tempat seperti Reddit dan Twitter.

Mengapa begitu banyak fungsi yang rusak setiap kali pengembang mencoba mem-porting ROM AOSP ke perangkat mereka? Jawaban dasarnya adalah karena fungsi berubah di berbagai versi Android, driver perangkat lama yang dikemas sebagai BLOB tidak akan berfungsi dengan versi Android yang lebih baru, atau bahkan hanya dengan AOSP bawaan. Untuk mengatasinya, pengembang menggunakan apa yang disebut “shim”, namun prosesnya rumit, memakan waktu, dan terkadang sangat sulit untuk di-debug.

Pada artikel ini, kami akan menguraikan cara kerja shim, terutama yang berkaitan dengan membuat kamera berfungsi dengan baik pada ROM berbasis AOSP. Kami akan menggunakan OnePlus 3T sebagai contoh. Perhatikan bahwa kesulitan dalam membuat fitur ini berfungsi sangat spesifik pada perangkat.

OnePlus 3T Menjalankan OxygenOS. Meskipun ponsel OnePlus terkenal dengan kemudahan pengembangan kustomnya, ada banyak pekerjaan yang dilakukan pengembang di belakang layar untuk membuat port AOSP stabil.


Apa itu shim atau BLOB?

Untuk mulai memahami sebagian dari apa yang dilakukan pengembang, pertama-tama kita perlu menjelaskan beberapa hal. Meskipun OS Android bersifat open source (disebut Proyek Open Source Android karena suatu alasan), perangkat lunak (tanpa kernel) yang dikirimkan pada ribuan perangkat Android tidaklah open source. Pengembang tidak memiliki akses ke kode sumber Pengalaman Samsung, EMUI, oksigenOS, atau varian Android pihak ketiga lainnya.

Sekarang, pengembang yang mem-porting stok AOSP ke perangkat non-Google mungkin tidak peduli dengan kode sumber skin Android ini karena mereka tidak akan peduli dengan kode sumber tersebut. memodifikasi dan membangun ROM ini. Itu benar, jika bukan karena satu alasan yang sangat besar: terutama bagian-bagian yang diperlukan agar kamera berfungsi dengan baik itu kamera HAL (Lapisan Abstraksi Perangkat Keras), adalah juga sumber tertutup.

Masalah dengan tidak hanya memiliki kamera HAL tetapi juga ROM sumber tertutup adalah bahwa pengembang yang berupaya mem-porting AOSP ke perangkat mereka akan kesulitan. bekerja buta. ROM OEM sumber tertutup dapat berinteraksi dengan kamera HAL dengan baik karena OEM memiliki akses ke sumber HAL kamera. Kamera HAL memungkinkan ROM untuk “berbicara” dengan perangkat keras kamera—tanpanya, kamera tidak akan berfungsi. Bayangkan kamera HAL sebagai roda kemudi dan pedal mobil. Roda kemudi/pedal memungkinkan pengendalian komponen internal kendaraan dengan menyediakan antarmuka eksternal bagi pengemudi (ROM) untuk menggunakan komponen internal.

Grafik menunjukkan arsitektur kamera. Sumber: Google

Ketika perangkat keras kamera menjadi semakin kompleks (the munculnya kamera ganda, misalnya), memiliki akses ke sumber HAL kamera akan membuat porting ROM AOSP dengan kamera fungsional menjadi lebih mudah.

Namun, OEM tidak menyediakan akses ke sumber HAL kamera karena berbagai alasan. Pertama, jika mereka tidak memiliki seluruh hak kepemilikan atas kamera HAL (seperti ketika mereka menggabungkan kekayaan intelektual dari perusahaan lain), maka mereka tidak dapat mendistribusikan sumbernya. Kedua, melepaskan sumber kamera HAL dapat membahayakan kekayaan intelektual mereka sendiri. Terakhir, perusahaan tidak mempunyai kewajiban hukum untuk menyediakan kode sumber ini (tidak seperti kode sumber kernel mereka wajib dirilis di bawah GPL), sehingga mereka tidak mempunyai insentif untuk melepaskannya. Jadi tanpa akses ke sumber HAL kamera, bagaimana tepatnya pengembang membuat kamera bekerja pada ROM AOSP? Jawabannya adalah BLOB, shim, dan banyak sekali debugging.

Sebuah alat GUMPAL (Binary Large OBject) berisi binari yang telah dikemas sebelumnya yang merupakan bentuk perangkat lunak yang dikompilasi. Dalam hal ini, sumber HAL kamera dikompilasi oleh OEM dan dikirimkan pada perangkat sebagai biner. Ketika pengembang berbicara tentang BLOB, yang mereka maksud adalah biner yang dikirimkan pada perangkat langsung yang dapat mereka ekstrak. Sekarang, topik “BLOB kamera” telah muncul sudah lama menjangkiti OnePlus selama berbulan-bulan, namun kenyataannya adalah pengembang selalu memiliki akses ke BLOB kamera. Itu kode sumber kamera HAL adalah tiket emas untuk pengembang di sini, tapi itu akan terjadi tidak akan pernah dilepaskan karena bahaya hukum, hal ini akan melibatkan perusahaan seperti OnePlus.

Oleh karena itu, pengembang yang ingin menghadirkan AOSP ke perangkat hanya memiliki BLOB kamera HAL yang kode sumbernya tidak dapat mereka akses. Jarang sekali pengembang dapat memasangkan kode ROM AOSP mereka dengan kamera HAL BLOB dan mengharapkannya berfungsi, jadi untuk menjembatani kesenjangan antara keduanya, pengembang membuat apa yang disebut “shim.”

Untuk "shim" berarti "mengganjal (sesuatu) atau mengisi ruang." Ini secara efektif adalah apa yang dilakukan pengembang menulis shim—mereka menambahkan kode untuk memungkinkan BLOB berinteraksi dengan kode sumber AOSP yang sedang mereka kerjakan dengan. Shim digunakan untuk membuat semua jenis BLOB bekerja dengan AOSP, namun biasanya, BLOB kameralah yang paling memerlukan shimming. Seperti yang kami sebutkan sebelumnya, shimming diperlukan tidak hanya untuk mem-porting versi Android yang lebih baru ke perangkat (seperti semua ROM Android Oreo tidak resmi) tetapi juga diperlukan saat mem-porting AOSP versi Android yang sama ke dalamnya perangkat.

Bacaan yang Direkomendasikan: Dari Toko ke Rak: Kapitulasi Mendalam tentang Mengapa Perangkat MSM8974 Dikecualikan dari Nougat

OnePlus 2, misalnya, menerimanya pembaruan OS besar resmi terakhir berupa Android 6.0 Marshmallow. Namun, perangkat tersebut sebenarnya memilikinya ROM berbasis AOSP kustom yang berfungsi penuh berbasis Android Nougat, dan itu berkat kerja keras para pengembang dan perangkat mereka. Kita akan menguraikan beberapa contoh shim, tetapi pertama-tama, kita perlu membahas tentang cara kerja shim.


Bagaimana cara kerja shiming?

Karena pengembang tidak memiliki akses ke sumber HAL kamera atau ROM OEM (dan hanya biner yang telah dikompilasi), mereka tidak dapat mengetahui fungsi apa yang diharapkan dari kamera HAL. Oleh karena itu, sering kali terdapat ketidakcocokan antara nama fungsi yang dicari oleh kamera HAL dan nama sebenarnya dari fungsi dalam kode AOSP yang sedang dikerjakan oleh pengembang.

Untuk mengatasi masalah ini, pengembang cukup membuat fungsi baru yang menggunakan nama yang sama fungsi yang diharapkan oleh kamera HAL BLOB, tetapi fungsi baru ini hanya menjalankan apa yang diinginkan pengembang untuk. Fungsi baru yang bertindak sebagai perantara antara BLOB dan AOSP adalah shim. Skenario khusus di mana BLOB gagal menemukan fungsi yang dicarinya adalah salah satu skenario paling umum yang memerlukan shim.

Diagram cat MS yang sangat sederhana menunjukkan di mana shim diperlukan.

Mungkin segalanya akan lebih masuk akal dengan contoh hipotetis yang melibatkan OnePlus 3T. Kami akan membuat contoh menggunakan OxygenOS dan kamera OnePlus. Jika kami menggunakan BLOB kamera yang diambil dari OxygenOS Nougat untuk OnePlus 3T guna membuat ROM Nougat berbasis AOSP, kami mungkin mengalami masalah. Hal ini karena BLOB kamera (yang awalnya dikompilasi oleh OEM) akan dapat mereferensikan semua fungsi yang diperlukan dalam OxygenOS, tetapi sejak itu ROM AOSP yang dikompilasi mungkin tidak memiliki fungsi-fungsi tersebut atau mungkin telah mengkompilasinya dengan nama yang berbeda (sehingga menyebabkan ketidakcocokan antar simbol fungsi), akan ada kesalahan. Hal ini dapat diperbaiki dengan membuat fungsi baru dalam ROM AOSP dengan nama yang diharapkan BLOB—shim kita.

Simbol dalam konteks pemrograman digunakan untuk merujuk pada fungsi tertentu dalam kode. Simbol diperlukan karena posisi suatu fungsi dapat berubah ketika kode diedit, dan juga untuk menghindari hardcoding referensi ke fungsi, kompiler membuat tabel simbol yang dapat digunakan fungsi lain agar selalu merujuk ke kanan fungsi. Saat Anda mengubah nama suatu fungsi sebelum kompilasi, simbolnya juga berubah, jadi pada dasarnya semua perubahan yang dibuat oleh OEM ke sumber HAL kamera sebelum kompilasi akan mengharuskan pengembang untuk membuat yang baru shim.

Melihat Tabel Simbol dengan Hopper. Sumber: Prioritas

Penjelasan yang kami sampaikan sejauh ini membuat sepertinya membuat shim itu mudah. Mengubah beberapa nama fungsi di sana-sini kedengarannya tidak terlalu sulit, bukan? Andai saja semudah itu. Realitas shim melibatkan lebih dari sekedar penggantian nama fungsi. Kami berbicara dengan Pengembang Ternama XDA, Sultanxda, yang dapat memberi kami contoh salah satu shim tersulit yang pernah ia kerjakan.


Shimming - Tidak Semudah Kedengarannya

Bagi mereka yang tidak terbiasa dengan OnePlus 3T, kamera depannya agak rusak pada awalnya ROM khusus berbasis AOSP. Pertama-tama, mencoba mengambil gambar apa pun di atas 8MP akan menghasilkan hasil jatuh. Dalam upayanya mengatasi masalah ini, Sultanxda melakukan beberapa hal shim untuk memungkinkan kamera depan OnePlus 3T berfungsi dengan baik.

Shim #1 - Mengubah Nama Paket Kamera

Untuk menghentikan kamera depan agar tidak mogok setiap kali pengguna mengambil gambar di atas 8MP, Sultanxda memaksa kamera HAL untuk mengidentifikasi semua kamera sebagai kamera OnePlus. Hal ini dilakukan karena OnePlus memutuskan untuk mendedikasikan fungsi pembantu untuk aplikasi tertentu (isOnePlusCamera, isFacebookCamera, dll.) karena alasan tertentu. Sultanxda memperbaikinya dengan menggeser kamera HAL sehingga menunjuk ke fungsi baru yang selalu mengembalikan nilai "true" seolah-olah pengguna menggunakan kamera OnePlus—meskipun sebenarnya tidak.

Shim #2 - Nonaktifkan QuadraCfa

Untuk shim berikutnya, ia harus menonaktifkan QuadraCfa yang mungkin merupakan teknologi milik Qualcomm yang berkaitan dengan kamera. Kami mengatakan mungkin karena baik saya maupun Sultanxda tidak yakin apa itu QuadraCfa, namun Sultanxda tahu bahwa itu merusak kamera depan setiap kali diaktifkan.

Dia mengamati bahwa QuadraCfa entah bagaimana akan mengaktifkan dirinya sendiri, tapi dia tidak yakin mengapa atau bagaimana hal itu terjadi. Untuk mengatasi hal ini diperlukan modifikasi yang agak tidak konvensional di pihaknya. Dalam shim konvensional, fungsi shim, ketika dikompilasi, memberikan simbol yang hilang yang dicari BLOB. Dalam hal ini, BLOB telah mempunyai simbol-simbol yang diperlukan—simbol-simbol yang mungkin mewakili fungsi-fungsi yang memulai QuadraCfa.

Memberkati Editor Hex. Program yang digunakan Sultanxda.

Oleh karena itu, dia perlu mengganti simbol-simbol yang digunakan oleh kamera HAL dan intinya, membuatnya “hilang”. miliknya shims akan memberikan simbol-simbol yang “hilang” tersebut. Satu-satunya cara untuk melakukannya adalah melalui hex mengedit kamera HAL itu sendiri. Pengeditan hex pada dasarnya menelusuri sekumpulan omong kosong yang tidak terorganisir dalam bentuk data biner untuk menemukan jarum di tumpukan jerami—baik fungsi atau string yang ingin Anda edit.

Mengedit fungsi secara hex jauh lebih sulit daripada mengedit string secara hex, namun untungnya, Sultanxda mampu menghindari keharusan melakukan hex mengedit fungsi di belakang QuadraCfa dengan melakukannya hex mengedit nama simbol untuk membatalkan simbol tersebut.

Shim #3 - Perbaikan Kerusakan Cahaya Terang

Selanjutnya, Sultanxda mengidentifikasi bahwa mengambil gambar dari kamera depan dalam kondisi pencahayaan terang akan menyebabkan kamera mogok. Untuk mereproduksi bug ini di perangkatnya sendiri, Sultanxda sebenarnya menyalakan fungsi senter OnePlus One miliknya dan menyinari lampu di depan kamera depan OnePlus 3T untuk membuatnya mogok dan menghasilkan log yang dapat digunakan! Begitu dia mengetahui fungsi apa yang menyebabkan crash, dia membuat shim untuk memaksa perangkat menggunakan mode cahaya rendah sepanjang waktu untuk kamera depan.

Shim #4 - Gambar Kamera Depan Resolusi Rendah

Setelah memperbaiki kerusakan cahaya terang pada shim sebelumnya, Sultanxda menemukan bug lain yang sebenarnya muncul sebagai akibat langsung dari shim tersebut: gambar kamera depan beresolusi rendah. Daripada mengambil gambar pada resolusi yang diminta pengguna (mis. 16MP), gambar yang dihasilkan akan diambil pada 4MP.

Untuk memecahkan masalah ini, dia harus mengubah fungsinya handleSuperResolution Dan isSuperResolution untuk selalu mengembalikan nilai true, namun HANYA bila kamera depan aktif (karena jika tidak, kamera akan mogok saat mengambil gambar dari sensor belakang).


Pelajaran yang Dipetik - Shimming bisa jadi Sulit

Sultanxda mengakui bahwa shim yang harus dia buat agar kamera depan OnePlus 3T berfungsi tidak mewakili contoh shim yang biasa Anda gunakan. Dia agak bangga dengan shimnya mengingat kerumitannya dan jarangnya diperlukan untuk mengedit BLOB itu sendiri. Namun contoh ini hanya menunjukkan betapa sulitnya membuat perangkat keras kamera berfungsi pada perangkat tertentu.

Semoga petualangan shim kamera Anda tidak terlalu menyakitkan dibandingkan petualangan saya. -Sultanxda

Log, log, dan log lainnya. Tanpa cara yang konsisten untuk mereproduksi kerusakan dan tanpa log, kecil harapan pengembang untuk menemukan sumber masalahnya. Meskipun mereka berhasil menemukan penyebab masalahnya, perbaikannya tidak selalu mudah. Seluruh proses untuk menemukan dan memberantas bug ini dapat memakan waktu berhari-hari atau berminggu-minggu dan merupakan alasan mengapa memperbaiki kamera pada ROM AOSP adalah salah satu tugas yang lebih sulit.

Jika perangkat Anda memiliki ROM AOSP yang di-porting dengan perangkat keras yang berfungsi penuh, semoga Anda dapat memulainya hargai perjuangan yang mungkin telah dilalui oleh para pengembang tersebut untuk memberikannya kepada Anda fitur. Hargai mereka atas pekerjaannya, karena itu tidak mudah. Ini merupakan pekerjaan berat yang sebagian besar pengguna bahkan tidak menyadarinya, karena pengembang berbakat di forum kami menangani banyak bagian Android yang tidak terlihat.

Kami ingin mengucapkan terima kasih yang sebesar-besarnya kepada Sultanxda atas banyak kontribusi yang disarankannya dalam pembuatan artikel ini.