Warstwa abstrakcji sprzętowej aparatu w Androidzie (HAL) łączy Camera Framework API w Kamera 2 do sterownika i sprzętu kamery. Podsystem aparatu zawiera implementacje komponentów potoku kamery, a kod HAL kamery udostępnia interfejsy umożliwiające implementację tych wersji
Architektura
Poniższa ilustracja i lista opisują komponenty HAL.
- platforma aplikacji
- Na poziomie platformy aplikacji jest jej kod, który wykorzystuje Interfejs Camera 2 API do interakcji ze sprzętem kamery. Kod wewnętrzny odpowiadające sobie wywołania Binder, aby uzyskać dostęp do kodu natywnego, który wchodzi w interakcje z tabelą aparat fotograficzny.
- AIDL
- Interfejsem powiązania powiązany z tagiem
CameraService
można znaleziono pod adresem Frameworks/av/camera/aidl/android/hardware Wygenerowany kod wywołuje kod natywny niższego poziomu, aby uzyskać dostęp do i danych o zwrotach, które są wykorzystywane do tworzeniaCameraDevice
, a ostatecznie .CameraCaptureSession
obiektów na poziomie platformy. - platforma natywna
- Ta platforma w
frameworks/av/
zapewnia natywny odpowiednikCameraDevice
iCameraCaptureSession
zajęcia. Zobacz też Dokumentacja NDK Camera2. - interfejs IPC powiązania
- Interfejs powiązania IPC ułatwia komunikację ponad granicami procesów.
Istnieje kilka klas separatora aparatów
frameworks/av/camera/camera/aidl/android/hardware
, w którym połączenia do usługi kamery.ICameraService
to interfejs usługi aparatu. .ICameraDeviceUser
to interfejs do konkretnego otwartego elementu kamera; orazICameraServiceListener
iICameraDeviceCallbacks
to odpowiednieCameraService
iCameraDevice
wywołania zwrotne do platformy aplikacji. - serwis fotograficzny
- Usługa aparatu fotograficznego
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, to rzeczywisty kod, który wchodzi w interakcje z HAL. - HAL
- Warstwa abstrakcji sprzętowej definiuje standardowy interfejs, który należy wdrożyć, aby móc używać kamery zapewnić prawidłowe działanie sprzętu.
Wdrażanie HAL
HAL znajduje się między sterownikiem aparatu a platformą Androida wyższego poziomu. i definiuje interfejs, który musisz wdrożyć, aby aplikacje mogły prawidłowo działać. i sprzętem fotograficznym. HIDL interfejsy HAL aparatu są zdefiniowane w sprzęt/interfejsy/aparat.
Typowa wiązana HAL musi implementować te interfejsy HIDL:
-
ICameraProvider
: Do wyliczania poszczególnych urządzeń i zarządzania ich stanem. -
ICameraDevice
: Interfejs aparatu. -
ICameraDeviceSession
: Interfejs aktywnej sesji kamery na urządzeniu.
Referencyjne implementacje HIDL są dostępne w przypadku:
CameraProvider.cpp
.
CameraDevice.cpp
, i
CameraDeviceSession.cpp
.
Implementacja obejmuje stare HAL, które nadal używają
starszej wersji interfejsu API.
Począwszy od Androida 8.0 implementacje HAL aparatu muszą korzystać z interfejsu API HIDL. należy użyć funkcji
starszej wersji interfejsu nie jest obsługiwana.
Weryfikacja danych wejściowych
HAL ma dostęp do innych zasobów niż usługa aparatu, dlatego granica między traktujemy je jako granicę bezpieczeństwa. Oznacza to, że parametry przekazywane z usługi kamery są uznawane za niezaufane i niesprawdzone. Aby zapobiegać lukom w zabezpieczeniach, które umożliwiają hakerom eskalacji uprawnień lub dostępu do danych, do których nie powinien mieć dostępu; HAL musi weryfikacji parametrów przesyłanych z usługi aparatu do HAL. Obejmuje to sprawdzenie bufora wartości długości są w dopuszczalnych zakresach, a parametry są oczyszczane przed użyciem i przed użyciem i przekazywać je do sterowników sprzętowych lub jądra systemu operacyjnego.
Starsze komponenty HAL
W tej sekcji opisujemy architekturę starszych komponentów HAL i sposoby wdrożenia HAL. Implementacje HAL aparatu na Androidzie 8.0 lub nowszym muszą używać za pomocą interfejsu HIDL API, jak opisano powyżej.
Architektura (starsza wersja)
Poniższa ilustracja i lista opisują starsze komponenty HAL aparatu.
- platforma aplikacji
- Na poziomie platformy aplikacji jest jej kod, który wykorzystuje
android.hardware.Camera
Interfejs API do interakcji ze sprzętem aparatu. Wewnętrznie ten kod wywołuje metodę odpowiednią klasę JNI glue, aby uzyskać dostęp do kodu natywnego, który wchodzi w interakcję z aparat fotograficzny. - JNI
- Kod JNI powiązany z aplikacją
android.hardware.Camera
znajduje się w:frameworks/base/core/jni/android_hardware_Camera.cpp
. Ten kod wywołuje kod natywny niższego poziomu, aby uzyskać dostęp do fizycznego aparatu i zwraca dane używane do tworzeniaandroid.hardware.Camera
na poziomie platformy. - platforma natywna
- Platforma natywna zdefiniowana w
frameworks/av/camera/Camera.cpp
zapewnia natywny odpowiednikandroid.hardware.Camera
zajęcia. Ta klasa wywołuje IPC serwery proxy powiązań w celu uzyskania dostępu do usługi aparatu. - serwery proxy IPC powiązania
- Serwery proxy powiązania IPC ułatwiają komunikację ponad granicami procesów.
Istnieją 3 klasy separatorów w aparatach
Katalog
frameworks/av/camera
, który wywołuje usługę kamery.ICameraService
to interfejs usługi aparatu.ICamera
to interfejs konkretnego otwartego aparatu. aICameraClient
to interfejs urządzenia z powrotem do platformy aplikacji. - serwis fotograficzny
- Usługa aparatu fotograficznego
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, to rzeczywisty kod, który wchodzi w interakcje z HAL. - HAL
- Warstwa abstrakcji sprzętowej definiuje standardowy interfejs, który należy wdrożyć, aby móc używać kamery zapewnić prawidłowe działanie sprzętu.
- sterownik jądra
- Sterownik kamery współdziała z jej sprzętem implementacji HAL. Kamera i sterownik muszą obsługiwać YV12 i NV21 formatów obrazu, aby umożliwić wyświetlanie podglądu obrazu z aparatu na wyświetlania i nagrywania wideo.
Wdrażanie HAL (starsza wersja)
HAL znajduje się między sterownikiem aparatu a platformą Androida wyższego poziomu.
i definiuje interfejs, który musisz wdrożyć, aby aplikacje mogły prawidłowo działać.
i sprzętem fotograficznym. Interfejs HAL jest zdefiniowany w
hardware/libhardware/include/hardware/camera.h
i
hardware/libhardware/include/hardware/camera_common.h
plików nagłówka.
camera_common.h
definiuje camera_module
, standard
do uzyskiwania ogólnych informacji o kamerze, np. jej identyfikatora
i właściwości wspólne dla wszystkich aparatów (czyli przedniego
tylny aparat).
camera.h
zawiera kod, który odpowiada
android.hardware.Camera
. Ten plik nagłówka deklaruje
camera_device
element struct, który z kolei zawiera element
Struktura camera_device_ops
ze wskaźnikami do funkcji, które implementują
interfejsu HAL. Aby zapoznać się z dokumentacją dotyczącą parametrów kamery, programiści mogą
Więcej informacji znajdziesz w frameworks/av/include/camera/CameraParameters.h
.
Te parametry są ustawiane za pomocą funkcji wskazywanej przez int
(*set_parameters)(struct camera_device *, const char *parms)
w panelu HAL.
Przykład implementacji HAL znajdziesz w sekcji
Galaxy Nexus HAL w hardware/ti/omap4xxx/camera
.
Skonfiguruj zasoby wspólne
Konfigurowanie systemu kompilacji Androida pod kątem prawidłowego pakietu implementacji HAL
do biblioteki udostępnionej i skopiować
do odpowiedniej lokalizacji, tworząc
Plik Android.mk
:
- Utwórz
device/<company_name>/<device_name>/camera
na pliki źródłowe biblioteki. - Utwórz plik
Android.mk
, by utworzyć zasoby wspólne. Sprawdź, czy że plik Makefile zawiera te wiersze:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Biblioteka musi mieć nazwę
camera.<device_name>
(.so
jest dołączany automatycznie), aby Android mógł poprawnie załadować bibliotece. Zobacz na przykład plik Makefile aparatu Galaxy Nexus, który znajduje sięhardware/ti/omap4xxx/Android.mk
- Aby określić, czy urządzenie ma funkcje aparatu, skopiuj wymagany plik XML funkcji
plików w katalogu
frameworks/native/data/etc
wraz z w pliku Makefile na urządzeniu. Jeśli na przykład chcesz, żeby urządzenie miało lampę błyskową można włączyć autofokus, dodaj następujące linie w<device>/<company_name>/<device_name>/device.mk
Makerfile: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ładowy plik z marką urządzenia znajdziesz na stronie
device/samsung/tuna/device.mk
- Zadeklaruj możliwości kodeka multimediów, formatu i rozdzielczości kamery w
device/<company_name>/<device_name>/media_profiles.xml
idevice/<company_name>/<device_name>/media_codecs.xml
XML. Więcej informacji: Udostępnienie kodeków . - Dodaj te wiersze do pliku
device/<company_name>/<device_name>/device.mk
plik Makefile aby skopiowaćmedia_profiles.xml
imedia_codecs.xml
pliki 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, wskaż ją w
Zmienna
PRODUCT_PACKAGES
wdevice/<company>/<device>/device.mk
Makerfile:PRODUCT_PACKAGES := \ Gallery2 \ ...