Aparat

Ikona Android Camera HAL

Warstwa abstrakcji sprzętu (HAL) aparatu w Androidzie łączy interfejsy API wyższego poziomu struktury aparatu w Camera 2 z podstawowym sterownikiem i sprzętem aparatu. Podsystem aparatu obejmuje implementacje komponentów potoku aparatu, a warstwa HAL aparatu udostępnia interfejsy do implementowania Twojej wersji tych komponentów.

Architektura

Poniższa ilustracja i lista opisują komponenty HAL:

Architektura aparatu na Androidzie

Rysunek 1. Architektura aparatu.

framework aplikacji
Na poziomie frameworka aplikacji znajduje się kod aplikacji, który używa interfejsu 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 CameraService moż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 tworzenia CameraDevice i ostatecznie CameraCaptureSession na poziomie platformy.
framework natywny
Ten framework znajdujący się w frameworks/av/ zapewnia natywny odpowiednik klas CameraDevice i CameraCaptureSession. Zobacz też NDK Camera2 reference.
interfejs IPC Binder
Interfejs IPC Binder ułatwia komunikację między procesami. W katalogu frameworks/av/camera/camera/aidl/android/hardware znajduje się kilka klas Binder aparatu, które wywołują usługę aparatu. ICameraService to interfejs usługi aparatu; ICameraDeviceUser to interfejs konkretnego otwartego urządzenia z aparatem, a ICameraServiceListener i ICameraDeviceCallbacks to odpowiednie wywołania zwrotne CameraService i CameraDevice 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 warstwą 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 warstwy HAL

Warstwa 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 warstwy HAL aparatu są zdefiniowane w hardware/interfaces/camera.

Typowa warstwa HAL z obsługą Binder musi implementować te interfejsy HIDL:

Implementacje referencyjne HIDL są dostępne w przypadku CameraProvider.cpp, CameraDevice.cpp, i CameraDeviceSession.cpp. Implementacja obejmuje starsze warstwy HAL, które nadal używają starszego interfejsu API. Od Androida 8.0 implementacje warstwy HAL aparatu muszą używać interfejsu HIDL API. Używanie starszego interfejsu nie jest obsługiwane.

Sprawdzanie poprawności danych wejściowych

Ponieważ warstwa 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, warstwa HAL aparatu musi sprawdzać poprawność parametrów przekazywanych z usługi aparatu do warstwy HAL. Obejmuje to sprawdzanie, czy wartości długości bufora mieszczą się w dopuszczalnych zakresach, oraz czyszczenie parametrów przed użyciem i przed przekazaniem ich do sterowników sprzętu lub jądra.

Starsza warstwa HAL

W tej sekcji opisujemy architekturę starszych komponentów HAL oraz sposób implementowania warstwy HAL. Implementacje warstwy 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:

Architektura aparatu na Androidzie

Rysunek 2. Starsza architektura aparatu.

framework aplikacji
Na poziomie frameworka aplikacji znajduje się kod aplikacji, który używa android.hardware.Camera API 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.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, które są używane do tworzenia obiektu android.hardware.Camera na poziomie frameworka.
framework natywny
Framework natywny zdefiniowany w frameworks/av/camera/Camera.cpp zapewnia natywny odpowiednik android.hardware.Camera klasy. Ta klasa wywołuje proxy Binder IPC , aby uzyskać dostęp do usługi aparatu.
proxy Binder IPC
Proxy Binder IPC ułatwiają komunikację między procesami. W katalogu frameworks/av/camera znajdują się 3 klasy Binder aparatu, które wywołują usługę aparatu. ICameraService to interfejs usługi aparatu, ICamera to interfejs konkretnego otwartego urządzenia z aparatem, a ICameraClient to 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 warstwą 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ą warstwy 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 warstwy HAL (starsza wersja)

Warstwa 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 mogą ustawiać deweloperzy, 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 warstwie HAL.

Przykład implementacji warstwy HAL znajdziesz w implementacji warstwy HAL Galaxy Nexus w hardware/ti/omap4xxx/camera.

Konfigurowanie biblioteki udostępnionej

Skonfiguruj system kompilacji Androida, aby prawidłowo spakować implementację warstwy HAL do biblioteki udostępnionej i skopiować ją do odpowiedniej lokalizacji, tworząc plik Android.mk:

  1. Utwórz device/<company_name>/<device_name>/camera katalog, który będzie zawierać pliki źródłowe biblioteki.
  2. 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> (.so jest dodawany automatycznie), aby Android mógł prawidłowo wczytać bibliotekę. Przykład znajdziesz w pliku makefile aparatu Galaxy Nexus w hardware/ti/omap4xxx/Android.mk.

  3. Określ, że urządzenie ma funkcje aparatu, kopiując niezbędne pliki XML funkcji do katalogu frameworks/native/data/etc za 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.

  4. Zadeklaruj możliwości kodeka multimediów, formatu i rozdzielczości aparatu w device/<company_name>/<device_name>/media_profiles.xml i device/<company_name>/<device_name>/media_codecs.xml plikach XML. Więcej informacji znajdziesz w sekcji Udostępnianie kodeków frameworkowi.
  5. Aby skopiować pliki media_profiles.xml i media_codecs.xml do odpowiedniej lokalizacji, dodaj te wiersze w pliku makefile urządzenia device/<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
    
  6. Aby uwzględnić aplikację Aparat w obrazie systemu urządzenia, określ ją w zmiennej PRODUCT_PACKAGES w pliku makefile urządzenia device/<company>/<device>/device.mk:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...