
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 boru hattı bileşenleri için uygulamaları içerirken, kamera HAL'ı bu bileşenlerin sürümünüzü uygulamada kullanmanız için arabirimler 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ı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 arabirimlerini çağırır.
- AIDL
-
CameraService
ile ilişkili bağlayıcı arabirimi, 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 veCameraDevice
ve nihayetindeCameraCaptureSession
nesnelerini çerçeve seviyesinde oluşturmak için kullanılan verileri döndürür. - yerel çerçeve
-
frameworks/av/
,CameraDevice
veCameraCaptureSession
sınıflarına yerel bir eşdeğer sağlar. Ayrıca bkz. NDK camera2 referansı . - bağlayıcı IPC arayüzü
- IPC bağlayıcı arabirimi, süreç 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 arabirimidir;ICameraDeviceUser
, belirli bir açık kamera cihazının arabirimidir; veICameraServiceListener
veICameraDeviceCallbacks
, uygulama çerçevesine ilişkinCameraService
veCameraDevice
geri aramalarıdır. - kamera servisi
-
frameworks/av/services/camera/libcameraservice/CameraService.cpp
içinde 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 arabirimi tanımlar.
HAL'ı uygulamak
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 arabirim tanımlar. Camera HAL için HIDL arabirimleri, donanım/arayüzler/kamera içinde tanımlanır.
Tipik bir ciltlenmiş HAL, aşağıdaki HIDL arabirimlerini uygulamalıdır:
-
ICameraProvider
: Tek tek cihazları numaralandırmak ve durumlarını yönetmek için. -
ICameraDevice
: Kamera cihazı arayüzü. -
ICameraDeviceSession
: Aktif kamera cihazı oturum arayüzü.
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 ile başlayarak, Camera HAL uygulamaları HIDL API'sini kullanmalıdır; eski arayüzün kullanımı desteklenmez.
Giriş doğrulama
HAL'ın kamera hizmetinden farklı kaynaklara erişimi olduğundan, ikisi arasındaki sınır bir güvenlik sınırı olarak kabul edilir. Bu, kamera hizmetinden geçirilen parametrelerin güvenilmez ve temizlenmemiş olarak kabul edildiği anlamına gelir. Saldırganların ayrıcalıkları yükseltmesine veya erişmesi amaçlanmayan verilere erişmesine izin veren güvenlik açıklarını önlemek için kamera HAL'ının, kamera hizmetinden HAL'e geçirilen parametreleri doğrulaması gerekir. Bu, arabellek uzunluğu değerlerinin izin verilen aralıklarda olup olmadığının kontrol edilmesini ve kullanımdan önce ve donanım veya çekirdek sürücülerine iletilmeden önce parametrelerin sterilize edilmesini içerir.
Eski HAL bileşenleri
Bu bölüm, eski HAL bileşenlerinin mimarisini ve HAL'in nasıl uygulanacağını açıklar. Android 8.0 ve sonraki sürümlerde kamera HAL uygulamaları, bunun yerine yukarıda açıklanan HIDL API'sini 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ı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
içinde bulunur. 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
içinde 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ı 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. 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 cihazının arabirimidir veICameraClient
, cihazın uygulama çerçevesine geri dönen arabirimidir. - kamera servisi
-
frameworks/av/services/camera/libcameraservice/CameraService.cpp
içinde 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 arabirimi 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ü ekranda önizleme ve video kaydı için destek sağlamak için YV12 ve NV21 görüntü formatlarını desteklemelidir.
HAL'ı (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 arabirim 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ımlanmıştır.
camera_common.h
, kamera kimliği ve tüm kameralarda ortak olan özellikler (yani, öne veya arkaya bakan bir kamera olup olmadığı) gibi kamera hakkında genel bilgileri elde etmek için standart bir yapı olan camera_module
öğesini tanımlar.
camera.h
, android.hardware.Camera
öğesine karşılık gelen kodu içerir. Bu başlık dosyası, HAL arabirimini uygulayan işlevlere işaretçiler içeren bir camera_device_ops
yapısı içeren bir camera_device
yapısı bildirir. Geliştiricilerin ayarlayabileceği kamera parametreleriyle ilgili belgeler için frameworks/av/include/camera/CameraParameters.h
. Bu parametreler, 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
içindeki 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 için Android derleme sistemini kurun ve bir Android.mk
dosyası oluşturarak uygun konuma kopyalayın:
- Kitaplığınızın kaynak dosyalarını içermek için bir
device/<company_name>/<device_name>/camera
dizini oluşturun. - Paylaşılan kitaplığı oluşturmak için bir
Android.mk
dosyası oluşturun. makefile dosyasını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>
(.so
otomatik olarak eklenir), böylece Android kitaplığı doğru şekilde yükleyebilir. Örnek olarak,hardware/ti/omap4xxx/Android.mk
bulunan Galaxy Nexus kameranın makefile dosyasına 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şına sahip olduğunu ve otomatik odaklama yapabildiğini belirtmek için, cihazınızın<device>/<company_name>/<device_name>/device.mk
makefile dosyasına şu 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
. -
device/<company_name>/<device_name>/media_profiles.xml
vedevice/<company_name>/<device_name>/media_codecs.xml
XML dosyalarında kameranızın medya codec bileşenini, biçimini ve çözünürlük özelliklerini bildirin. Ayrıntılar için bkz. Codec'leri çerçeveye gösterme . -
media_profiles.xml
vemedia_codecs.xml
dosyalarını uygun konuma kopyalamak için cihazınızındevice/<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
- Kamera uygulamasını cihazınızın sistem görüntüsüne dahil etmek için cihazınızın cihazındaki
PRODUCT_PACKAGES
değişkeninde belirtindevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...