Warstwa abstrakcji sprzętu (HAL) aparatu w Androidzie łączy interfejsy API frameworka aparatu wyższego poziomu w Camera 2 z podstawowym sterownikiem i sprzętem aparatu. Podsystem aparatu obejmuje implementacje komponentów potoku aparatu, a HAL aparatu udostępnia interfejsy do implementowania Twojej wersji tych komponentów.
Architektura
Poniższa ilustracja i lista opisują komponenty HAL.
Rysunek 1. Architektura aparatu
- framework aplikacji
- Na poziomie frameworka aplikacji znajduje się kod aplikacji, który używa Camera 2 API do interakcji ze sprzętem aparatu. Wewnętrznie ten kod wywołuje odpowiednie interfejsy Binder, aby uzyskać dostęp do kodu natywnego, który współpracuje z aparatem.
- AIDL
- Interfejs Binder powiązany z
CameraServicemożna znaleźć w frameworks/av/camera/aidl/android/hardware. Wygenerowany kod wywołuje kod natywny niższego poziomu, aby uzyskać dostęp do fizycznego aparatu, i zwraca dane, które są używane do tworzeniaCameraDevicei ostatecznieCameraCaptureSessionobiektów na poziomie frameworka. - framework natywny
- Ten framework znajdujący się w
frameworks/av/zapewnia natywny odpowiednikCameraDeviceiCameraCaptureSessionklas. Zobacz też dokumentację NDK camera2. - interfejs IPC Binder
- Interfejs IPC Binder ułatwia komunikację między procesami.
W katalogu
frameworks/av/camera/camera/aidl/android/hardwareznajduje się kilka klas Binder aparatu, które wywołują usługę aparatu.ICameraServiceto interfejs usługi aparatu;ICameraDeviceUserto interfejs konkretnego otwartego urządzenia z aparatem, aICameraServiceListeneriICameraDeviceCallbacksto odpowiednie wywołania zwrotneCameraServiceiCameraDevicedo frameworka aplikacji. - usługa aparatu
- Usługa aparatu, która znajduje się w
frameworks/av/services/camera/libcameraservice/CameraService.cpp, to rzeczywisty kod, który współpracuje z HAL. - HAL
- Warstwa abstrakcji sprzętowej definiuje standardowy interfejs, który wywołuje usługa aparatu i który musisz zaimplementować, aby sprzęt aparatu działał prawidłowo.
Implementowanie HAL
HAL znajduje się między sterownikiem aparatu a frameworkiem Androida wyższego poziomu i definiuje interfejs, który musisz zaimplementować, aby aplikacje mogły prawidłowo obsługiwać sprzęt aparatu. Interfejsy HIDL dla HAL aparatu są zdefiniowane w hardware/interfaces/camera.
Typowy HAL powiązany z Binderem musi implementować te interfejsy HIDL:
-
ICameraProvider: do wyliczania poszczególnych urządzeń i zarządzania ich stanem. -
ICameraDevice: interfejs urządzenia z aparatem. -
ICameraDeviceSession: interfejs aktywnej sesji urządzenia z aparatem.
Implementacje referencyjne HIDL są dostępne w przypadku
CameraProvider.cpp,
CameraDevice.cpp, i
CameraDeviceSession.cpp.
Implementacja obejmuje stare HAL, które nadal używają
starszego interfejsu API.
Od Androida 8.0 implementacje HAL aparatu muszą używać interfejsu HIDL API. Używanie starszego interfejsu nie jest obsługiwane.
Sprawdzanie danych wejściowych
Ponieważ HAL ma dostęp do innych zasobów niż usługa aparatu, granica między nimi jest traktowana jako granica bezpieczeństwa. Oznacza to, że parametry przekazywane z usługi aparatu są uważane za niezaufane i nieoczyszczone. Aby zapobiec lukom w zabezpieczeniach, które umożliwiają atakującym podniesienie uprawnień lub dostęp do danych, do których nie powinni mieć dostępu, HAL aparatu musi sprawdzać parametry przekazywane z usługi aparatu do HAL. Obejmuje to sprawdzanie, czy wartości długości bufora mieszczą się w dopuszczalnych zakresach, oraz oczyszczanie parametrów przed użyciem i przed przekazaniem ich do sterowników sprzętu lub jądra.
Starsze komponenty HAL
W tej sekcji opisujemy architekturę starszych komponentów HAL oraz sposób implementowania HAL. Implementacje HAL aparatu w Androidzie 8.0 i nowszym muszą używać interfejsu HIDL API opisanego powyżej.
Architektura (starsza wersja)
Poniższa ilustracja i lista opisują starsze komponenty HAL aparatu.
Rysunek 2. Starsza architektura aparatu
- framework aplikacji
- Na poziomie frameworka aplikacji znajduje się kod aplikacji, który używa
android.hardware.CameraAPI do interakcji ze sprzętem aparatu. Wewnętrznie ten kod wywołuje a odpowiednią klasę JNI, aby uzyskać dostęp do kodu natywnego, który współpracuje z aparatem. - JNI
- Kod JNI powiązany z
android.hardware.Cameraznajduje się wframeworks/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, które są używane do tworzenia obiektuandroid.hardware.Camerana poziomie platformy. - framework natywny
- Framework natywny zdefiniowany w
frameworks/av/camera/Camera.cppzapewnia natywny odpowiednik klasyandroid.hardware.Camera. Ta klasa wywołuje serwery proxy IPC Binder, aby uzyskać dostęp do usługi aparatu. - serwery proxy IPC Binder
- Serwery proxy IPC Binder ułatwiają komunikację między procesami.
W katalogu
frameworks/av/cameraznajdują się 3 klasy Binder aparatu, które wywołują usługę aparatu.ICameraServiceto interfejs usługi aparatu,ICamerato interfejs konkretnego otwartego urządzenia z aparatem, aICameraClientto interfejs urządzenia z powrotem do frameworka aplikacji. - usługa aparatu
- Usługa aparatu, która znajduje się w
frameworks/av/services/camera/libcameraservice/CameraService.cpp, to rzeczywisty kod, który współpracuje z HAL. - HAL
- Warstwa abstrakcji sprzętowej definiuje standardowy interfejs, który wywołuje usługa aparatu i który musisz zaimplementować, aby sprzęt aparatu działał prawidłowo.
- sterownik jądra
- Sterownik aparatu współpracuje z rzeczywistym sprzętem aparatu i Twoją implementacją HAL. Aby obsługiwać podgląd obrazu z aparatu na wyświetlaczu i nagrywanie filmów, aparat i sterownik muszą obsługiwać formaty obrazów YV12 i NV21
Implementowanie HAL (starsza wersja)
HAL znajduje się między sterownikiem aparatu a frameworkiem Androida wyższego poziomu i definiuje interfejs, który musisz zaimplementować, aby aplikacje mogły prawidłowo 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ę do uzyskiwania ogólnych informacji o aparacie, takich jak identyfikator aparatu i właściwości wspólne dla wszystkich aparatów (czyli czy jest to aparat przedni czy tylny).
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ę parametrów aparatu, które deweloperzy mogą ustawić, 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 HAL.
Przykład implementacji HAL znajdziesz w implementacji HAL Galaxy Nexus w hardware/ti/omap4xxx/camera.
Konfigurowanie biblioteki udostępnionej
Skonfiguruj system kompilacji Androida, aby prawidłowo spakować implementację HAL do biblioteki udostępnionej i skopiować ją do odpowiedniej lokalizacji, tworząc plik Android.mk:
- Utwórz
device/<company_name>/<device_name>/camerakatalog, który będzie zawierać pliki źródłowe biblioteki. - Utwórz plik
Android.mk, aby skompilować bibliotekę udostępnioną. Upewnij się, że plik makefile zawiera te wiersze:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Biblioteka musi mieć nazwę
camera.<device_name>(.sojest dodawane automatycznie), aby Android mógł ją prawidłowo wczytać. Przykład znajdziesz w pliku makefile aparatu Galaxy Nexus whardware/ti/omap4xxx/Android.mk. - Określ, że urządzenie ma funkcje aparatu, kopiując niezbędne pliki XML funkcji do katalogu
frameworks/native/data/etcza pomocą pliku makefile urządzenia. Aby na przykład określić, że urządzenie ma lampę błyskową i może automatycznie ustawiać ostrość, dodaj te wiersze w pliku makefile urządzenia<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 znajdziesz w
device/samsung/tuna/device.mk. - Zadeklaruj możliwości kodeka multimediów, formatu i rozdzielczości aparatu w
device/<company_name>/<device_name>/media_profiles.xmlidevice/<company_name>/<device_name>/media_codecs.xmlplikach XML. Więcej informacji znajdziesz w sekcji Udostępnianie kodeków frameworkowi. - Aby skopiować pliki
media_profiles.xmlimedia_codecs.xmldo odpowiedniej lokalizacji, dodaj te wiersze w pliku makefile urządzeniadevice/<company_name>/<device_name>/device.mk:# 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 uwzględnić aplikację Aparat w obrazie systemu urządzenia, określ ją w zmiennej
PRODUCT_PACKAGESw pliku makefile urządzeniadevice/<company>/<device>/device.mk:PRODUCT_PACKAGES := \ Gallery2 \ ...