Lapisan abstraksi hardware kamera (HAL) Android menghubungkan level hardware Camera API framework di Kamera 2 ke driver dan hardware kamera yang mendasarinya. Subsistem kamera menyertakan implementasi untuk komponen pipeline kamera sementara HAL kamera menyediakan antarmuka untuk digunakan dalam mengimplementasikan versi Anda komponen.
Arsitektur
Gambar dan daftar berikut ini menjelaskan komponen HAL.
- framework aplikasi
- Di level framework aplikasi adalah kode aplikasi, yang menggunakan Camera 2 API untuk berinteraksi dengan hardware kamera. Secara internal, kode ini panggilan terkait Antarmuka Binder untuk mengakses kode native yang berinteraksi dengan kamera.
- AIDL
- Antarmuka binder yang terkait dengan
CameraService
dapat berupa ditemukan di framework/av/camera/aidl/android/hardware. Kode yang dihasilkan memanggil kode native tingkat yang lebih rendah untuk mendapatkan akses ke kamera fisik dan mengembalikan data yang digunakan untuk membuatCameraDevice
dan akhirnyaCameraCaptureSession
di level framework. - framework native
- Framework yang berada di
frameworks/av/
ini memberikan padanan asli yang setara denganCameraDevice
danCameraCaptureSession
Google Cloud Platform. Lihat juga Referensi camera2 NDK. - antarmuka IPC binder
- Antarmuka binder IPC memfasilitasi komunikasi melalui batas proses.
Ada beberapa class binder kamera yang terletak di
frameworks/av/camera/camera/aidl/android/hardware
yang ke layanan kamera.ICameraService
adalah antarmuka ke layanan kamera;ICameraDeviceUser
adalah antarmuka ke objek tertentu yang dibuka perangkat kamera; danICameraServiceListener
danICameraDeviceCallbacks
adalah masing-masing CallbackCameraService
danCameraDevice
ke framework aplikasi Anda. - layanan kamera
- Layanan kamera, yang terletak di
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, adalah kode aktual yang berinteraksi dengan HAL. - HAL
- Lapisan abstraksi hardware menentukan antarmuka standar yang panggilan layanan kamera dan yang harus Anda implementasikan agar kamera perangkat keras berfungsi dengan baik.
Mengimplementasikan HAL
HAL berada di antara driver kamera dan framework Android level lebih tinggi dan mendefinisikan antarmuka yang harus Anda implementasikan sehingga aplikasi bisa beroperasi dengan benar hardware kamera. HIDL untuk Camera HAL didefinisikan dalam hardware/antarmuka/kamera.
HAL terbinderisasi biasa harus mengimplementasikan antarmuka HIDL berikut:
-
ICameraProvider
: Untuk menghitung setiap perangkat dan mengelola statusnya. -
ICameraDevice
: Antarmuka perangkat kamera. -
ICameraDeviceSession
: Antarmuka sesi perangkat kamera aktif.
Penerapan HIDL referensi tersedia untuk
CameraProvider.cpp
,
CameraDevice.cpp
, dan
CameraDeviceSession.cpp
.
Implementasi ini menggabungkan 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 batasan keamanan. Ini berarti parameter yang diteruskan dari layanan kamera dianggap tidak tepercaya dan tidak bersih. Untuk mencegah kerentanan keamanan yang memungkinkan penyerang hak istimewa eskalasi atau mengakses data yang tidak seharusnya dapat mereka akses, HAL kamera harus memvalidasi parameter yang diteruskan dari layanan kamera ke HAL. Termasuk di antaranya memeriksa {i>buffer<i} nilai panjang berada dalam rentang yang diizinkan dan membersihkan parameter sebelum digunakan dan sebelum meneruskannya ke {i>driver<i} perangkat keras atau {i>kernel<i}.
Komponen HAL lama
Bagian ini menjelaskan arsitektur komponen HAL lama dan cara menerapkan HAL. Implementasi Camera HAL di Android 8.0 dan yang lebih tinggi harus menggunakan HIDL API, yang dijelaskan di atas.
Arsitektur (lama)
Gambar dan daftar berikut menjelaskan komponen HAL kamera lama.
- framework aplikasi
- Di level framework aplikasi adalah kode aplikasi, yang menggunakan
android.hardware.Camera
API untuk berinteraksi dengan hardware kamera. Secara internal, kode ini memanggil class glue JNI yang sesuai untuk mengakses kode native 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 native di tingkat yang lebih rendah untuk mendapatkan akses ke kamera fisik dan menampilkan data yang digunakan untukandroid.hardware.Camera
di level framework. - framework native
- Framework native yang ditentukan di
frameworks/av/camera/Camera.cpp
memberikan padanan nativeandroid.hardware.Camera
. Class ini memanggil IPC proxy binder untuk mendapatkan akses ke layanan kamera. - proxy IPC binder
- Proxy binder IPC memfasilitasi komunikasi melalui batas-batas proses.
Ada tiga class binder kamera yang terletak di bagian
Direktori
frameworks/av/camera
yang memanggil ke layanan kamera.ICameraService
adalah antarmuka ke layanan kamera,ICamera
adalah antarmuka ke perangkat kamera tertentu yang terbuka, danICameraClient
adalah antarmuka perangkat kembali ke framework aplikasi Anda. - layanan kamera
- Layanan kamera, yang terletak di
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, adalah kode aktual yang berinteraksi dengan HAL. - HAL
- Lapisan abstraksi hardware menentukan antarmuka standar yang panggilan layanan kamera dan yang harus Anda implementasikan agar kamera perangkat keras berfungsi dengan baik.
- driver kernel
- Driver kamera berinteraksi dengan hardware kamera sebenarnya dan penerapan HAL. Kamera dan driver harus mendukung YV12 dan NV21 format gambar yang memberikan dukungan untuk melihat pratinjau gambar kamera pada tampilan dan perekaman video.
Mengimplementasikan HAL (lama)
HAL berada di antara driver kamera dan framework Android level lebih tinggi
dan mendefinisikan antarmuka yang harus Anda implementasikan sehingga aplikasi bisa beroperasi dengan benar
hardware kamera. Antarmuka HAL didefinisikan dalam
hardware/libhardware/include/hardware/camera.h
dan
File header hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
menentukan camera_module
, standar
untuk mendapatkan informasi umum tentang kamera, seperti ID kamera
dan properti yang umum untuk semua kamera (yaitu, apakah kamera depan
kamera belakang).
camera.h
berisi kode yang sesuai dengan
android.hardware.Camera
. File {i>header<i} ini mendeklarasikan
Struktur camera_device
yang selanjutnya berisi
Struktur camera_device_ops
dengan pointer ke fungsi yang mengimplementasikan
antarmuka HAL. Untuk dokumentasi tentang parameter kamera, developer dapat
disetel, 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 pustaka bersama
Menyiapkan sistem build Android untuk memaketkan implementasi HAL dengan benar
ke pustaka bersama dan menyalinnya ke lokasi yang sesuai dengan membuat
File Android.mk
:
- Membuat
device/<company_name>/<device_name>/camera
yang berisi file sumber library Anda. - Buat file
Android.mk
untuk mem-build library bersama. Pastikan bahwa makefile berisi baris-baris berikut:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Koleksi Anda harus diberi nama
camera.<device_name>
(.so
ditambahkan secara otomatis), sehingga Android dapat memuat library. Sebagai contoh, lihat makefile untuk kamera Galaxy Nexus yang terletak dihardware/ti/omap4xxx/Android.mk
. - Tentukan perangkat Anda memiliki fitur kamera dengan menyalin XML fitur yang diperlukan
file di direktori
frameworks/native/data/etc
dengan makefile perangkat. Misalnya, untuk menentukan perangkat Anda memiliki flash kamera dan dapat memfokuskan otomatis, tambahkan baris berikut di kolom<device>/<company_name>/<device_name>/device.mk
makefile: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 codec media, format, dan kemampuan resolusi kamera Anda di
device/<company_name>/<device_name>/media_profiles.xml
dandevice/<company_name>/<device_name>/media_codecs.xml
XML. Untuk mengetahui detailnya, lihat Mengekspos codec ke Google Cloud Platform. - Tambahkan baris berikut ke kolom
Makefile
device/<company_name>/<device_name>/device.mk
untuk menyalinmedia_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 di image sistem perangkat, tentukan di
PRODUCT_PACKAGES
di variabel perangkat Andadevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...