![Android Kamera HAL simgesi](https://source.android.com/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=3&hl=tr)
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 ardışık düzeni bileşenlerinin uygulamalarını içerirken kamera HAL'i, bu bileşenlerin kendi sürümünüzü uygulamada kullanılacak arayüzleri sağlar.
Mimari
Aşağıdaki şekil ve listede HAL bileşenleri açıklanmaktadır.
![Android kamera mimarisi](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=3&hl=tr)
Şekil 1. Kamera mimarisi
- uygulama çerçevesi
- Uygulama çerçevesi düzeyinde, kamera donanımıyla etkileşim kurmak için Camera 2 API'yi kullanan uygulama kodu bulunur. Bu kod, kamerayla etkileşime giren 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ünü frameworks/av/camera/aidl/android/hardware adresinde bulabilirsiniz. Oluşturulan kod, fiziksel kameraya erişim elde etmek için alt düzey yerel kodu çağırır veCameraDevice
ve nihayetindeCameraCaptureSession
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 doğal bir eşdeğer sağlar. Ayrıca NDK camera2 referansı başlıklı makaleye de bakın.- binder IPC arayüzü
- IPC bağlayıcı arayüzü, işlem 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 arayüzüdür;ICameraDeviceUser
, belirli bir açık kamera cihazının arayüzüdür;ICameraServiceListener
veICameraDeviceCallbacks
ise uygulama çerçevesine yönelikCameraService
veCameraDevice
geri çağırma işlevleridir. - kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp
bölümünde 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 düzgün çalışması için uygulamanız gereken standart arayüzü tanımlar.
HAL'i 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 arayüz tanımlar. Kamera HAL'i için HIDL arayüzleri hardware/interfaces/camera altında tanımlanır.
Tipik bir bağlayıcı HAL'i 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
: Etkin kamera cihazı oturum arayüzü.
Referans HIDL uygulamaları CameraProvider.cpp
,
CameraDevice.cpp
ve CameraDeviceSession.cpp
için kullanılabilir.
Uygulama, hâlâ eski API kullanan eski HAL'leri sarmalıyor.
Android 8.0'dan itibaren, Kamera HAL uygulamalarında HIDL API kullanılmalı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 bir güvenlik sınırı olarak kabul edilir. Bu, kamera hizmetinden iletilen parametrelerin güvenilmediği ve temizlenmediği anlamına gelir. Saldırganların ayrıcalıkları artırmasına 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 işlemler arasında, arabellek uzunluğu değerlerinin izin verilen aralıklar içinde olup olmadığını kontrol etme ve parametreleri kullanmadan önce ve donanım veya çekirdek sürücülerine aktarmadan önce temizleme yer alır.
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 sonraki sürümlerdeki kamera HAL uygulamalarında, yukarıda açıklanan HIDL API'nin kullanılması gerekir.
Mimari (eski)
Aşağıdaki şekil ve listede eski kamera HAL bileşenleri açıklanmaktadır.
![Android kamera mimarisi](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera.png?authuser=3&hl=tr)
Ş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'yi kullanan uygulama kodu bulunur. Bu kod, kamerayla etkileşime geçen yerel koda erişmek için dahili olarak ilgili bir JNI yapıştırıcı sınıfını çağırır. - JNI
-
android.hardware.Camera
ile ilişkili JNI kodu şurada bulunur:frameworks/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 veandroid.hardware.Camera
nesnesini çerçeve düzeyinde 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 eşdeğer bir yerel sınıf sağlar. Bu sınıf, kamera hizmetine erişim elde etmek için IPC bağlama aracısı proxy'lerini çağırır.- binder IPC proxy'leri
- IPC bağlayıcı proxy'leri, işlem sınırları üzerinden iletişimi kolaylaştırır.
Kamera hizmetini çağıran
frameworks/av/camera
dizininde üç kamera bağlayıcı sınıfı bulunur.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 dönük arayüzüdür. - kamera servisi
frameworks/av/services/camera/libcameraservice/CameraService.cpp
bölümünde 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 düzgün ç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şim kurar. Kamera ve sürücü, kamera görüntüsünün ekranda önizlenmesi ve video kaydı için YV12 ve NV21 resim biçimlerini desteklemelidir.
HAL'yi (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 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
, kamerayla ilgili genel bilgileri (ör. kamera kimliği ve tüm kameralarda ortak olan özellikler (ör. ön veya arka kamera olup olmadığı)) almak için standart bir yapı olan camera_module
'yi tanımlar.
camera.h
,
android.hardware.Camera
ile eşleşen kod içerir. Bu başlık dosyası, HAL arayüzünü uygulayan işlevlerin işaretçilerini içeren bir camera_device_ops
yapısı içeren bir camera_device
yapısı tanımlar. Geliştiricilerin ayarlayabileceği kamera parametreleri hakkında dokümanlar için frameworks/av/include/camera/CameraParameters.h
bölümüne bakın.
Bu parametreler, HAL'de int
(*set_parameters)(struct camera_device *, const char *parms)
tarafından işaretlenen işlevle ayarlanır.
HAL uygulaması örneği için hardware/ti/omap4xxx/camera
'teki Galaxy Nexus HAL uygulamasına bakın.
Paylaşılan kitaplığı yapılandırma
Android derleme sistemini, HAL uygulamasını paylaşılan bir kitaplığa 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
dizin oluşturun. - Paylaşılan kitaplığı oluşturmak için bir
Android.mk
dosyası oluşturun. Makefile'in aşağıdaki satırları içerdiğinden emin olun:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Android'in kitaplığı doğru şekilde yükleyebilmesi için kitaplığınız
camera.<device_name>
şeklinde adlandırılmalıdır (.so
otomatik olarak eklenir). Örnek olarak,hardware/ti/omap4xxx/Android.mk
konumundaki Galaxy Nexus kamerasının makefile dosyasını inceleyebilirsiniz. - Cihazınızın makefile'iyle birlikte
frameworks/native/data/etc
dizininde gerekli özellik XML dosyalarını kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin. Örneğin, cihazınızın kamera flaşını ve otomatik odaklama özelliğini belirtmek için cihazınızın<device>/<company_name>/<device_name>/device.mk
makefile'ine 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'i örneği için
device/samsung/tuna/device.mk
bölümüne 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 belirtin. Ayrıntılar için Kodeklerin çerçeveye gösterilmesi 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'ine 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 resmine dahil etmek için cihazınızın
device/<company>/<device>/device.mk
makefile'indekiPRODUCT_PACKAGES
değişkeninde belirtin:PRODUCT_PACKAGES := \ Gallery2 \ ...