![Ikon Android Camera HAL](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=5&hl=id)
Lapisan abstraksi hardware kamera (HAL) Android menghubungkan API framework kamera level yang lebih tinggi di Camera 2 ke driver dan hardware kamera yang mendasarinya. Subsistem kamera menyertakan implementasi untuk komponen pipeline kamera, sedangkan HAL kamera menyediakan antarmuka untuk digunakan dalam menerapkan versi komponen ini.
Arsitektur
Gambar dan daftar berikut menjelaskan komponen HAL.
![Arsitektur kamera Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=5&hl=id)
Gambar 1. Arsitektur kamera
- framework aplikasi
- Di tingkat framework aplikasi adalah kode aplikasi, yang menggunakan Camera 2 API untuk berinteraksi dengan hardware kamera. Secara internal, kode ini memanggil antarmuka Binder yang sesuai untuk mengakses kode native yang berinteraksi dengan kamera.
- AIDL
- Antarmuka binder yang terkait dengan
CameraService
dapat ditemukan di frameworks/av/camera/aidl/android/hardware. Kode yang dihasilkan memanggil kode native tingkat rendah untuk mendapatkan akses ke kamera fisik dan menampilkan data yang digunakan untuk membuat objekCameraDevice
dan pada akhirnyaCameraCaptureSession
di tingkat framework. - framework native
- Framework yang berada di
frameworks/av/
ini menyediakan padanan native untuk classCameraDevice
danCameraCaptureSession
. Lihat juga referensi camera2 NDK. - antarmuka IPC binder
- Antarmuka binder IPC memfasilitasi komunikasi melalui batas proses.
Ada beberapa class binder kamera yang terletak di
direktori
frameworks/av/camera/camera/aidl/android/hardware
yang memanggil layanan kamera.ICameraService
adalah antarmuka untuk layanan kamera;ICameraDeviceUser
adalah antarmuka untuk perangkat kamera tertentu yang dibuka; danICameraServiceListener
danICameraDeviceCallbacks
adalah callbackCameraService
danCameraDevice
masing-masing ke framework aplikasi. - layanan kamera
- Layanan kamera, yang terletak di
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, adalah kode sebenarnya yang berinteraksi dengan HAL. - HAL
- Hardware abstraction layer menentukan antarmuka standar yang dipanggil oleh layanan kamera dan yang harus Anda terapkan agar hardware kamera berfungsi dengan benar.
Mengimplementasikan HAL
HAL berada di antara driver kamera dan framework Android level lebih tinggi dan menentukan antarmuka yang harus Anda terapkan agar aplikasi dapat mengoperasikan hardware kamera dengan benar. Antarmuka HIDL untuk Camera HAL ditentukan di hardware/interfaces/camera.
HAL binderized standar harus mengimplementasikan antarmuka HIDL berikut:
-
ICameraProvider
: Untuk menghitung setiap perangkat dan mengelola statusnya. -
ICameraDevice
: Antarmuka perangkat kamera. -
ICameraDeviceSession
: Antarmuka sesi perangkat kamera yang aktif.
Implementasi HIDL referensi tersedia untuk
CameraProvider.cpp
,
CameraDevice.cpp
,, dan
CameraDeviceSession.cpp
.
Implementasi 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 resource yang berbeda dengan layanan kamera, batas antara keduanya diperlakukan sebagai batas keamanan. Artinya, parameter yang diteruskan dari layanan kamera dianggap tidak tepercaya dan tidak dibersihkan. 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 mencakup pemeriksaan bahwa nilai panjang buffering berada dalam rentang yang diizinkan dan membersihkan parameter sebelum digunakan dan sebelum meneruskannya ke driver hardware atau kernel.
Komponen HAL lama
Bagian ini menjelaskan arsitektur komponen HAL lama dan cara menerapkan HAL. Implementasi HAL kamera 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.
![Arsitektur kamera Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=5&hl=id)
Gambar 2. Arsitektur kamera lama
- framework aplikasi
- Di tingkat 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 tingkat rendah untuk mendapatkan akses ke kamera fisik dan menampilkan data yang digunakan untuk membuat objekandroid.hardware.Camera
di tingkat framework. - framework native
- Framework native yang ditentukan di
frameworks/av/camera/Camera.cpp
memberikan padanan native untuk classandroid.hardware.Camera
. Class ini memanggil proxy binder IPC untuk mendapatkan akses ke layanan kamera. - proxy IPC binder
- Proxy binder IPC memfasilitasi komunikasi melalui batas proses.
Ada tiga class binder kamera yang terletak di
direktori
frameworks/av/camera
yang memanggil layanan kamera.ICameraService
adalah antarmuka untuk layanan kamera,ICamera
adalah antarmuka untuk perangkat kamera tertentu yang dibuka, danICameraClient
adalah antarmuka perangkat kembali ke framework aplikasi. - layanan kamera
- Layanan kamera, yang terletak di
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, adalah kode sebenarnya yang berinteraksi dengan HAL. - HAL
- Hardware abstraction layer menentukan antarmuka standar yang dipanggil oleh layanan kamera dan yang harus Anda terapkan agar hardware kamera berfungsi dengan benar.
- driver kernel
- Driver kamera berinteraksi dengan hardware kamera yang sebenarnya dan implementasi HAL Anda. Kamera dan driver harus mendukung format gambar YV12 dan NV21 untuk memberikan dukungan guna melihat pratinjau gambar kamera di layar dan perekaman video.
Mengimplementasikan HAL (lama)
HAL berada di antara driver kamera dan framework Android level lebih tinggi
dan menentukan antarmuka yang harus Anda terapkan agar aplikasi dapat mengoperasikan
hardware kamera dengan benar. Antarmuka HAL ditentukan dalam
file header hardware/libhardware/include/hardware/camera.h
dan
hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
menentukan camera_module
, struktur
standar untuk mendapatkan informasi umum tentang kamera, seperti ID kamera
dan properti yang umum untuk semua kamera (yaitu, apakah kamera menghadap 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
ditetapkan developer, lihat frameworks/av/include/camera/CameraParameters.h
.
Parameter ini ditetapkan dengan fungsi yang ditunjuk oleh int
(*set_parameters)(struct camera_device *, const char *parms)
di HAL.
Untuk contoh implementasi HAL, lihat implementasi untuk
HAL Galaxy Nexus di hardware/ti/omap4xxx/camera
.
Mengonfigurasi library bersama
Siapkan sistem build Android untuk mengemas implementasi HAL
ke dalam library bersama dengan benar dan menyalinnya ke lokasi yang sesuai dengan membuat
file Android.mk
:
- Buat direktori
device/<company_name>/<device_name>/camera
untuk memuat file sumber library Anda. - Buat file
Android.mk
untuk mem-build library bersama. Pastikan makefile berisi baris berikut:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Library Anda harus diberi nama
camera.<device_name>
(.so
ditambahkan secara otomatis), sehingga Android dapat memuat library dengan benar. Sebagai contoh, lihat makefile untuk kamera Galaxy Nexus yang terletak dihardware/ti/omap4xxx/Android.mk
. - Tentukan bahwa 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 bahwa perangkat Anda memiliki flash kamera dan dapat melakukan fokus otomatis, tambahkan baris berikut di makefile<device>/<company_name>/<device_name>/device.mk
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 mengetahui detailnya, lihat Mengekspos codec ke framework. - Tambahkan baris berikut di makefile
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 image sistem perangkat, tentukan di
variabel
PRODUCT_PACKAGES
dalam makefiledevice/<company>/<device>/device.mk
perangkat Anda:PRODUCT_PACKAGES := \ Gallery2 \ ...