
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 sürümünün uygulanmasında kullanılmak üzere arayüzler sağlar.
Mimari
Aşağıdaki şekil ve liste HAL bileşenlerini açıklamaktadır.

Şekil 1. Kamera mimarisi
- uygulama çerçevesi
- Uygulama çerçevesi düzeyinde, kamera donanımı ile etkileşim kurmak için Camera 2 API'sini kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod kamera ile etkileşime giren yerel koda erişmek için karşılık gelen Binder arayüzlerini çağırır.
- AIDL
-
CameraService
ile ilişkili bağlayıcı arayüzü, frameworks / av / camera / aidl / android / hardware adresinde bulunabilir . Oluşturulan kod, fiziksel kameraya erişim sağlamak için daha düşük seviyeli yerel kodu çağırır veCameraDevice
ve nihayetinde çerçeve seviyesindeCameraCaptureSession
nesnelerini oluşturmak için kullanılan verileri döndürür. - yerel çerçeve
-
frameworks/av/
bulunan buframeworks/av/
,CameraDevice
veCameraCaptureSession
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ü, işlem sınırları üzerinden iletişimi kolaylaştırır. Kamera hizmetini çağıran
frameworks/av/camera/camera/aidl/android/hardware
dizininde bulunan birkaç kamera bağlayıcı sınıfı vardır.ICameraService
, kamera hizmetinin arabirimidir;ICameraDeviceUser
, belirli bir açık kamera cihazının arabirimidir; veICameraServiceListener
veICameraDeviceCallbacks
ilgili olanCameraService
veCameraDevice
uygulama çerçevesi için geri çağırma. - kamera servisi
-
frameworks/av/services/camera/libcameraservice/CameraService.cpp
bulunan kamera hizmeti, HAL ile etkileşime giren gerçek koddur. - HAL
- Donanım soyutlama katmanı, kamera servisinin çağırdığı ve kamera donanımınızın doğru çalışması için uygulamanız gereken standart arayüzü tanımlar.
HAL'nin Uygulanması
HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında oturur 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 / kamerada tanımlanmıştır.
Tipik bir ciltlenmiş HAL, aşağıdaki HIDL arayüzlerini uygulamalıdır:
-
ICameraProvider
: Ayrı cihazları numaralandırmak ve durumlarını yönetmek için. -
ICameraDevice
: Kamera cihazı arayüzü. -
ICameraDeviceSession
: Aktif kamera cihazı oturumu arayüzü.
Referans HIDL uygulamaları için kullanılabilir CameraProvider.cpp
, CameraDevice.cpp
, ve CameraDeviceSession.cpp
. Uygulama, hala eski API'yi kullanan eski HAL'leri sarar. Android 8.0'dan başlayarak, Kamera HAL uygulamaları HIDL API'sini kullanmalıdır; eski arayüzün kullanımı desteklenmez.
Eski HAL bileşenleri
Bu bölüm, eski HAL bileşenlerinin mimarisini ve HAL'nin nasıl uygulanacağını açıklamaktadır. Android 8.0 ve sonraki sürümlerdeki kamera HAL uygulamaları, yukarıda açıklanan bunun yerine HIDL API'yi kullanmalıdır.
Mimari (eski)
Aşağıdaki şekil ve liste eski kamera HAL bileşenlerini açıklamaktadır.

Şekil 2. Eski kamera mimarisi
- uygulama çerçevesi
- Uygulama çerçevesi düzeyinde, kamera donanımı ile etkileşim kurmak için
android.hardware.Camera
API'sini kullanan uygulamanın kodu bulunur. Dahili olarak, bu kod, kamera ile etkileşime giren yerel koda erişmek için karşılık gelen bir JNI glue sınıfını çağırır. - JNI
- İle ilişkili JNI'yı kodu
android.hardware.Camera
bulunanframeworks/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 çerçeve düzeyindeandroid.hardware.Camera
nesnesini oluşturmak için kullanılan verileri döndürür. - yerel çerçeve
-
frameworks/av/camera/Camera.cpp
çerçevelerinde 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ı vekillerini çağırır. - bağlayıcı IPC proxy'leri
- IPC bağlayıcı vekilleri, süreç sınırları üzerinde 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 aygıtının arabirimidir veICameraClient
, aygıtın uygulama çerçevesine geri dönen arabirimidir. - kamera servisi
-
frameworks/av/services/camera/libcameraservice/CameraService.cpp
bulunan kamera hizmeti, HAL ile etkileşime giren gerçek koddur. - HAL
- Donanım soyutlama katmanı, kamera servisinin çağırdığı ve kamera donanımınızın doğru ç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ız ile etkileşime girer. Kamera ve sürücü, kamera görüntüsünün ekranda önizlenmesi ve video kaydı için destek sağlamak üzere YV12 ve NV21 görüntü formatlarını desteklemelidir.
HAL'nin (eski) uygulanması
HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında oturur 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
tanımlar camera_module
, standart bir yapı, (bir ön veya arka tarafa bakan kamera olup olmadığı, yani) her kamera için kamera İD ve özellikleri ortak olarak kamera ile ilgili genel bilgiler elde edilmiştir.
camera.h
, android.hardware.Camera
karşılık gelen kodu içerir. Bu başlık dosyası beyan camera_device
sırayla bir içerdiğini yapı camera_device_ops
HAL arabirimini uygulamak işlevlerine işaretçiler ile yapı. Geliştiricilerin ayarlayabileceği kamera parametreleri ile ilgili belgeler için, frameworks/av/include/camera/CameraParameters.h
. Bu parametreler, int (*set_parameters)(struct camera_device *, const char *parms)
ile gösterilen fonksiyonla 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ı doğru bir şekilde paylaşılan bir kitaplıkta paketlemek ve bir Android.mk
dosyası oluşturarak uygun konuma kopyalamak için Android yapı sistemini ayarlayın:
- Kitaplığınızın kaynak dosyalarını içerecek bir
device/<company_name>/<device_name>/camera
dizini oluşturun. - 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
camera.<device_name>
olarak adlandırılmalıdırcamera.<device_name>
(.so
otomatik olarak eklenir), böylece Android kitaplığı doğru şekilde yükleyebilir. Bir örnek için,hardware/ti/omap4xxx/Android.mk
içinde bulunan Galaxy Nexus kamera makefile bakın. - 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şı olduğunu ve otomatik odaklama yapabildiğini belirtmek için, 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 \
Bir cihaz makefile örneği için, bakınız
device/samsung/tuna/device.mk
. -
device/<company_name>/<device_name>/media_profiles.xml
vedevice/<company_name>/<device_name>/media_codecs.xml
XML dosyalarında kameranızın ortam codec bileşenini, biçimini ve çözünürlük yeteneklerinidevice/<company_name>/<device_name>/media_codecs.xml
. Ayrıntılar için bkz. Kodekleri çerçeveye açığa çıkarma . -
media_profiles.xml
vemedia_codecs.xml
dosyalarını uygun konuma kopyalamak için cihazınızındevice/<company_name>/<device_name>/device.mk
makefile 'a 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
- Kamera uygulamasını cihazınızın sistem görüntüsüne dahil etmek için, bunu cihazınızın
device/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...
'dekiPRODUCT_PACKAGES
değişkeninde belirtin