![Android Kamera HAL simgesi](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=1&hl=tr)
Android'in kamera donanım soyutlama katmanı (HAL), üst düzey veri kümelerini kamera çerçevesi API'lerini Kamera 2'yi temel kamera sürücüsü ve donanımınıza bağlayın. Kamera alt sistemi kamera donanım soyutlama katmanı (HAL) kullanırken kamera ardışık düzeni bileşenleri için uygulamaları içerir. bu sürümlerden birini uygularken kullanabileceğiniz arayüzler sağlar: bileşenlerine ayıralım.
Mimari
Aşağıdaki şekilde ve listede HAL bileşenleri açıklanmaktadır.
![Android kamera mimarisi](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=1&hl=tr)
Şekil 1. Kamera mimarisi
- uygulama çerçevesi
- Uygulama çerçevesi düzeyinde, uygulamanın kodu Kamera 2 API'sini kullanarak kamera donanımıyla etkileşime geçin. Bu kod, şirket içinde karşılık gelen aramalar Bağlayıcı arayüzleri, bulun.
- AIDL
CameraService
ile ilişkilendirilen bağlayıcı arayüzü bulundu çerçeveler/av/kamera/aidl/android/dondware. Oluşturulan kod fiziksel bir kameranın yerini alır veCameraDevice
ve sonrasında Çerçeve düzeyindeCameraCaptureSession
nesne var.- yerel çerçeve
frameworks/av/
bölgesinde bulunan bu çerçeve, yerel eşdeğeriCameraDevice
veCameraCaptureSession
sınıflar. Şu kaynakları da inceleyin NDK Camera2 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.
Şurada bulunan birkaç kamera bağlayıcı sınıfı vardır:
frameworks/av/camera/camera/aidl/android/hardware
dizini çağrısını yapacaksınız.ICameraService
, kamera hizmetinin arayüzüdür;ICameraDeviceUser
, açılan belirli bir uygulamanın arayüzüdür kamera cihazı; veICameraServiceListener
veICameraDeviceCallbacks
,CameraService
veCameraDevice
iki önemli adım var. - kamera hizmeti
- Bulundukları konumdaki kamera hizmeti
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, HAL ile etkileşimde bulunan gerçek koddur. - HAL
- Donanım soyutlama katmanı, ve kameranızın olması için uygulamanız gereken düzgün şekilde çalışmasını sağlamayabilir.
HAL'yi uygulama
HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında bulunur ve uygulamaların doğru şekilde çalışabilmesi için uygulamanız gereken bir arayüz tanımlar. donanım da dahil değil. HIDL Kamera HAL'sinin arayüzleri şurada tanımlanmıştır: donanım/arayüzler/kamera.
Tipik bir bağlama HAL, aşağıdaki HIDL arayüzlerini uygulamalıdır:
-
ICameraProvider
: Cihazları tek tek numaralandırmak ve durumlarını yönetmek için kullanılır. -
ICameraDevice
: Kamera cihazının arayüzü. -
ICameraDeviceSession
: Etkin kamera cihazının oturum arayüzü.
Şunlar için referans HIDL uygulamaları kullanılabilir:
CameraProvider.cpp
CameraDevice.cpp
ve
CameraDeviceSession.cpp
.
Uygulama, hâlâ
eski API.
Android 8.0'dan itibaren, Kamera HAL uygulamaları HIDL API'yi kullanmalıdır; kullan
çoğu sürüm desteklenmiyor.
Giriş doğrulaması
HAL'nin, kamera hizmetinden farklı kaynaklara erişimi olduğundan, ikisi de güvenlik sınırı olarak kabul edilir. Bu, kamera hizmetinden geçirilen parametrelerin güvenilmez ve gerekli düzeltmeler yapılmamış olarak kabul edilir. Saldırganların erişimine açık olan güvenlik açıklarını önlemek için ayrıcalıkları eskale etme veya erişimi amaçlanmayan verilere erişim sağlama. Kamera HAL'si, Kamera hizmetinden HAL'ye aktarılan parametreleri doğrular. Bu, arabelleği kontrol etmek ve uzunluk değerleri izin verilen aralıklar dahilinde olmalı ve parametreler kullanılmadan önce ve kullanılmadan önce sterilize edilmelidir. bu kodları donanım veya çekirdek sürücülerine iletir.
Eski HAL bileşenleri
Bu bölümde, eski HAL bileşenlerinin mimarisi ve bunların nasıl HAL'yi uygulamalısınız. Android 8.0 ve sonraki sürümlerdeki kamera HAL uygulamaları HIDL API'sini kullanabilirsiniz.
Mimari (eski)
Aşağıdaki şekilde ve listede eski kamera HAL bileşenleri açıklanmaktadır.
![Android kamera mimarisi](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=1&hl=tr)
Şekil 2. Eski kamera mimarisi
- uygulama çerçevesi
- Uygulama çerçevesi düzeyinde, uygulamanın kodu
android.hardware.Camera
Kamera donanımıyla etkileşim API'si. Dahili olarak bu kod, etkileşime giren yerel koda erişmek için ilgili JNI birleştirici sınıfını bulun. - JNI
- Şununla ilişkili JNI kodu:
android.hardware.Camera
şuradadır:frameworks/base/core/jni/android_hardware_Camera.cpp
. Bu kod Fiziksel kameraya erişmek için alt düzey yerel kodu çağırır. ve Search Ads 360'taki Çerçeve düzeyindekiandroid.hardware.Camera
nesnesini ifade eder. - yerel çerçeve
frameworks/av/camera/Camera.cpp
içinde tanımlanan yerel çerçeve yerel olarak eşdeğeriandroid.hardware.Camera
sınıfı. Bu sınıf, IPC'yi çağırır bağlayıcı proxy'leri kullanarak kameranızın kullanılmasına olanak sağlar.- bağlayıcı IPC proxy'leri
- IPC bağlayıcı proxy'leri, süreç sınırları üzerinden iletişimi kolaylaştırır.
Aynı konumda bulunan üç kamera bağlayıcı sınıfı
Kamera hizmetine çağrı yapan
frameworks/av/camera
dizini.ICameraService
, kamera hizmetinin arayüzü.ICamera
, belirli bir açık kamera cihazının arayüzüdür.ICameraClient
de öncekinden itibaren cihazın iki önemli adım var. - kamera hizmeti
- Bulundukları konumdaki kamera hizmeti
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, HAL ile etkileşimde bulunan gerçek koddur. - HAL
- Donanım soyutlama katmanı, ve kameranızın olması için uygulamanız gereken düzgün şekilde çalışmasını sağlamayabilir.
- çekirdek sürücüsü
- Kameranın sürücüsü, gerçek kamera donanımıyla ve ele alacağız. Kamera ve sürücü YV12 ve NV21'i desteklemelidir kamera görüntüsünün görüntü ve video kaydı.
HAL'yi uygulama (eski)
HAL, kamera sürücüsü ile üst düzey Android çerçevesi arasında bulunur
ve uygulamaların doğru şekilde çalışabilmesi için uygulamanız gereken bir arayüz tanımlar.
donanım da dahil değil. HAL arayüzü,
hardware/libhardware/include/hardware/camera.h
ve
hardware/libhardware/include/hardware/camera_common.h
başlık dosyası.
camera_common.h
, bir standart olan camera_module
değerini tanımlar
kamera kimliği veya kamera kimliği gibi genel bilgileri almak için kullanılan yapıyı
tüm kameralarda ortak olan özellikleri (yani, ön veya alt
.
camera.h
,
android.hardware.Camera
. Bu başlık dosyası şunu tanımlar:
camera_device
, sırayla bir
Uygulayan işlevler için işaretçilerle camera_device_ops
struct
HAL arayüzü. Kamera parametreleriyle ilgili belgeler için
frameworks/av/include/camera/CameraParameters.h
konusuna bakın.
Bu parametreler, HAL'de int
(*set_parameters)(struct camera_device *, const char *parms)
tarafından işaret edilen işlevle ayarlanır.
HAL uygulaması örneği için,
hardware/ti/omap4xxx/camera
Galaxy Nexus HAL.
Paylaşılan kitaplığı yapılandırma
HAL uygulamasını doğru şekilde paketlemek için Android derleme sistemini ayarlama
paylaşılan bir kitaplığa kopyalama ve bir
Android.mk
dosyası:
- Bir
device/<company_name>/<device_name>/camera
oluşturun dizininizin olması gerekir. - Paylaşılan kitaplığı oluşturmak için bir
Android.mk
dosyası oluşturun. Emin olun hazırla dosyası şu satırları içerir:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Kitaplığınız
camera.<device_name>
olarak adlandırılmalıdır. (.so
otomatik olarak eklenir). Böylece Android, kitaplığını açar. Bir örnek olarak,hardware/ti/omap4xxx/Android.mk
- Gerekli özellik XML dosyasını kopyalayarak cihazınızın kamera özelliklerine sahip olduğunu belirtin
frameworks/native/data/etc
dizinindeki dosyalarınızı dosyanın kalıcı bir kopyasını oluşturun. Örneğin, cihazınızda bir kamera flaşı olduğunu belirtmek otomatik odaklama kurabiliyorsanız, aşağıdaki satırları 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 \
Cihaz oluşturma dosyası örneği için bkz.
device/samsung/tuna/device.mk
- Kameranızın medya codec'ini, biçimini ve çözünürlük özelliklerini
device/<company_name>/<device_name>/media_profiles.xml
. vedevice/<company_name>/<device_name>/media_codecs.xml
XML dosyaları. Ayrıntılar için bkz. Codec'leri çerçevesini kullanın. - Aşağıdaki satırları cihazınızın
device/<company_name>/<device_name>/device.mk
dosya oluşturma (media_profiles.xml
vemedia_codecs.xml
öğelerini kopyalamak için) uygun konuma taşıyın:# 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
PRODUCT_PACKAGES
değişkenidevice/<company>/<device>/device.mk
Makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...