Aparat

Ikona HAL aparatu w Androidzie

Warstwa abstrakcji sprzętu aparatu w systemie Android (HAL) łączy interfejsy API platformy aparatu wyższego poziomu w aplikacji Camera 2 z podstawowym sterownikiem aparatu i sprzętem. Podsystem kamery zawiera implementacje komponentów potoku kamery, podczas gdy warstwa HAL kamery udostępnia interfejsy do wykorzystania podczas implementowania własnej wersji tych komponentów.

Architektura

Poniższy rysunek i lista opisują komponenty HAL.

Architektura aparatu w Androidzie

Rysunek 1. Architektura kamery

ramy aplikacji
Na poziomie struktury aplikacji znajduje się kod aplikacji, który wykorzystuje interfejs API Camera 2 do interakcji ze sprzętem kamery. Wewnętrznie ten kod wywołuje odpowiednie interfejsy Bindera , aby uzyskać dostęp do kodu natywnego, który współdziała z kamerą.
AIDL
Interfejs segregatora powiązany z CameraService można znaleźć pod adresem frameworks/av/camera/aidl/android/hardware . Wygenerowany kod wywołuje kod natywny niższego poziomu w celu uzyskania dostępu do kamery fizycznej i zwraca dane, które są używane do tworzenia obiektów CameraDevice i ostatecznie CameraCaptureSession na poziomie platformy.
natywny framework
Ta struktura znajdująca się w frameworks/av/ zapewnia natywny odpowiednik klas CameraDevice i CameraCaptureSession . Zobacz także informacje o kamerze NDK2 .
interfejs IPC spoiwa
Interfejs spoiwa IPC ułatwia komunikację ponad granicami procesu. Istnieje kilka klas segregatorów kamer znajdujących się w katalogu frameworks/av/camera/camera/aidl/android/hardware które wywołują usługę kamery. ICameraService to interfejs do usługi kamery; ICameraDeviceUser to interfejs do konkretnego otwartego urządzenia z kamerą; oraz ICameraServiceListener i ICameraDeviceCallbacks są odpowiednimi wywołaniami zwrotnymi CameraService i CameraDevice do struktury aplikacji.
serwis kamer
Usługa kamery, zlokalizowana w frameworks/av/services/camera/libcameraservice/CameraService.cpp , to rzeczywisty kod współdziałający z warstwą HAL.
HAL
Warstwa abstrakcji sprzętu definiuje standardowy interfejs, do którego odwołuje się usługa kamery i który należy zaimplementować, aby sprzęt kamery działał prawidłowo.

Implementacja HAL-a

HAL znajduje się pomiędzy sterownikiem aparatu a platformą Android wyższego poziomu i definiuje interfejs, który należy zaimplementować, aby aplikacje mogły poprawnie obsługiwać sprzęt aparatu. Interfejsy HIDL dla Camera HAL są zdefiniowane w hardware/interfaces/camera .

Typowy powiązany HAL musi implementować następujące interfejsy HIDL:

Referencyjne implementacje HIDL są dostępne dla CameraProvider.cpp , CameraDevice.cpp i CameraDeviceSession.cpp . Implementacja otacza stare warstwy HAL, które nadal korzystają ze starszego interfejsu API . Począwszy od Androida 8.0, implementacje Camera HAL muszą korzystać z interfejsu API HIDL; użycie starszego interfejsu nie jest obsługiwane.

Walidacja danych wejściowych

Ponieważ warstwa HAL ma dostęp do innych zasobów niż usługa kamery, granica między nimi jest traktowana jako granica bezpieczeństwa. Oznacza to, że parametry przekazywane z usługi kamery są uznawane za niezaufane i niezatwierdzone. Aby zapobiec lukom w zabezpieczeniach, które umożliwiają atakującym zwiększenie uprawnień lub dostęp do danych, do których nie powinni mieć dostępu, warstwa HAL kamery musi sprawdzić parametry przekazywane z usługi kamery do warstwy HAL. Obejmuje to sprawdzanie, czy wartości długości buforów mieszczą się w dopuszczalnych zakresach i oczyszczanie parametrów przed użyciem oraz przed przekazaniem ich do sterowników sprzętu lub jądra.

Starsze komponenty HAL

W tej sekcji opisano architekturę starszych komponentów HAL i sposób implementacji warstwy HAL. Implementacje HAL kamery w systemie Android 8.0 i nowszych wersjach muszą zamiast tego korzystać z interfejsu API HIDL, jak opisano powyżej.

Architektura (dziedzictwo)

Poniższy rysunek i lista opisują komponenty HAL starszej kamery.

Architektura aparatu w Androidzie

Rysunek 2. Starsza architektura aparatu

ramy aplikacji
Na poziomie struktury aplikacji znajduje się kod aplikacji, który wykorzystuje interfejs API android.hardware.Camera do interakcji ze sprzętem kamery. Wewnętrznie ten kod wywołuje odpowiednią klasę kleju JNI, aby uzyskać dostęp do kodu natywnego, który współdziała z kamerą.
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 w celu uzyskania dostępu do kamery fizycznej i zwraca dane, które są używane do tworzenia obiektu android.hardware.Camera na poziomie platformy.
natywny framework
Natywna struktura zdefiniowana w frameworks/av/camera/Camera.cpp zapewnia natywny odpowiednik klasy android.hardware.Camera . Ta klasa wywołuje serwery proxy IPC w celu uzyskania dostępu do usługi kamery.
spoiwo proxy IPC
Serwery proxy spoiw IPC ułatwiają komunikację ponad granicami procesów. Istnieją trzy klasy segregatorów kamer, które znajdują się w katalogu frameworks/av/camera , który wywołuje usługę kamery. ICameraService to interfejs do usługi kamery, ICamera to interfejs do określonego otwartego urządzenia z kamerą, a ICameraClient to interfejs urządzenia z powrotem do struktury aplikacji.
serwis kamer
Usługa kamery, zlokalizowana w frameworks/av/services/camera/libcameraservice/CameraService.cpp , to rzeczywisty kod współdziałający z warstwą HAL.
HAL
Warstwa abstrakcji sprzętu definiuje standardowy interfejs, do którego odwołuje się usługa kamery i który należy zaimplementować, aby sprzęt kamery działał prawidłowo.
sterownik jądra
Sterownik kamery współdziała z rzeczywistym sprzętem kamery i implementacją warstwy HAL. Kamera i sterownik muszą obsługiwać formaty obrazu YV12 i NV21, aby zapewnić obsługę podglądu obrazu z kamery na wyświetlaczu i nagrywania wideo.

Wdrażanie HAL (starsza wersja)

HAL znajduje się pomiędzy sterownikiem aparatu a platformą Android wyższego poziomu i definiuje interfejs, który należy zaimplementować, aby aplikacje mogły poprawnie 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ę służącą do uzyskiwania ogólnych informacji o kamerze, takich jak identyfikator kamery i właściwości wspólne dla wszystkich kamer (tzn. czy jest to kamera skierowana do przodu, czy do tyłu).

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ę dotyczącą parametrów kamery, które programiści mogą ustawić, można znaleźć w frameworks/av/include/camera/CameraParameters.h . Parametry te są ustawiane za pomocą funkcji wskazywanej przez int (*set_parameters)(struct camera_device *, const char *parms) w warstwie HAL.

Przykład implementacji HAL można znaleźć w implementacji Galaxy Nexus HAL w hardware/ti/omap4xxx/camera .

Konfigurowanie biblioteki współdzielonej

Skonfiguruj system kompilacji Androida, aby poprawnie spakować implementację HAL do biblioteki współdzielonej i skopiuj ją do odpowiedniej lokalizacji, tworząc plik Android.mk :

  1. Utwórz katalog device/<company_name>/<device_name>/camera , w którym będą znajdować się pliki źródłowe Twojej biblioteki.
  2. Utwórz plik Android.mk , aby zbudować bibliotekę współdzieloną. Upewnij się, że plik makefile zawiera następujące wiersze:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Twoja biblioteka musi mieć nazwę camera.<device_name> ( rozszerzenie .so jest dodawane automatycznie), aby system Android mógł poprawnie załadować bibliotekę. Na przykład zobacz plik makefile dla kamery Galaxy Nexus znajdujący się w hardware/ti/omap4xxx/Android.mk .

  3. Określ, czy Twoje urządzenie ma funkcje aparatu, kopiując niezbędne pliki XML funkcji do katalogu frameworks/native/data/etc wraz z plikiem makefile urządzenia. Na przykład, aby określić, że Twoje urządzenie ma lampę błyskową i może automatycznie ustawiać ostrość, dodaj następujące wiersze w pliku makefile <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ładowy plik makefile urządzenia można znaleźć pod adresem device/samsung/tuna/device.mk .

  4. Zadeklaruj możliwości kodeka multimedialnego, formatu i rozdzielczości swojej kamery w plikach XML device/<company_name>/<device_name>/media_profiles.xml i device/<company_name>/<device_name>/media_codecs.xml . Aby uzyskać szczegółowe informacje, zobacz Udostępnianie kodeków środowisku .
  5. Dodaj następujące wiersze w pliku makefile device/<company_name>/<device_name>/device.mk swojego urządzenia, aby skopiować pliki media_profiles.xml i media_codecs.xml 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, określ ją w zmiennej PRODUCT_PACKAGES w device/<company>/<device>/device.mk plik makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...