Kamera

Ikon Android Camera HAL

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.

Arsitektur kamera Android

Gambar 1. Arsitektur kamera

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 membuat CameraDevice dan akhirnya CameraCaptureSession di level framework.
framework native
Framework yang berada di frameworks/av/ ini memberikan padanan asli yang setara dengan CameraDevice dan CameraCaptureSession 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; dan ICameraServiceListener dan ICameraDeviceCallbacks adalah masing-masing Callback CameraService dan CameraDevice 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:

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.

Arsitektur kamera Android

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

  1. Membuat device/<company_name>/<device_name>/camera yang berisi file sumber library Anda.
  2. 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 di hardware/ti/omap4xxx/Android.mk.

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

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