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 ardışık düzeni bileşenlerinin uygulamalarını içerirken kamera HAL'i, bu bileşenlerin kendi sürümünüzü uygulamada kullanılacak arayüzleri sağlar.

Mimari

Aşağıdaki şekil ve listede HAL bileşenleri açıklanmaktadı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'yi kullanan uygulama kodu bulunur. Bu kod, kamerayla etkileşime giren yerel koda erişmek için dahili olarak ilgili Binder arayüzlerini çağırır.
AIDL
CameraService ile ilişkili bağlayıcı arayüzünü frameworks/av/camera/aidl/android/hardware adresinde bulabilirsiniz. Oluşturulan kod, fiziksel kameraya erişim elde etmek için alt düzey yerel kodu çağırır ve CameraDevice ve nihayetinde CameraCaptureSession nesnelerini oluşturmak için kullanılan verileri döndürür.
yerel çerçeve
frameworks/av/ içinde bulunan bu çerçeve, CameraDevice ve CameraCaptureSession sınıflarına doğal bir eşdeğer sağlar. Ayrıca NDK camera2 referansı başlıklı makaleye de bakın.
binder IPC arayüzü
IPC bağlayıcı arayüzü, işlem 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 arayüzüdür; ICameraDeviceUser, belirli bir açık kamera cihazının arayüzüdür; ICameraServiceListener ve ICameraDeviceCallbacks ise uygulama çerçevesine yönelik CameraService ve CameraDevice geri çağırma işlevleridir.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp bölümünde 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 düzgün çalışması için uygulamanız gereken standart arayüzü tanımlar.

HAL'i 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 arayüz tanımlar. Kamera HAL'i için HIDL arayüzleri hardware/interfaces/camera altında tanımlanır.

Tipik bir bağlayıcı HAL'i aşağıdaki HIDL arayüzlerini uygulamalıdır:

Referans HIDL uygulamaları CameraProvider.cpp, CameraDevice.cpp ve CameraDeviceSession.cpp için kullanılabilir. Uygulama, hâlâ eski API kullanan eski HAL'leri sarmalıyor. Android 8.0'dan itibaren, Kamera HAL uygulamalarında HIDL API kullanılmalıdır. Eski arayüzün kullanımı desteklenmez.

Giriş doğrulaması

HAL, kamera hizmetinden farklı kaynaklara erişebildiğinden, ikisi arasındaki sınır bir güvenlik sınırı olarak kabul edilir. Bu, kamera hizmetinden iletilen parametrelerin güvenilmediği ve temizlenmediği anlamına gelir. Saldırganların ayrıcalıkları artırmasına veya erişmesi amaçlanmayan verilere erişmesine olanak tanıyan güvenlik açıklarını önlemek için kamera HAL'inin, kamera hizmetinden HAL'e iletilen parametreleri doğrulaması gerekir. Bu işlemler arasında, arabellek uzunluğu değerlerinin izin verilen aralıklar içinde olup olmadığını kontrol etme ve parametreleri kullanmadan önce ve donanım veya çekirdek sürücülerine aktarmadan önce temizleme yer alır.

Eski HAL bileşenleri

Bu bölümde, eski HAL bileşenlerinin mimarisi ve HAL'in nasıl uygulanacağı açıklanmaktadır. Android 8.0 ve sonraki sürümlerdeki kamera HAL uygulamalarında, yukarıda açıklanan HIDL API'nin kullanılması gerekir.

Mimari (eski)

Aşağıdaki şekil ve listede eski kamera HAL bileşenleri açıklanmaktadı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'yi kullanan uygulama kodu bulunur. Bu kod, kamerayla etkileşime geçen yerel koda erişmek için dahili olarak ilgili bir JNI yapıştırıcı sınıfını çağırır.
JNI
android.hardware.Camera ile ilişkili JNI kodu şurada bulunur: frameworks/base/core/jni/android_hardware_Camera.cpp. Bu kod, fiziksel kameraya erişim elde etmek için alt düzey yerel kodu çağırır ve android.hardware.Camera nesnesini çerçeve düzeyinde 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 eşdeğer bir yerel sınıf sağlar. Bu sınıf, kamera hizmetine erişim elde etmek için IPC bağlama aracısı proxy'lerini çağırır.
binder IPC proxy'leri
IPC bağlayıcı proxy'leri, işlem sınırları üzerinden iletişimi kolaylaştırır. Kamera hizmetini çağıran frameworks/av/camera dizininde üç kamera bağlayıcı sınıfı bulunur. ICameraService, kamera hizmetinin arayüzüdür, ICamera, belirli bir açık kamera cihazının arayüzüdür, ve ICameraClient, cihazın uygulama çerçevesine geri dönük arayüzüdür.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp bölümünde 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 düzgün çalışması için uygulamanız gereken standart arayüzü tanımlar.
çekirdek sürücüsü
Kamera sürücüsü, gerçek kamera donanımıyla ve HAL uygulamanızla etkileşim kurar. Kamera ve sürücü, kamera görüntüsünün ekranda önizlenmesi ve video kaydı için YV12 ve NV21 resim biçimlerini desteklemelidir.

HAL'yi (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 arayüz tanımlar. HAL arayüzü, hardware/libhardware/include/hardware/camera.h ve hardware/libhardware/include/hardware/camera_common.h üstbilgi dosyalarında tanımlanır.

camera_common.h, kamerayla ilgili genel bilgileri (ör. kamera kimliği ve tüm kameralarda ortak olan özellikler (ör. ön veya arka kamera olup olmadığı)) almak için standart bir yapı olan camera_module'yi tanımlar.

camera.h, android.hardware.Camera ile eşleşen kod içerir. Bu başlık dosyası, HAL arayüzünü uygulayan işlevlerin işaretçilerini içeren bir camera_device_ops yapısı içeren bir camera_device yapısı tanımlar. Geliştiricilerin ayarlayabileceği kamera parametreleri hakkında dokümanlar için frameworks/av/include/camera/CameraParameters.h bölümüne bakın. Bu parametreler, HAL'de int (*set_parameters)(struct camera_device *, const char *parms) tarafından işaretlenen işlevle ayarlanır.

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

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

Android derleme sistemini, HAL uygulamasını paylaşılan bir kitaplığa doğru şekilde paketleyecek ve Android.mk dosyası oluşturarak uygun konuma kopyalayacak şekilde ayarlayın:

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

    Android'in kitaplığı doğru şekilde yükleyebilmesi için kitaplığınız camera.<device_name> şeklinde adlandırılmalıdır (.so otomatik olarak eklenir). Örnek olarak, hardware/ti/omap4xxx/Android.mk konumundaki Galaxy Nexus kamerasının makefile dosyasını inceleyebilirsiniz.

  3. Cihazınızın makefile'iyle birlikte frameworks/native/data/etc dizininde gerekli özellik XML dosyalarını kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin. Örneğin, cihazınızın kamera flaşını ve otomatik odaklama özelliğini belirtmek için cihazınızın <device>/<company_name>/<device_name>/device.mkmakefile'ine aşağıdaki 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 \
    

    Cihaz makefile'i örneği için device/samsung/tuna/device.mk bölümüne bakın.

  4. Kameranızın medya codec'i, biçimi ve çözünürlük özelliklerini device/<company_name>/<device_name>/media_profiles.xml ve device/<company_name>/<device_name>/media_codecs.xml XML dosyalarında belirtin. Ayrıntılar için Kodeklerin çerçeveye gösterilmesi başlıklı makaleyi inceleyin.
  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'ine 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 resmine dahil etmek için cihazınızın device/<company>/<device>/device.mk makefile'indeki PRODUCT_PACKAGES değişkeninde belirtin:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...