Kamera

Android Kamera HAL simgesi

Android'in kamera donanım soyutlama katmanı (HAL), üst düzey veri kümelerini kamera çerçevesi API'lerini Kamera 2'yi temel kamera sürücüsü ve donanımınıza bağlayın. Kamera alt sistemi kamera donanım soyutlama katmanı (HAL) kullanırken kamera ardışık düzeni bileşenleri için uygulamaları içerir. bu sürümlerden birini uygularken kullanabileceğiniz arayüzler sağlar: bileşenlerine ayıralım.

Mimari

Aşağıdaki şekilde ve listede HAL bileşenleri açıklanmaktadır.

Android kamera mimarisi

Şekil 1. Kamera mimarisi

uygulama çerçevesi
Uygulama çerçevesi düzeyinde, uygulamanın kodu Kamera 2 API'sini kullanarak kamera donanımıyla etkileşime geçin. Bu kod, şirket içinde karşılık gelen aramalar Bağlayıcı arayüzleri, bulun.
AIDL
CameraService ile ilişkilendirilen bağlayıcı arayüzü bulundu çerçeveler/av/kamera/aidl/android/dondware. Oluşturulan kod fiziksel bir kameranın yerini alır ve CameraDevice ve sonrasında Çerçeve düzeyinde CameraCaptureSession nesne var.
yerel çerçeve
frameworks/av/ bölgesinde bulunan bu çerçeve, yerel eşdeğeri CameraDevice ve CameraCaptureSession sınıflar. Şu kaynakları da inceleyin NDK Camera2 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. Şurada bulunan birkaç kamera bağlayıcı sınıfı vardır: frameworks/av/camera/camera/aidl/android/hardware dizini çağrısını yapacaksınız. ICameraService, kamera hizmetinin arayüzüdür; ICameraDeviceUser, açılan belirli bir uygulamanın arayüzüdür kamera cihazı; ve ICameraServiceListener ve ICameraDeviceCallbacks, CameraService ve CameraDevice iki önemli adım var.
kamera hizmeti
Bulundukları konumdaki kamera hizmeti frameworks/av/services/camera/libcameraservice/CameraService.cpp, HAL ile etkileşimde bulunan gerçek koddur.
HAL
Donanım soyutlama katmanı, ve kameranızın olması için uygulamanız gereken düzgün şekilde çalışmasını sağlamayabilir.

HAL'yi uygulama

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında bulunur ve uygulamaların doğru şekilde çalışabilmesi için uygulamanız gereken bir arayüz tanımlar. donanım da dahil değil. HIDL Kamera HAL'sinin arayüzleri şurada tanımlanmıştır: donanım/arayüzler/kamera.

Tipik bir bağlama HAL, aşağıdaki HIDL arayüzlerini uygulamalıdır:

Şunlar için referans HIDL uygulamaları kullanılabilir: CameraProvider.cpp CameraDevice.cpp ve CameraDeviceSession.cpp. Uygulama, hâlâ eski API. Android 8.0'dan itibaren, Kamera HAL uygulamaları HIDL API'yi kullanmalıdır; kullan çoğu sürüm desteklenmiyor.

Giriş doğrulaması

HAL'nin, kamera hizmetinden farklı kaynaklara erişimi olduğundan, ikisi de güvenlik sınırı olarak kabul edilir. Bu, kamera hizmetinden geçirilen parametrelerin güvenilmez ve gerekli düzeltmeler yapılmamış olarak kabul edilir. Saldırganların erişimine açık olan güvenlik açıklarını önlemek için ayrıcalıkları eskale etme veya erişimi amaçlanmayan verilere erişim sağlama. Kamera HAL'si, Kamera hizmetinden HAL'ye aktarılan parametreleri doğrular. Bu, arabelleği kontrol etmek ve uzunluk değerleri izin verilen aralıklar dahilinde olmalı ve parametreler kullanılmadan önce ve kullanılmadan önce sterilize edilmelidir. bu kodları donanım veya çekirdek sürücülerine iletir.

Eski HAL bileşenleri

Bu bölümde, eski HAL bileşenlerinin mimarisi ve bunların nasıl HAL'yi uygulamalısınız. Android 8.0 ve sonraki sürümlerdeki kamera HAL uygulamaları HIDL API'sini kullanabilirsiniz.

Mimari (eski)

Aşağıdaki şekilde 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, uygulamanın kodu android.hardware.Camera Kamera donanımıyla etkileşim API'si. Dahili olarak bu kod, etkileşime giren yerel koda erişmek için ilgili JNI birleştirici sınıfını bulun.
JNI
Şununla ilişkili JNI kodu: android.hardware.Camera şuradadır: frameworks/base/core/jni/android_hardware_Camera.cpp. Bu kod Fiziksel kameraya erişmek için alt düzey yerel kodu çağırır. ve Search Ads 360'taki Çerçeve düzeyindeki android.hardware.Camera nesnesini ifade eder.
yerel çerçeve
frameworks/av/camera/Camera.cpp içinde tanımlanan yerel çerçeve yerel olarak eşdeğeri android.hardware.Camera sınıfı. Bu sınıf, IPC'yi çağırır bağlayıcı proxy'leri kullanarak kameranızın kullanılmasına olanak sağlar.
bağlayıcı IPC proxy'leri
IPC bağlayıcı proxy'leri, süreç sınırları üzerinden iletişimi kolaylaştırır. Aynı konumda bulunan üç kamera bağlayıcı sınıfı Kamera hizmetine çağrı yapan frameworks/av/camera dizini. ICameraService, kamera hizmetinin arayüzü. ICamera, belirli bir açık kamera cihazının arayüzüdür. ICameraClient de öncekinden itibaren cihazın iki önemli adım var.
kamera hizmeti
Bulundukları konumdaki kamera hizmeti frameworks/av/services/camera/libcameraservice/CameraService.cpp, HAL ile etkileşimde bulunan gerçek koddur.
HAL
Donanım soyutlama katmanı, ve kameranızın olması için uygulamanız gereken düzgün şekilde çalışmasını sağlamayabilir.
çekirdek sürücüsü
Kameranın sürücüsü, gerçek kamera donanımıyla ve ele alacağız. Kamera ve sürücü YV12 ve NV21'i desteklemelidir kamera görüntüsünün görüntü ve video kaydı.

HAL'yi uygulama (eski)

HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında bulunur ve uygulamaların doğru şekilde çalışabilmesi için uygulamanız gereken bir arayüz tanımlar. donanım da dahil değil. HAL arayüzü, hardware/libhardware/include/hardware/camera.h ve hardware/libhardware/include/hardware/camera_common.h başlık dosyası.

camera_common.h, bir standart olan camera_module değerini tanımlar kamera kimliği veya kamera kimliği gibi genel bilgileri almak için kullanılan yapıyı tüm kameralarda ortak olan özellikleri (yani, ön veya alt .

camera.h, android.hardware.Camera. Bu başlık dosyası şunu tanımlar: camera_device, sırayla bir Uygulayan işlevler için işaretçilerle camera_device_ops struct HAL arayüzü. Kamera parametreleriyle ilgili belgeler için frameworks/av/include/camera/CameraParameters.h konusuna bakın. Bu parametreler, HAL'de int (*set_parameters)(struct camera_device *, const char *parms) tarafından işaret edilen işlevle ayarlanır.

HAL uygulaması örneği için, hardware/ti/omap4xxx/camera Galaxy Nexus HAL.

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

HAL uygulamasını doğru şekilde paketlemek için Android derleme sistemini ayarlama paylaşılan bir kitaplığa kopyalama ve bir Android.mk dosyası:

  1. Bir device/<company_name>/<device_name>/camera oluşturun dizininizin olması gerekir.
  2. Paylaşılan kitaplığı oluşturmak için bir Android.mk dosyası oluşturun. Emin olun hazırla dosyası şu satırları içerir:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Kitaplığınız camera.<device_name> olarak adlandırılmalıdır. (.so otomatik olarak eklenir). Böylece Android, kitaplığını açar. Bir örnek olarak, hardware/ti/omap4xxx/Android.mk

  3. Gerekli özellik XML dosyasını kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin frameworks/native/data/etc dizinindeki dosyalarınızı dosyanın kalıcı bir kopyasını oluşturun. Örneğin, cihazınızda bir kamera flaşı olduğunu belirtmek otomatik odaklama kurabiliyorsanız, aşağıdaki satırları cihazınızın <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 \
    

    Cihaz oluşturma dosyası örneği için bkz. device/samsung/tuna/device.mk

  4. Kameranızın medya codec'ini, biçimini 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ı. Ayrıntılar için bkz. Codec'leri çerçevesini kullanın.
  5. Aşağıdaki satırları cihazınızın device/<company_name>/<device_name>/device.mk dosya oluşturma (media_profiles.xml ve media_codecs.xml öğelerini kopyalamak için) uygun konuma taşıyın:
    # 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 PRODUCT_PACKAGES değişkeni device/<company>/<device>/device.mk Makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...