
Warstwa abstrakcji sprzętu aparatu w systemie Android (HAL) łączy interfejsy API platformy aparatu wyższego poziomu w aplikacji Camera 2 z podstawowym sterownikiem aparatu i sprzętem. Podsystem kamery zawiera implementacje komponentów potoku kamery, podczas gdy warstwa HAL kamery udostępnia interfejsy do wykorzystania podczas implementowania własnej wersji tych komponentów.
Architektura
Poniższy rysunek i lista opisują komponenty HAL.

Rysunek 1. Architektura kamery
- ramy aplikacji
- Na poziomie struktury aplikacji znajduje się kod aplikacji, który wykorzystuje interfejs API Camera 2 do interakcji ze sprzętem kamery. Wewnętrznie ten kod wywołuje odpowiednie interfejsy Bindera , aby uzyskać dostęp do kodu natywnego, który współdziała z kamerą.
- AIDL
- Interfejs segregatora powiązany z
CameraService
można znaleźć pod adresem frameworks/av/camera/aidl/android/hardware . Wygenerowany kod wywołuje kod natywny niższego poziomu w celu uzyskania dostępu do kamery fizycznej i zwraca dane, które są używane do tworzenia obiektówCameraDevice
i ostatecznieCameraCaptureSession
na poziomie platformy. - natywny framework
- Ta struktura znajdująca się w
frameworks/av/
zapewnia natywny odpowiednik klasCameraDevice
iCameraCaptureSession
. Zobacz także informacje o kamerze NDK2 . - interfejs IPC spoiwa
- Interfejs spoiwa IPC ułatwia komunikację ponad granicami procesu. Istnieje kilka klas segregatorów kamer znajdujących się w katalogu
frameworks/av/camera/camera/aidl/android/hardware
które wywołują usługę kamery.ICameraService
to interfejs do usługi kamery;ICameraDeviceUser
to interfejs do konkretnego otwartego urządzenia z kamerą; orazICameraServiceListener
iICameraDeviceCallbacks
są odpowiednimi wywołaniami zwrotnymiCameraService
iCameraDevice
do struktury aplikacji. - serwis kamer
- Usługa kamery, zlokalizowana w
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, to rzeczywisty kod współdziałający z warstwą HAL. - HAL
- Warstwa abstrakcji sprzętu definiuje standardowy interfejs, do którego odwołuje się usługa kamery i który należy zaimplementować, aby sprzęt kamery działał prawidłowo.
Implementacja HAL-a
HAL znajduje się pomiędzy sterownikiem aparatu a platformą Android wyższego poziomu i definiuje interfejs, który należy zaimplementować, aby aplikacje mogły poprawnie obsługiwać sprzęt aparatu. Interfejsy HIDL dla Camera HAL są zdefiniowane w hardware/interfaces/camera .
Typowy powiązany HAL musi implementować następujące interfejsy HIDL:
-
ICameraProvider
: Do wyliczania poszczególnych urządzeń i zarządzania ich stanem. -
ICameraDevice
: Interfejs urządzenia aparatu. -
ICameraDeviceSession
: Aktywny interfejs sesji urządzenia kamery.
Referencyjne implementacje HIDL są dostępne dla CameraProvider.cpp
, CameraDevice.cpp
i CameraDeviceSession.cpp
. Implementacja otacza stare warstwy HAL, które nadal korzystają ze starszego interfejsu API . Począwszy od Androida 8.0, implementacje Camera HAL muszą korzystać z interfejsu API HIDL; użycie starszego interfejsu nie jest obsługiwane.
Walidacja danych wejściowych
Ponieważ warstwa HAL ma dostęp do innych zasobów niż usługa kamery, granica między nimi jest traktowana jako granica bezpieczeństwa. Oznacza to, że parametry przekazywane z usługi kamery są uznawane za niezaufane i niezatwierdzone. Aby zapobiec lukom w zabezpieczeniach, które umożliwiają atakującym zwiększenie uprawnień lub dostęp do danych, do których nie powinni mieć dostępu, warstwa HAL kamery musi sprawdzić parametry przekazywane z usługi kamery do warstwy HAL. Obejmuje to sprawdzanie, czy wartości długości buforów mieszczą się w dopuszczalnych zakresach i oczyszczanie parametrów przed użyciem oraz przed przekazaniem ich do sterowników sprzętu lub jądra.
Starsze komponenty HAL
W tej sekcji opisano architekturę starszych komponentów HAL i sposób implementacji warstwy HAL. Implementacje HAL kamery w systemie Android 8.0 i nowszych wersjach muszą zamiast tego korzystać z interfejsu API HIDL, jak opisano powyżej.
Architektura (dziedzictwo)
Poniższy rysunek i lista opisują komponenty HAL starszej kamery.

Rysunek 2. Starsza architektura aparatu
- ramy aplikacji
- Na poziomie struktury aplikacji znajduje się kod aplikacji, który wykorzystuje interfejs API
android.hardware.Camera
do interakcji ze sprzętem kamery. Wewnętrznie ten kod wywołuje odpowiednią klasę kleju JNI, aby uzyskać dostęp do kodu natywnego, który współdziała z kamerą. - JNI
- Kod JNI powiązany z
android.hardware.Camera
znajduje się wframeworks/base/core/jni/android_hardware_Camera.cpp
. Ten kod wywołuje kod natywny niższego poziomu w celu uzyskania dostępu do kamery fizycznej i zwraca dane, które są używane do tworzenia obiektuandroid.hardware.Camera
na poziomie platformy. - natywny framework
- Natywna struktura zdefiniowana w
frameworks/av/camera/Camera.cpp
zapewnia natywny odpowiednik klasyandroid.hardware.Camera
. Ta klasa wywołuje serwery proxy IPC w celu uzyskania dostępu do usługi kamery. - spoiwo proxy IPC
- Serwery proxy spoiw IPC ułatwiają komunikację ponad granicami procesów. Istnieją trzy klasy segregatorów kamer, które znajdują się w katalogu
frameworks/av/camera
, który wywołuje usługę kamery.ICameraService
to interfejs do usługi kamery,ICamera
to interfejs do określonego otwartego urządzenia z kamerą, aICameraClient
to interfejs urządzenia z powrotem do struktury aplikacji. - serwis kamer
- Usługa kamery, zlokalizowana w
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, to rzeczywisty kod współdziałający z warstwą HAL. - HAL
- Warstwa abstrakcji sprzętu definiuje standardowy interfejs, do którego odwołuje się usługa kamery i który należy zaimplementować, aby sprzęt kamery działał prawidłowo.
- sterownik jądra
- Sterownik kamery współdziała z rzeczywistym sprzętem kamery i implementacją warstwy HAL. Kamera i sterownik muszą obsługiwać formaty obrazu YV12 i NV21, aby zapewnić obsługę podglądu obrazu z kamery na wyświetlaczu i nagrywania wideo.
Wdrażanie HAL (starsza wersja)
HAL znajduje się pomiędzy sterownikiem aparatu a platformą Android wyższego poziomu i definiuje interfejs, który należy zaimplementować, aby aplikacje mogły poprawnie obsługiwać sprzęt aparatu. Interfejs HAL jest zdefiniowany w plikach nagłówkowych hardware/libhardware/include/hardware/camera.h
i hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
definiuje camera_module
, standardową strukturę służącą do uzyskiwania ogólnych informacji o kamerze, takich jak identyfikator kamery i właściwości wspólne dla wszystkich kamer (tzn. czy jest to kamera skierowana do przodu, czy do tyłu).
camera.h
zawiera kod odpowiadający android.hardware.Camera
. Ten plik nagłówkowy deklaruje strukturę camera_device
, która z kolei zawiera strukturę camera_device_ops
ze wskaźnikami do funkcji implementujących interfejs HAL. Dokumentację dotyczącą parametrów kamery, które programiści mogą ustawić, można znaleźć w frameworks/av/include/camera/CameraParameters.h
. Parametry te są ustawiane za pomocą funkcji wskazywanej przez int (*set_parameters)(struct camera_device *, const char *parms)
w warstwie HAL.
Przykład implementacji HAL można znaleźć w implementacji Galaxy Nexus HAL w hardware/ti/omap4xxx/camera
.
Konfigurowanie biblioteki współdzielonej
Skonfiguruj system kompilacji Androida, aby poprawnie spakować implementację HAL do biblioteki współdzielonej i skopiuj ją do odpowiedniej lokalizacji, tworząc plik Android.mk
:
- Utwórz katalog
device/<company_name>/<device_name>/camera
, w którym będą znajdować się pliki źródłowe Twojej biblioteki. - Utwórz plik
Android.mk
, aby zbudować bibliotekę współdzieloną. Upewnij się, że plik makefile zawiera następujące wiersze:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Twoja biblioteka musi mieć nazwę
camera.<device_name>
( rozszerzenie.so
jest dodawane automatycznie), aby system Android mógł poprawnie załadować bibliotekę. Na przykład zobacz plik makefile dla kamery Galaxy Nexus znajdujący się whardware/ti/omap4xxx/Android.mk
. - Określ, czy Twoje urządzenie ma funkcje aparatu, kopiując niezbędne pliki XML funkcji do katalogu
frameworks/native/data/etc
wraz z plikiem makefile urządzenia. Na przykład, aby określić, że Twoje urządzenie ma lampę błyskową i może automatycznie ustawiać ostrość, dodaj następujące wiersze w pliku makefile<device>/<company_name>/<device_name>/device.mk
: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 \
Przykład pliku makefile urządzenia można znaleźć na
device/samsung/tuna/device.mk
. - Zadeklaruj możliwości kodeka multimedialnego, formatu i rozdzielczości swojej kamery w plikach XML
device/<company_name>/<device_name>/media_profiles.xml
idevice/<company_name>/<device_name>/media_codecs.xml
. Aby uzyskać szczegółowe informacje, zobacz Udostępnianie kodeków środowisku . - Dodaj następujące wiersze w pliku makefile
device/<company_name>/<device_name>/device.mk
swojego urządzenia, aby skopiować plikimedia_profiles.xml
imedia_codecs.xml
do odpowiedniej lokalizacji:# 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
- Aby dołączyć aplikację Aparat do obrazu systemu urządzenia, określ ją w zmiennej
PRODUCT_PACKAGES
wdevice/<company>/<device>/device.mk
plik makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...