
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ü uygulamada kullanılabilecek arayüzler sağlar.
Mimari
Aşağıdaki şekil ve listede HAL bileşenleri açıklanmaktadır.

1. şekil. 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, kamera ile etkileşimde bulunan yerel koda erişmek için dahili olarak ilgili 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şmek için daha düşük düzeydeki yerel kodu çağırır ve çerçeve düzeyindeCameraDevice
ve sonundaCameraCaptureSession
nesnelerini oluşturmak için kullanılan verileri döndürür.- yerel çerçeve
frameworks/av/
içinde bulunan bu çerçeve,CameraDevice
veCameraCaptureSession
sınıflarına eşdeğer bir yerel öğe sağlar. Ayrıca NDK camera2 referansı başlıklı makaleyi inceleyin.- bağlayıcı 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ü; veICameraServiceListener
ileICameraDeviceCallbacks
, uygulama çerçevesine yönelik sırasıylaCameraService
veCameraDevice
geri çağırmalarıdır. - kamera servisi
-
frameworks/av/services/camera/libcameraservice/CameraService.cpp
konumunda bulunan 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 daha ü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:
-
ICameraProvider
: Ayrı cihazları listelemek ve durumlarını yönetmek için. -
ICameraDevice
: Kamera cihazı arayüzü. -
ICameraDeviceSession
: Etkin kamera cihazı oturum arayüzü.
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, kamera hizmetinden aktarılan parametrelerin güvenilmeyen ve temizlenmemiş olarak kabul edildiği anlamına gelir. Saldırganların ayrıcalıkları yükseltmesine veya erişmemeleri gereken verilere erişmesine olanak tanıyan güvenlik açıklarını önlemek için kamera HAL'ı, kamera hizmetinden HAL'a iletilen 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 ya da çekirdek sürücülerine iletilmeden önce temizlenir.
Eski HAL bileşenleri
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.

Ş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 bulunur.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ü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,frameworks/av/camera/Camera.cpp
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.- bağlayıcı IPC proxy'leri
- IPC bağlayıcı proxy'leri, işlem sınırları üzerinden iletişimi kolaylaştırır.
frameworks/av/camera
dizininde, kamera hizmetini çağıran üç kamera bağlayıcı sınıfı bulunur.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önüş arayüzüdür. - kamera servisi
-
frameworks/av/services/camera/libcameraservice/CameraService.cpp
konumunda bulunan 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 ve sürücü, ekranda kamera görüntüsünün önizlemesini ve video kaydını desteklemek için YV12 ve NV21 görüntü biçimlerini desteklemelidir.
HAL'yi uygulama (eski)
HAL, kamera sürücüsü ile daha ü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 hakkında genel bilgiler (ör. kamera kimliği ve tüm kameralarda ortak olan özellikler (ön veya arka kamera olup olmadığı)) elde etmek 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 başlık dosyası, 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ı bildirir. 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ı paylaşılan bir kitaplıkta doğru şekilde paketleyecek ve Android.mk
dosyası oluşturarak uygun konuma kopyalayacak şekilde 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
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. - 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
sayfasına bakın. - Kameranızın medya codec'i, biçimi ve çözünürlük özelliklerini
device/<company_name>/<device_name>/media_profiles.xml
vedevice/<company_name>/<device_name>/media_codecs.xml
XML dosyalarında bildirin. Ayrıntılar için Exposing codecs to the framework başlıklı makaleyi inceleyin. 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
device/<company>/<device>/device.mk
makefile'ındaPRODUCT_PACKAGES
değişkeninde belirtin:PRODUCT_PACKAGES := \ Gallery2 \ ...