Kamera

Ikona HAL aparatu z Androidem

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.

Architektura aparatu w Androidzie

Rysunek 1. Architektura kamery

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 tworzenia CameraDevice, a ostatecznie . CameraCaptureSession obiektów na poziomie platformy.
platforma natywna
Ta platforma w frameworks/av/ zapewnia natywny odpowiednik CameraDevice i CameraCaptureSession 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; oraz ICameraServiceListener i ICameraDeviceCallbacks to odpowiednie CameraService i CameraDevice 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:

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.

Architektura aparatu w Androidzie

Rysunek 2. Starsza architektura kamery

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 tworzenia android.hardware.Camera na poziomie platformy.
platforma natywna
Platforma natywna zdefiniowana w frameworks/av/camera/Camera.cpp zapewnia natywny odpowiednik android.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. a ICameraClient 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:

  1. Utwórz device/<company_name>/<device_name>/camera na pliki źródłowe biblioteki.
  2. 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

  3. 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

  4. Zadeklaruj możliwości kodeka multimediów, formatu i rozdzielczości kamery w device/<company_name>/<device_name>/media_profiles.xml i device/<company_name>/<device_name>/media_codecs.xml XML. Więcej informacji: Udostępnienie kodeków .
  5. Dodaj te wiersze do pliku device/<company_name>/<device_name>/device.mk plik Makefile aby skopiować media_profiles.xml i media_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
    
  6. Aby dołączyć aplikację Aparat do obrazu systemu urządzenia, wskaż ją w Zmienna PRODUCT_PACKAGES w device/<company>/<device>/device.mk Makerfile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...