Kamera

Android Camera 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 işlem hattı bileşenlerinin uygulamalarını içerirken kamera HAL'si, bu bileşenlerin kendi sürümünüzü uygularken kullanabileceğiniz 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'sini kullanan uygulama kodu bulunur. Bu kod, dahili olarak kamera ile etkileşimde bulunan yerel koda erişmek için ilgili Binder arayüzlerini çağırır.
AIDL
CameraService ile ilişkili bağlayıcı arayüzü şu konumda bulunabilir: frameworks/av/camera/aidl/android/hardware. Oluşturulan kod, fiziksel kameraya erişmek için daha düşük düzeydeki yerel kodu çağırır ve çerçeve düzeyinde CameraDevice ve nihayetinde CameraCaptureSession nesnelerini oluşturmak için kullanılan verileri döndürür.
doğal reklam çerçevesi
frameworks/av/ içinde bulunan bu çerçeve, CameraDevice ve CameraCaptureSession sınıflarına yerel bir eşdeğer sağlar. Ayrıca NDK camera2 referansı başlıklı makaleyi inceleyin.
binder IPC arayüzü
IPC bağlayıcı arayüzü, süreç sınırları arasında 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ı bulunur. ICameraService, kamera hizmetinin arayüzü; ICameraDeviceUser, belirli bir açık kamera cihazının arayüzü; ve ICameraServiceListener ile ICameraDeviceCallbacks, uygulama çerçevesine yönelik ilgili CameraService ve CameraDevice geri çağırmalarıdır.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp konumundaki kamera hizmeti, HAL ile etkileşim kuran 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 arayüzü tanımlar.

HAL'yi 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'si için HIDL arayüzleri hardware/interfaces/camera içinde tanımlanır.

Tipik bir bağlayıcı HAL'nin aşağıdaki HIDL arayüzlerini uygulaması gerekir:

Referans HIDL uygulamaları CameraProvider.cpp, CameraDevice.cpp ve CameraDeviceSession.cpp için kullanılabilir. Uygulama, eski API'yi kullanmaya devam eden eski HAL'leri sarmalar. Android 8.0'dan itibaren, Camera HAL uygulamaları HIDL API'sini kullanmalı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, güvenlik sınırı olarak kabul edilir. Bu durumda, kamera hizmetinden iletilen parametreler güvenilmeyen ve temizlenmemiş olarak kabul edilir. Saldırganların ayrıcalıkları yükseltmesine veya erişmesi amaçlanmayan verilere erişmesine olanak tanıyan güvenlik açıklarını önlemek için kamera HAL'si, kamera hizmetinden HAL'ye aktarılan parametreleri doğrulamalıdır. Bu kapsamda, arabellek uzunluğu değerlerinin izin verilen aralıklar içinde olup olmadığı kontrol edilir ve parametreler, kullanılmadan önce ve donanım veya çekirdek sürücülerine aktarılmadan önce temizlenir.

Eski HAL

Bu bölümde, eski HAL bileşenlerinin mimarisi ve HAL'nin nasıl uygulanacağı açıklanmaktadır. Android 8.0 ve sonraki sürümlerdeki Kamera HAL uygulamaları, yukarıda açıklanan HIDL API'yi kullanmalıdır.

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'sini kullanan uygulamanın kodu bulunur. Bu kod, dahili olarak kamerayla etkileşimde bulunan yerel koda erişmek için ilgili bir JNI yapıştırma sınıfını çağırır.
JNI
ile ilişkili JNI kodu android.hardware.Camera konumunda yer alır. frameworks/base/core/jni/android_hardware_Camera.cpp Bu kod, fiziksel kameraya erişim elde etmek için daha düşük düzeydeki 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.
doğal reklam çerçevesi
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şmek için IPC bağlayıcı proxy'lerini çağırır.
binder 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 arayüzü, ICamera, belirli bir açık kamera cihazının arayüzü, ICameraClient ise cihazın uygulama çerçevesine geri dönen arayüzüdür.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp konumundaki kamera hizmeti, HAL ile etkileşim kuran 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 arayüzü tanımlar.
çekirdek sürücüsü
Kameranın sürücüsü, gerçek kamera donanımı ve HAL uygulamanızla etkileşime girer. Kamera görüntüsünün ekranda önizlenmesi ve video kaydı için kameranın ve sürücünün YV12 ve NV21 görüntü biçimlerini desteklemesi gerekir.

HAL'yi uygulama (eski)

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, kamera kimliği ve tüm kameralarda ortak olan özellikler (ör. ön veya arka kamera olması) gibi kamera hakkında genel bilgi edinmek için standart bir yapı olan camera_common.h'yı tanımlar.camera_module

camera.h, android.hardware.Camera ile eşleşen kodu içeriyor. Bu üst dosya, HAL arayüzünü uygulayan işlevlere yönelik işaretçiler içeren bir camera_device_ops yapısını içeren bir camera_device yapısını tanımlar. Geliştiricilerin ayarlayabileceği kamera parametreleriyle ilgili dokümanlar için frameworks/av/include/camera/CameraParameters.h bölümüne bakın. Bu parametreler, HAL'deki int (*set_parameters)(struct camera_device *, const char *parms) ile işaret edilen işlevle ayarlanır.

HAL uygulaması örneği için hardware/ti/omap4xxx/camera bölümündeki Galaxy Nexus HAL uygulamasına bakın.

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

Android derleme sistemini, HAL uygulamasını doğru şekilde paylaşılan bir kitaplıkta 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 dizini oluşturun.
  2. Paylaşılan kitaplığı oluşturmak için bir Android.mk dosyası oluşturun. Makefile'da aşağıdaki satırların bulunduğundan emin olun:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Kitaplığınızın adı camera.<device_name> (.so otomatik olarak eklenir) olmalıdır. Böylece Android, kitaplığı doğru şekilde yükleyebilir. Örnek olarak, hardware/ti/omap4xxx/Android.mk konumundaki Galaxy Nexus kamerası için makefile dosyasına bakın.

  3. Gerekli özellik XML dosyalarını frameworks/native/data/etc dizininde cihazınızın makefile'ına kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin. Örneğin, cihazınızda kamera flaşı olduğunu ve otomatik odaklanma özelliğinin bulunduğunu belirtmek için cihazınızın <device>/<company_name>/<device_name>/device.mk makefile'ına 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'ı örneği için device/samsung/tuna/device.mk adresini ziyaret edin.

  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 bildirin. Ayrıntılar için Codec'leri çerçeveye aktarma 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 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 PRODUCT_PACKAGES makefile'ında device/<company>/<device>/device.mk değişkeninde belirtin:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...