Câmera

Ícone da HAL da câmera do Android

A camada de abstração de hardware (HAL) da câmera do Android conecta a camada de Camera Framework APIs no Camera 2 ao driver e hardware da câmera. O subsistema da câmera inclui implementações para componentes de pipeline da câmera, enquanto a HAL da câmera fornece interfaces para uso na implementação da sua versão desses componentes de solução.

Arquitetura

A figura e a lista a seguir descrevem os componentes da HAL.

Arquitetura da câmera do Android

Figura 1. Arquitetura da câmera

framework do app
No nível do framework do app, está o código, que usa a Camera 2 para interagir com o hardware da câmera. Internamente, esse código chamadas correspondentes Binder para acessar o código nativo que interage com o câmera.
AIDL
A interface de vinculação associada a CameraService pode ser encontrado em frameworks/av/camera/aidl/android/hardware. O código gerado chama o código nativo de nível inferior para obter acesso ao câmera física e retorna dados que são usados para criar a CameraDevice e, por fim, CameraCaptureSession no nível do framework.
framework nativo
Esse framework que reside em frameworks/av/ fornece uma os nativos CameraDevice e CameraCaptureSession classes. Consulte também Referência de camera2 do NDK.
interface IPC binder
A interface de vinculação da IPC facilita a comunicação além dos limites do processo. Há várias classes de vinculação de câmera localizadas na frameworks/av/camera/camera/aidl/android/hardware diretório que para o serviço de câmera. ICameraService é a interface para o serviço de câmera. ICameraDeviceUser é a interface para uma instância dispositivo de câmera e ICameraServiceListener e ICameraDeviceCallbacks são os respectivos CameraService e CameraDevice para a framework de aplicativo.
serviço de câmera
O serviço de câmera, localizado em frameworks/av/services/camera/libcameraservice/CameraService.cpp, é o código que interage com a HAL.
HAL
A camada de abstração de hardware define a interface padrão que o chamadas de serviço de câmera e que você precisa implementar para que sua câmera o funcionamento correto do hardware.

Implementar a HAL

A HAL fica entre o driver da câmera e o framework de nível superior do Android e define uma interface que você precisa implementar para que os apps operem corretamente o hardware da câmera. O HIDL para a HAL da câmera sejam definidas hardware/interfaces/câmera.

Uma HAL de vinculação típica precisa implementar as seguintes interfaces HIDL:

As implementações de HIDL de referência estão disponíveis para CameraProvider.cpp, CameraDevice.cpp e CameraDeviceSession.cpp. A implementação envolve HALs antigas que ainda usam o API legada. A partir do Android 8.0, as implementações de HAL da câmera precisam usar a API HIDL. usam da interface legada não é compatível.

Validação de entrada

Como a HAL tem acesso a recursos diferentes do serviço de câmera, o limite entre os dois são tratados como um limite de segurança. Isso significa que os parâmetros transmitidos do serviço da câmera considerados confiáveis e não limpos. Para evitar vulnerabilidades de segurança que permitem que invasores escalar privilégios ou acessar dados aos quais eles não deveriam ter acesso, a HAL da câmera precisa validar parâmetros passados do serviço da câmera para a HAL. Isso inclui verificar o buffer valores de comprimento estão dentro dos intervalos permitidos e limpando os parâmetros antes do uso e antes passando para drivers de hardware ou kernel.

Componentes de HAL legados

Esta seção descreve a arquitetura dos componentes legados da HAL e como implementar a HAL. As implementações de HAL da câmera no Android 8.0 e versões mais recentes precisam usar a API HIDL, descrita acima.

Arquitetura (legada)

A figura e a lista a seguir descrevem os componentes legados da HAL da câmera.

Arquitetura da câmera do Android

Figura 2. Arquitetura da câmera legada

framework do app
No nível do framework do app, está o código, que usa a android.hardware.Camera para interagir com o hardware da câmera. Internamente, esse código chama uma classe agrupador JNI correspondente para acessar o código nativo que interage com a câmera.
JNI
O código JNI associado ao android.hardware.Camera está localizado em frameworks/base/core/jni/android_hardware_Camera.cpp. Este código chama o código nativo de nível inferior para obter acesso à câmera física e retorna os dados usados para criar android.hardware.Camera no nível do framework.
framework nativo
O framework nativo definido em frameworks/av/camera/Camera.cpp oferece um equivalente nativo android.hardware.Camera. Essa classe chama a classe IPC proxies de vinculação para ter acesso ao serviço de câmera.
proxies IPC binder
Os proxies de vinculação da IPC facilitam a comunicação acima dos limites do processo. Há três classes de vinculação de câmera localizadas no Diretório frameworks/av/camera que chama o serviço de câmera. ICameraService é a interface para o serviço de câmera; ICamera é a interface para um dispositivo de câmera específico aberto, e ICameraClient é a interface do dispositivo para o framework de aplicativo.
serviço de câmera
O serviço de câmera, localizado em frameworks/av/services/camera/libcameraservice/CameraService.cpp, é o código que interage com a HAL.
HAL
A camada de abstração de hardware define a interface padrão que o chamadas de serviço de câmera e que você precisa implementar para que sua câmera o funcionamento correto do hardware.
driver do kernel
O driver da câmera interage com o hardware real e os seus implementação da HAL. A câmera e o driver precisam ser compatíveis com YV12 e NV21 formatos de imagem para fornecer suporte para a visualização da imagem da câmera no tela e gravação de vídeo.

Implementar a HAL (legado)

A HAL fica entre o driver da câmera e o framework de nível superior do Android e define uma interface que você precisa implementar para que os apps operem corretamente o hardware da câmera. A interface HAL é definida hardware/libhardware/include/hardware/camera.h e hardware/libhardware/include/hardware/camera_common.h.

camera_common.h define camera_module, um padrão estrutura para receber informações gerais sobre a câmera, como o ID dela e propriedades comuns a todas as câmeras (ou seja, seja uma câmera frontal ou câmera traseira).

camera.h contém um código que corresponde a android.hardware.Camera. O arquivo principal declara uma O struct camera_device que, por sua vez, contém um Estrutura camera_device_ops com ponteiros para funções que implementam a interface HAL. Para a documentação sobre os parâmetros da câmera, os desenvolvedores podem definido, consulte frameworks/av/include/camera/CameraParameters.h. Esses parâmetros são definidos com a função apontada por int (*set_parameters)(struct camera_device *, const char *parms) na HAL.

Para obter um exemplo de implementação de HAL, consulte a implementação da Galaxy Nexus HAL em hardware/ti/omap4xxx/camera.

Configurar a biblioteca compartilhada

Configurar o sistema de build do Android para empacotar corretamente a implementação da HAL em uma biblioteca compartilhada e copiá-la para o local apropriado criando um Arquivo Android.mk:

  1. Criar um device/<company_name>/<device_name>/camera para conter os arquivos de origem da biblioteca.
  2. Crie um arquivo Android.mk para criar a biblioteca compartilhada. Garanta que o makefile contém as seguintes linhas:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    O nome da sua biblioteca precisa ser camera.<device_name> (.so é anexado automaticamente), para que o Android possa carregar corretamente o biblioteca. Por exemplo, veja o makefile da câmera do Galaxy Nexus localizado em hardware/ti/omap4xxx/Android.mk:

  3. Copie o XML de recursos necessário para especificar que seu dispositivo tem recursos de câmera no diretório frameworks/native/data/etc pelo makefile do dispositivo. Por exemplo, para especificar que o dispositivo tem flash da câmera e autofoco, adicione as seguintes linhas ao <device>/<company_name>/<device_name>/device.mk makefile:
    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 \
    

    Para obter um exemplo de um makefile de dispositivo, consulte device/samsung/tuna/device.mk:

  4. Declare o codec de mídia, o formato e os recursos de resolução da câmera no device/<company_name>/<device_name>/media_profiles.xml e device/<company_name>/<device_name>/media_codecs.xml Arquivos XML. Para mais detalhes, consulte A exposição de codecs ao framework.
  5. Adicione as seguintes linhas ao comando Makefile device/<company_name>/<device_name>/device.mk para copiar media_profiles.xml e media_codecs.xml no local apropriado:
    # 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. Para incluir o aplicativo Câmera na imagem do sistema do seu dispositivo, especifique-o no A variável PRODUCT_PACKAGES no device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...