Aparat

Ikona Android Camera HAL

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.

Architektura aparatu na Androidzie

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 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 obiektów na poziomie frameworka.
framework natywny
Ten framework znajdujący się w frameworks/av/ zapewnia natywny odpowiednik CameraDevice i CameraCaptureSession klas. 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/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 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:

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.

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 platformy.
framework natywny
Framework natywny zdefiniowany w frameworks/av/camera/Camera.cpp zapewnia natywny odpowiednik klasy android.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/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 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:

  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 dodawane automatycznie), aby Android mógł ją prawidłowo wczytać. 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 \
    ...