
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.

Ş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 veCameraDevice
ve sonundaCameraCaptureSession
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
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ü, 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; veICameraServiceListener
veICameraDeviceCallbacks
, uygulama çerçevesine yönelik ilgiliCameraService
veCameraDevice
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:
-
ICameraProvider
: Bireysel 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'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.

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