Kamera

Android Kamera HAL simgesi

Android'in kamera donanımı soyutlama katmanı (HAL), Kamera 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 sizin sürümünüzü uygulamada kullanılacak arayüzler 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 arayüzlerini çağırır.
AIDL
CameraService ile ilişkili ciltleyici arayüzü , 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 sonunda CameraCaptureSession nesnelerini çerçeve düzeyinde 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 yerel bir eşdeğer sağlar. Ayrıca bkz. NDK kamera2 referansı .
bağlayıcı IPC arayüzü
IPC bağlayıcı arayüzü, süreç sınırları üzerinden iletişimi kolaylaştırır. frameworks/av/camera/camera/aidl/android/hardware dizininde kamera servisini çağıran birkaç kamera ciltleme 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; ve ICameraServiceListener ve ICameraDeviceCallbacks , uygulama çerçevesine yönelik ilgili CameraService ve CameraDevice geri çağrılarıdır.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp konumunda 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 arayüzü tanımlar.

HAL'in uygulanması

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çin HIDL arayüzleri donanım/arayüzler/kamera içinde tanımlanır.

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

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'dan itibaren Kamera HAL uygulamalarının HIDL API'sini kullanması gerekir; eski arayüzün kullanımı desteklenmez.

Giriş doğrulama

HAL'in kamera hizmetinden farklı kaynaklara erişimi olduğundan, ikisi arasındaki sınır güvenlik sınırı olarak ele alınır. Bu, kamera hizmetinden iletilen parametrelerin güvenilmez ve sterilize edilmemiş olarak kabul edildiği anlamına gelir. 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'inin, kamera hizmetinden HAL'e iletilen parametreleri doğrulaması gerekir. Bu, arabellek uzunluğu değerlerinin izin verilen aralıklarda olup olmadığının kontrol edilmesini ve parametrelerin kullanımdan önce ve bunları donanıma veya çekirdek sürücülerine aktarmadan önce temizlenmesini içerir.

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 üzeri sürümlerdeki Kamera HAL uygulamaları, yukarıda açıklanan şekilde HIDL API'sini kullanmalıdır.

Mimarlık (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. 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 konumunda bulunur. Bu kod, fiziksel kameraya erişim sağlamak 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 dosyasında 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 sağlamak 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. frameworks/av/camera dizininde bulunan ve kamera servisini çağıran üç kamera ciltleme sınıfı vardır. 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 arayüzüdür.
kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp konumunda 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 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şime girer. Kamera görüntüsünün ekranda önizlenmesine ve video kaydına destek sağlamak için kamera ve sürücünün YV12 ve NV21 görüntü formatlarını desteklemesi gerekir.

HAL'in uygulanması (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 başlık dosyalarında tanımlanır.

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

camera.h android.hardware.Camera karşılık gelen kodu içerir. Bu başlık dosyası, HAL arayüzünü uygulayan işlevlere yönelik işaretçileri içeren bir camera_device_ops yapısını içeren bir camera_device yapısını bildirir. Geliştiricilerin ayarlayabileceği kamera parametrelerine ilişkin belgeler için frameworks/av/include/camera/CameraParameters.h adresine bakın. Bu parametreler, HAL'de 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 adresindeki 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 ve bir Android.mk dosyası oluşturarak bunu uygun konuma kopyalamak için Android derleme sistemini kurun:

  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'ın aşağıdaki satırları içerdiğinden emin olun:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

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

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

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

  4. Kameranızın medya codec'ini, formatını ve çözünürlük yeteneklerini 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 bkz. Codec bileşenlerini çerçeveye sunma .
  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 eklemek için bunu cihazınızın device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...
    
    adresindeki PRODUCT_PACKAGES değişkeninde belirtin.