Kamera

Ikon Android Camera HAL

Lapisan abstraksi hardware (HAL) kamera Android menghubungkan API framework kamera tingkat yang lebih tinggi di Camera 2 ke driver dan hardware kamera yang mendasarinya. Subsistem kamera mencakup 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 terdapat 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 bawah untuk mendapatkan akses ke kamera fisik dan menampilkan data yang digunakan untuk membuat objek CameraDevice dan akhirnya CameraCaptureSession di tingkat framework.
framework native
Framework ini berada di frameworks/av/ dan 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 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; dan ICameraServiceListener dan ICameraDeviceCallbacks adalah callback CameraService dan CameraDevice masing-masing ke framework aplikasi.
layanan kamera
Layanan kamera, yang berada 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 Anda berfungsi dengan benar.

Menerapkan HAL

HAL berada di antara driver kamera dan framework Android tingkat yang lebih tinggi dan menentukan antarmuka yang harus Anda terapkan agar aplikasi dapat mengoperasikan hardware kamera dengan benar. Antarmuka HIDL untuk Camera HAL ditentukan dalam hardware/interfaces/camera.

HAL yang terikat standar harus mengimplementasikan antarmuka HIDL berikut:

Implementasi HIDL referensi tersedia untuk CameraProvider.cpp, CameraDevice.cpp, dan CameraDeviceSession.cpp. Implementasi ini membungkus HAL lama yang masih menggunakan API lama. Mulai Android 8.0, implementasi HAL Kamera 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 seharusnya tidak mereka akses, HAL kamera harus memvalidasi parameter yang diteruskan dari layanan kamera ke HAL. Hal ini mencakup pemeriksaan bahwa nilai panjang buffer 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, seperti 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 terdapat 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 bawah 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 dalam frameworks/av/camera/Camera.cpp menyediakan 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 pengikat kamera yang berada di direktori frameworks/av/camera yang memanggil layanan kamera. ICameraService adalah antarmuka ke layanan kamera, ICamera adalah antarmuka ke perangkat kamera tertentu yang dibuka, dan ICameraClient adalah antarmuka perangkat kembali ke framework aplikasi.
layanan kamera
Layanan kamera, yang berada 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 Anda berfungsi dengan benar.
driver kernel
Driver kamera berinteraksi dengan hardware kamera yang sebenarnya dan penerapan HAL Anda. Kamera dan driver harus mendukung format gambar YV12 dan NV21 untuk memberikan dukungan dalam melihat pratinjau gambar kamera di layar dan perekaman video.

Menerapkan HAL (lama)

HAL berada di antara driver kamera dan framework Android tingkat yang 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 umum untuk semua kamera (yaitu, apakah kamera menghadap ke 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 ditunjukkan oleh int (*set_parameters)(struct camera_device *, const char *parms) di HAL.

Untuk contoh penerapan HAL, lihat penerapan untuk HAL Galaxy Nexus di hardware/ti/omap4xxx/camera.

Mengonfigurasi galeri foto bersama

Siapkan sistem build Android untuk mengemas implementasi HAL dengan benar ke dalam library bersama 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 membangun 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 dalam 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 file make perangkat, lihat device/samsung/tuna/device.mk.

  4. Deklarasikan kemampuan codec media, format, dan resolusi 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 Anda, tentukan di variabel PRODUCT_PACKAGES dalam makefile device/<company>/<device>/device.mk perangkat Anda:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...