Lapisan abstraksi perangkat keras kamera (HAL) Android menghubungkan API framework kamera tingkat yang lebih tinggi di Kamera 2 ke driver dan perangkat keras kamera yang mendasarinya. Subsistem kamera mencakup implementasi untuk komponen saluran kamera sementara kamera HAL menyediakan antarmuka untuk digunakan dalam mengimplementasikan versi komponen ini.
Arsitektur
Gambar dan daftar berikut menjelaskan komponen HAL.
- kerangka aplikasi
- Pada tingkat kerangka aplikasi terdapat kode aplikasi, yang menggunakan API Kamera 2 untuk berinteraksi dengan perangkat keras kamera. Secara internal, kode ini memanggil antarmuka Binder yang sesuai untuk mengakses kode asli yang berinteraksi dengan kamera.
- AIDL
- Antarmuka pengikat yang terkait dengan
CameraService
dapat ditemukan di frameworks/av/camera/aidl/android/hardware . Kode yang dihasilkan memanggil kode asli tingkat bawah untuk mendapatkan akses ke kamera fisik dan mengembalikan data yang digunakan untuk membuat objekCameraDevice
dan akhirnyaCameraCaptureSession
di tingkat kerangka kerja. - kerangka asli
- Kerangka kerja yang berada di
frameworks/av/
ini menyediakan setara asli dengan kelasCameraDevice
danCameraCaptureSession
. Lihat juga referensi kamera2 NDK . - antarmuka IPC pengikat
- Antarmuka pengikat IPC memfasilitasi komunikasi melalui batas-batas proses. Ada beberapa kelas pengikat kamera yang terletak di direktori
frameworks/av/camera/camera/aidl/android/hardware
yang memanggil layanan kamera.ICameraService
adalah antarmuka ke layanan kamera;ICameraDeviceUser
adalah antarmuka ke perangkat kamera tertentu yang dibuka; danICameraServiceListener
danICameraDeviceCallbacks
masing-masing merupakan panggilan balikCameraService
danCameraDevice
ke kerangka aplikasi. - layanan kamera
- Layanan kamera, yang terletak di
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, adalah kode sebenarnya yang berinteraksi dengan HAL. - HAL
- Lapisan abstraksi perangkat keras mendefinisikan antarmuka standar yang digunakan oleh layanan kamera dan yang harus Anda terapkan agar perangkat keras kamera Anda berfungsi dengan benar.
Melaksanakan HAL
HAL berada di antara driver kamera dan framework Android tingkat tinggi dan mendefinisikan antarmuka yang harus Anda terapkan agar aplikasi dapat mengoperasikan perangkat keras kamera dengan benar. Antarmuka HIDL untuk Kamera HAL ditentukan dalam hardware/interfaces/camera .
HAL yang dibinderisasi pada umumnya harus mengimplementasikan antarmuka HIDL berikut:
-
ICameraProvider
: Untuk menghitung masing-masing perangkat dan mengelola statusnya. -
ICameraDevice
: Antarmuka perangkat kamera. -
ICameraDeviceSession
: Antarmuka sesi perangkat kamera aktif.
Referensi implementasi HIDL tersedia untuk CameraProvider.cpp
, CameraDevice.cpp
, dan CameraDeviceSession.cpp
. Implementasinya membungkus HAL lama yang masih menggunakan API lama . Mulai Android 8.0, implementasi Camera HAL harus menggunakan HIDL API; penggunaan antarmuka lama tidak didukung.
Validasi masukan
Karena HAL memiliki akses ke sumber daya yang berbeda dengan layanan kamera, batas antara keduanya diperlakukan sebagai batas keamanan. Artinya, parameter yang diteruskan dari layanan kamera dianggap tidak tepercaya dan tidak bersih. Untuk mencegah kerentanan keamanan yang memungkinkan penyerang meningkatkan hak istimewa atau mengakses data yang tidak seharusnya mereka akses, HAL kamera harus memvalidasi parameter yang diteruskan dari layanan kamera ke HAL. Hal ini termasuk memeriksa apakah nilai panjang buffer berada dalam rentang yang diperbolehkan dan membersihkan parameter sebelum digunakan dan sebelum meneruskannya ke perangkat keras atau driver kernel.
Komponen HAL lama
Bagian ini menjelaskan arsitektur komponen HAL lama dan cara mengimplementasikan HAL. Implementasi Camera HAL di Android 8.0 dan lebih tinggi harus menggunakan HIDL API, seperti dijelaskan di atas.
Arsitektur (warisan)
Gambar dan daftar berikut menjelaskan komponen HAL kamera lawas.
- kerangka aplikasi
- Pada level framework aplikasi terdapat kode aplikasi yang menggunakan API
android.hardware.Camera
untuk berinteraksi dengan hardware kamera. Secara internal, kode ini memanggil kelas lem JNI yang sesuai untuk mengakses kode asli yang berinteraksi dengan kamera. - JNI
- Kode JNI yang terkait dengan
android.hardware.Camera
terletak diframeworks/base/core/jni/android_hardware_Camera.cpp
. Kode ini memanggil kode asli tingkat rendah untuk mendapatkan akses ke kamera fisik dan mengembalikan data yang digunakan untuk membuat objekandroid.hardware.Camera
di tingkat kerangka kerja. - kerangka asli
- Kerangka kerja asli yang didefinisikan dalam
frameworks/av/camera/Camera.cpp
menyediakan setara asli dengan kelasandroid.hardware.Camera
. Kelas ini memanggil proxy pengikat IPC untuk mendapatkan akses ke layanan kamera. - pengikat proxy IPC
- Proksi pengikat IPC memfasilitasi komunikasi melalui batas-batas proses. Ada tiga kelas pengikat kamera yang terletak di direktori
frameworks/av/camera
yang memanggil layanan kamera.ICameraService
adalah antarmuka ke layanan kamera,ICamera
adalah antarmuka ke perangkat kamera tertentu yang dibuka, danICameraClient
adalah antarmuka perangkat yang kembali ke kerangka aplikasi. - layanan kamera
- Layanan kamera, yang terletak di
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, adalah kode sebenarnya yang berinteraksi dengan HAL. - HAL
- Lapisan abstraksi perangkat keras mendefinisikan antarmuka standar yang digunakan oleh layanan kamera dan yang harus Anda terapkan agar perangkat keras kamera Anda berfungsi dengan benar.
- driver kernel
- Driver kamera berinteraksi dengan perangkat keras kamera sebenarnya dan implementasi HAL Anda. Kamera dan driver harus mendukung format gambar YV12 dan NV21 untuk memberikan dukungan untuk melihat pratinjau gambar kamera pada tampilan dan perekaman video.
Menerapkan HAL (warisan)
HAL berada di antara driver kamera dan framework Android tingkat tinggi dan mendefinisikan antarmuka yang harus Anda terapkan agar aplikasi dapat mengoperasikan perangkat keras kamera dengan benar. Antarmuka HAL didefinisikan dalam file header hardware/libhardware/include/hardware/camera.h
dan hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
mendefinisikan camera_module
, struktur standar untuk memperoleh informasi umum tentang kamera, seperti ID kamera dan properti umum untuk semua kamera (yaitu, apakah kamera depan atau belakang).
camera.h
berisi kode yang sesuai dengan android.hardware.Camera
. File header ini mendeklarasikan struct camera_device
yang pada gilirannya berisi struct camera_device_ops
dengan pointer ke fungsi yang mengimplementasikan antarmuka HAL. Untuk dokumentasi tentang parameter kamera yang dapat diatur oleh pengembang, lihat frameworks/av/include/camera/CameraParameters.h
. Parameter ini disetel dengan fungsi yang ditunjukkan oleh int (*set_parameters)(struct camera_device *, const char *parms)
di HAL.
Untuk contoh implementasi HAL, lihat implementasi untuk Galaxy Nexus HAL di hardware/ti/omap4xxx/camera
.
Mengonfigurasi perpustakaan bersama
Siapkan sistem build Android untuk mengemas implementasi HAL dengan benar ke dalam pustaka bersama dan salin ke lokasi yang sesuai dengan membuat file Android.mk
:
- Buat direktori
device/<company_name>/<device_name>/camera
untuk memuat file sumber perpustakaan Anda. - Buat file
Android.mk
untuk membangun perpustakaan bersama. Pastikan makefile berisi baris berikut:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Pustaka Anda harus diberi nama
camera.<device_name>
(.so
ditambahkan secara otomatis), sehingga Android dapat memuat pustaka dengan benar. Sebagai contoh, lihat makefile untuk kamera Galaxy Nexus yang terletak dihardware/ti/omap4xxx/Android.mk
. - Tentukan perangkat Anda memiliki fitur kamera dengan menyalin file XML fitur yang diperlukan di direktori
frameworks/native/data/etc
dengan makefile perangkat Anda. Misalnya, untuk menentukan perangkat Anda memiliki flash kamera dan dapat fokus otomatis, tambahkan baris berikut di<device>/<company_name>/<device_name>/device.mk
makefile perangkat Anda:PRODUCT_COPY_FILES := \ ... PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
Untuk contoh makefile perangkat, lihat
device/samsung/tuna/device.mk
. - Deklarasikan kemampuan codec, format, dan resolusi media kamera Anda dalam file XML
device/<company_name>/<device_name>/media_profiles.xml
dandevice/<company_name>/<device_name>/media_codecs.xml
. Untuk detailnya, lihat Mengekspos codec ke kerangka kerja . - Tambahkan baris berikut di
device/<company_name>/<device_name>/device.mk
perangkat Anda untuk menyalin filemedia_profiles.xml
danmedia_codecs.xml
ke lokasi yang sesuai:# media config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
- Untuk menyertakan aplikasi Kamera dalam citra sistem perangkat Anda, tentukan aplikasi tersebut dalam variabel
PRODUCT_PACKAGES
didevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...