Kamera

Android Kamera HAL simgesi

Android'in kamera donanımı soyutlama katmanı (HAL), Camera 2'deki üst düzey kamera çerçevesi API'lerini temel kamera sürücünüze ve donanımınıza bağlar. Kamera alt sistemi, kamera boru hattı bileşenleri için uygulamaları içerirken, kamera HAL'ı bu bileşenlerin sürümünüzü uygulamada kullanmanız için arabirimler sağlar.

Mimari

Aşağıdaki şekil ve liste, HAL bileşenlerini açıklamaktadır.

Android kamera mimarisi

Şekil 1. Kamera mimarisi

uygulama çerçevesi
Uygulama çerçevesi düzeyinde, kamera donanımıyla etkileşim kurmak için Camera 2 API'sini kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod, kamerayla etkileşime giren yerel koda erişmek için ilgili Binder arabirimlerini çağırır.
AIDL
CameraService ile ilişkili bağlayıcı arabirimi, frameworks/av/camera/aidl/android/hardware adresinde bulunabilir. Oluşturulan kod, fiziksel kameraya erişim elde etmek için daha düşük seviyeli yerel kodu çağırır ve CameraDevice ve nihayetinde CameraCaptureSession nesnelerini çerçeve seviyesinde oluşturmak için kullanılan verileri döndürür.
yerel çerçeve
frameworks/av/ , CameraDevice ve CameraCaptureSession sınıflarına yerel bir eşdeğer sağlar. Ayrıca bkz. NDK camera2 referansı .
bağlayıcı IPC arayüzü
IPC bağlayıcı arabirimi, süreç sınırları üzerinden iletişimi kolaylaştırır. frameworks/av/camera/camera/aidl/android/hardware dizininde kamera hizmetini çağıran birkaç kamera bağlayıcı sınıfı vardır. ICameraService , kamera hizmetinin arabirimidir; ICameraDeviceUser , belirli bir açık kamera cihazının arabirimidir; ve ICameraServiceListener ve ICameraDeviceCallbacks , uygulama çerçevesine ilişkin CameraService ve CameraDevice geri aramalarıdır.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp içinde bulunan kamera hizmeti, HAL ile etkileşime giren gerçek koddur.
HAL
Donanım soyutlama katmanı, kamera hizmetinin çağırdığı ve kamera donanımınızın doğru şekilde çalışması için uygulamanız gereken standart arabirimi tanımlar.

HAL'ı uygulamak

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında yer alır ve uygulamaların kamera donanımını doğru şekilde çalıştırabilmesi için uygulamanız gereken bir arabirim tanımlar. Camera HAL için HIDL arabirimleri, donanım/arayüzler/kamera içinde tanımlanır.

Tipik bir ciltlenmiş HAL, aşağıdaki HIDL arabirimlerini uygulamalıdır:

CameraProvider.cpp , CameraDevice.cpp ve CameraDeviceSession.cpp için referans HIDL uygulamaları mevcuttur. Uygulama, hala eski API'yi kullanan eski HAL'leri sarar. Android 8.0 ile başlayarak, Camera HAL uygulamaları HIDL API'sini kullanmalıdır; eski arayüzün kullanımı desteklenmez.

Giriş doğrulama

HAL'ın kamera hizmetinden farklı kaynaklara erişimi olduğundan, ikisi arasındaki sınır bir güvenlik sınırı olarak kabul edilir. Bu, kamera hizmetinden geçirilen parametrelerin güvenilmez ve temizlenmemiş olarak kabul edildiği anlamına gelir. Saldırganların ayrıcalıkları yükseltmesine veya erişmesi amaçlanmayan verilere erişmesine izin veren güvenlik açıklarını önlemek için kamera HAL'ının, kamera hizmetinden HAL'e geçirilen parametreleri doğrulaması gerekir. Bu, arabellek uzunluğu değerlerinin izin verilen aralıklarda olup olmadığının kontrol edilmesini ve kullanımdan önce ve donanım veya çekirdek sürücülerine iletilmeden önce parametrelerin sterilize edilmesini içerir.

Eski HAL bileşenleri

Bu bölüm, eski HAL bileşenlerinin mimarisini ve HAL'in nasıl uygulanacağını açıklar. Android 8.0 ve sonraki sürümlerde kamera HAL uygulamaları, bunun yerine yukarıda açıklanan HIDL API'sini kullanmalıdır.

Mimari (eski)

Aşağıdaki şekil ve liste, eski kamera HAL bileşenlerini açıklamaktadır.

Android kamera mimarisi

Şekil 2. Eski kamera mimarisi

uygulama çerçevesi
Uygulama çerçevesi düzeyinde, kamera donanımıyla etkileşim kurmak için android.hardware.Camera API'sini kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod, kamerayla etkileşime giren yerel koda erişmek için karşılık gelen bir JNI yapıştırıcı sınıfını çağırır.
JNI
android.hardware.Camera ile ilişkili JNI kodu, frameworks/base/core/jni/android_hardware_Camera.cpp içinde bulunur. Bu kod, fiziksel kameraya erişim elde etmek için alt düzey yerel kodu çağırır ve çerçeve düzeyinde android.hardware.Camera nesnesini oluşturmak için kullanılan verileri döndürür.
yerel çerçeve
frameworks/av/camera/Camera.cpp içinde tanımlanan yerel çerçeve, android.hardware.Camera sınıfına yerel bir eşdeğer sağlar. Bu sınıf, kamera hizmetine erişim elde etmek için IPC bağlayıcı proxy'lerini çağırır.
bağlayıcı IPC proxy'leri
IPC bağlayıcı proxy'leri, süreç sınırları üzerinden iletişimi kolaylaştırır. Kamera hizmetini çağıran frameworks/av/camera dizininde bulunan üç kamera bağlayıcı sınıfı vardır. ICameraService , kamera hizmetinin arabirimidir, ICamera , belirli bir açık kamera cihazının arabirimidir ve ICameraClient , cihazın uygulama çerçevesine geri dönen arabirimidir.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp içinde bulunan kamera hizmeti, HAL ile etkileşime giren gerçek koddur.
HAL
Donanım soyutlama katmanı, kamera hizmetinin çağırdığı ve kamera donanımınızın doğru şekilde çalışması için uygulamanız gereken standart arabirimi tanımlar.
çekirdek sürücüsü
Kameranın sürücüsü, gerçek kamera donanımı ve HAL uygulamanız ile etkileşime girer. Kamera ve sürücü, kamera görüntüsünü ekranda önizleme ve video kaydı için destek sağlamak için YV12 ve NV21 görüntü formatlarını desteklemelidir.

HAL'ı (eski) uygulama

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında yer alır ve uygulamaların kamera donanımını doğru şekilde çalıştırabilmesi için uygulamanız gereken bir arabirim tanımlar. HAL arayüzü, hardware/libhardware/include/hardware/camera.h ve hardware/libhardware/include/hardware/camera_common.h başlık dosyalarında tanımlanmıştır.

camera_common.h , kamera kimliği ve tüm kameralarda ortak olan özellikler (yani, öne veya arkaya bakan bir kamera olup olmadığı) gibi kamera hakkında genel bilgileri elde etmek için standart bir yapı olan camera_module öğesini tanımlar.

camera.h , android.hardware.Camera öğesine karşılık gelen kodu içerir. Bu başlık dosyası, HAL arabirimini uygulayan işlevlere işaretçiler içeren bir camera_device_ops yapısı içeren bir camera_device yapısı bildirir. Geliştiricilerin ayarlayabileceği kamera parametreleriyle ilgili belgeler için frameworks/av/include/camera/CameraParameters.h . Bu parametreler, int (*set_parameters)(struct camera_device *, const char *parms) ile gösterilen işlevle ayarlanır.

Bir HAL uygulaması örneği için, hardware/ti/omap4xxx/camera içindeki Galaxy Nexus HAL uygulamasına bakın.

Paylaşılan kitaplığı yapılandırma

HAL uygulamasını paylaşılan bir kitaplıkta doğru şekilde paketlemek için Android derleme sistemini kurun ve bir Android.mk dosyası oluşturarak uygun konuma kopyalayın:

  1. Kitaplığınızın kaynak dosyalarını içermek için bir device/<company_name>/<device_name>/camera dizini oluşturun.
  2. Paylaşılan kitaplığı oluşturmak için bir Android.mk dosyası oluşturun. makefile dosyasının aşağıdaki satırları içerdiğinden emin olun:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Kitaplığınız camera.<device_name> ( .so otomatik olarak eklenir), böylece Android kitaplığı doğru şekilde yükleyebilir. Örnek olarak, hardware/ti/omap4xxx/Android.mk bulunan Galaxy Nexus kameranın makefile dosyasına bakın.

  3. Cihazınızın makefile ile frameworks/native/data/etc dizinindeki gerekli özellik XML dosyalarını kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin. Örneğin, cihazınızın bir kamera flaşına sahip olduğunu ve otomatik odaklama yapabildiğini belirtmek için, cihazınızın <device>/<company_name>/<device_name>/device.mk makefile dosyasına şu satırları ekleyin:
    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 \
    

    Bir cihaz makefile örneği için, bkz. device/samsung/tuna/device.mk .

  4. device/<company_name>/<device_name>/media_profiles.xml ve device/<company_name>/<device_name>/media_codecs.xml XML dosyalarında kameranızın medya codec bileşenini, biçimini ve çözünürlük özelliklerini bildirin. Ayrıntılar için bkz. Codec'leri çerçeveye gösterme .
  5. media_profiles.xml ve media_codecs.xml dosyalarını uygun konuma kopyalamak için cihazınızın device/<company_name>/<device_name>/device.mk makefile dosyasına aşağıdaki satırları ekleyin:
    # 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. Kamera uygulamasını cihazınızın sistem görüntüsüne dahil etmek için cihazınızın cihazındaki PRODUCT_PACKAGES değişkeninde belirtin device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...