Kamera

Ikon Android Camera HAL

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

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 objek CameraDevice dan pada akhirnya CameraCaptureSession di tingkat framework.
framework native
Framework yang berada di frameworks/av/ ini menyediakan padanan native untuk class CameraDevice dan CameraCaptureSession. 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; dan ICameraServiceListener dan ICameraDeviceCallbacks adalah callback CameraService dan CameraDevice 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:

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

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 di frameworks/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 objek android.hardware.Camera di tingkat framework.
framework native
Framework native yang ditentukan di frameworks/av/camera/Camera.cpp memberikan padanan native untuk class android.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, dan ICameraClient 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:

  1. Buat direktori device/<company_name>/<device_name>/camera untuk memuat file sumber library Anda.
  2. 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 di hardware/ti/omap4xxx/Android.mk.

  3. 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.

  4. Deklarasikan kemampuan codec, format, dan resolusi media kamera Anda dalam file XML device/<company_name>/<device_name>/media_profiles.xml dan device/<company_name>/<device_name>/media_codecs.xml. Untuk mengetahui detailnya, lihat Mengekspos codec ke framework.
  5. Tambahkan baris berikut di makefile device/<company_name>/<device_name>/device.mk perangkat Anda untuk menyalin file media_profiles.xml dan media_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
    
  6. Untuk menyertakan aplikasi Kamera dalam image sistem perangkat, tentukan di variabel PRODUCT_PACKAGES dalam makefile device/<company>/<device>/device.mk perangkat Anda:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...