A camada de abstração de hardware de câmera (HAL) do Android conecta as APIs de estrutura de câmera de nível superior na Câmera 2 ao driver e hardware de câmera subjacente. O subsistema de câmera inclui implementações para componentes de pipeline de câmera, enquanto o HAL da câmera fornece interfaces para uso na implementação de sua versão desses componentes.
Arquitetura
A figura e a lista a seguir descrevem os componentes HAL.
- estrutura de aplicativo
- No nível da estrutura do aplicativo está o código do aplicativo, que usa a API Camera 2 para interagir com o hardware da câmera. Internamente, esse código chama as interfaces Binder correspondentes para acessar o código nativo que interage com a câmera.
- AIDL
- A interface do fichário associada ao
CameraService
pode ser encontrada em frameworks/av/camera/aidl/android/hardware . O código gerado chama o código nativo de nível inferior para obter acesso à câmera física e retorna dados que são usados para criar os objetosCameraDevice
e, eventualmente,CameraCaptureSession
no nível da estrutura. - estrutura nativa
- Essa estrutura residente em
frameworks/av/
fornece um equivalente nativo às classesCameraDevice
eCameraCaptureSession
. Consulte também a referência da câmera NDK2 . - interface IPC do fichário
- A interface do fichário IPC facilita a comunicação através dos limites do processo. Existem várias classes de fichários de câmera localizadas no diretório
frameworks/av/camera/camera/aidl/android/hardware
que chamam o serviço de câmera.ICameraService
é a interface para o serviço de câmera;ICameraDeviceUser
é a interface para um dispositivo de câmera aberto específico; eICameraServiceListener
eICameraDeviceCallbacks
são os respectivos retornos de chamadaCameraService
eCameraDevice
para a estrutura do aplicativo. - serviço de câmera
- O serviço de câmera, localizado em
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, é o código real que interage com o HAL. - HAL
- A camada de abstração de hardware define a interface padrão que o serviço de câmera chama e que você deve implementar para que o hardware da câmera funcione corretamente.
Implementando o HAL
O HAL fica entre o driver da câmera e a estrutura Android de nível superior e define uma interface que você deve implementar para que os aplicativos possam operar corretamente o hardware da câmera. As interfaces HIDL para o Camera HAL são definidas em hardware/interfaces/camera .
Um HAL binderizado típico deve implementar as seguintes interfaces HIDL:
-
ICameraProvider
: para enumerar dispositivos individuais e gerenciar seu status. -
ICameraDevice
: A interface do dispositivo da câmera. -
ICameraDeviceSession
: a interface de sessão do dispositivo de câmera ativa.
Implementações de referência HIDL estão disponíveis para CameraProvider.cpp
, CameraDevice.cpp
e CameraDeviceSession.cpp
. A implementação envolve HALs antigos que ainda usam a API legada . A partir do Android 8.0, as implementações do Camera HAL devem usar a API HIDL; o uso da interface legada não é compatível.
Validação de entrada
Como o HAL tem acesso a recursos diferentes do serviço de câmera, a fronteira entre os dois é tratada como uma fronteira de segurança. Isso significa que os parâmetros passados pelo serviço de câmera são considerados não confiáveis e não higienizados. Para evitar vulnerabilidades de segurança que permitem que invasores aumentem privilégios ou acessem dados aos quais não deveriam ter acesso, o HAL da câmera deve validar os parâmetros passados do serviço de câmera para o HAL. Isso inclui verificar se os valores de comprimento do buffer estão dentro dos intervalos permitidos e limpar os parâmetros antes de usá-los e antes de passá-los para drivers de hardware ou kernel.
Componentes HAL legados
Esta seção descreve a arquitetura dos componentes HAL herdados e como implementar o HAL. As implementações de Camera HAL no Android 8.0 e versões posteriores devem usar a API HIDL, descrita acima.
Arquitetura (legado)
A figura e a lista a seguir descrevem os componentes HAL da câmera herdada.
- estrutura de aplicativo
- No nível da estrutura do aplicativo está o código do aplicativo, que usa a API
android.hardware.Camera
para interagir com o hardware da câmera. Internamente, esse código chama uma classe de cola JNI correspondente para acessar o código nativo que interage com a câmera. - JNI
- O código JNI associado a
android.hardware.Camera
está localizado emframeworks/base/core/jni/android_hardware_Camera.cpp
. Esse código chama o código nativo de nível inferior para obter acesso à câmera física e retorna dados que são usados para criar o objetoandroid.hardware.Camera
no nível da estrutura. - estrutura nativa
- A estrutura nativa definida em
frameworks/av/camera/Camera.cpp
fornece um equivalente nativo à classeandroid.hardware.Camera
. Esta classe chama os proxies fichários IPC para obter acesso ao serviço de câmera. - proxies IPC fichários
- Os proxies fichários IPC facilitam a comunicação através dos limites do processo. Existem três classes de binder 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 aberto específico eICameraClient
é a interface do dispositivo de volta à estrutura do aplicativo. - serviço de câmera
- O serviço de câmera, localizado em
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, é o código real que interage com o HAL. - HAL
- A camada de abstração de hardware define a interface padrão que o serviço de câmera chama e que você deve implementar para que o hardware da câmera funcione corretamente.
- driver de núcleo
- O driver da câmera interage com o hardware real da câmera e com a implementação do HAL. A câmera e o driver devem suportar os formatos de imagem YV12 e NV21 para fornecer suporte para visualização da imagem da câmera no display e gravação de vídeo.
Implementando o HAL (legado)
O HAL fica entre o driver da câmera e a estrutura Android de nível superior e define uma interface que você deve implementar para que os aplicativos possam operar corretamente o hardware da câmera. A interface HAL é definida nos arquivos de cabeçalho hardware/libhardware/include/hardware/camera.h
e hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
define camera_module
, uma estrutura padrão para obter informações gerais sobre a câmera, como o ID da câmera e propriedades comuns a todas as câmeras (ou seja, se é uma câmera frontal ou traseira).
camera.h
contém código que corresponde a android.hardware.Camera
. Este arquivo de cabeçalho declara uma estrutura camera_device
que, por sua vez, contém uma estrutura camera_device_ops
com ponteiros para funções que implementam a interface HAL. Para obter documentação sobre os parâmetros da câmera que os desenvolvedores podem definir, 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)
no HAL.
Para obter um exemplo de implementação HAL, consulte a implementação do HAL Galaxy Nexus em hardware/ti/omap4xxx/camera
.
Configurando a biblioteca compartilhada
Configure o sistema de compilação do Android para empacotar corretamente a implementação HAL em uma biblioteca compartilhada e copie-a para o local apropriado criando um arquivo Android.mk
:
- Crie um diretório
device/<company_name>/<device_name>/camera
para conter os arquivos de origem da sua biblioteca. - Crie um arquivo
Android.mk
para construir a biblioteca compartilhada. Certifique-se de que o makefile contenha as seguintes linhas:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Sua biblioteca deve se chamar
camera.<device_name>
(.so
é anexado automaticamente), para que o Android possa carregar a biblioteca corretamente. Por exemplo, consulte o makefile da câmera Galaxy Nexus localizado emhardware/ti/omap4xxx/Android.mk
. - Especifique que seu dispositivo possui recursos de câmera copiando os arquivos XML de recursos necessários no diretório
frameworks/native/data/etc
com o makefile do seu dispositivo. Por exemplo, para especificar que seu dispositivo tem um flash de câmera e pode focar automaticamente, adicione as seguintes linhas no makefile<device>/<company_name>/<device_name>/device.mk
makefile do seu dispositivo: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 makefile de dispositivo, consulte
device/samsung/tuna/device.mk
. - Declare o codec de mídia, o formato e os recursos de resolução da sua câmera nos arquivos XML
device/<company_name>/<device_name>/media_profiles.xml
edevice/<company_name>/<device_name>/media_codecs.xml
. Para obter detalhes, consulte Expondo codecs à estrutura . - Adicione as seguintes linhas no
device/<company_name>/<device_name>/device.mk
do seu dispositivo para copiar os arquivosmedia_profiles.xml
emedia_codecs.xml
para o 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
- Para incluir o aplicativo Câmera na imagem do sistema do seu dispositivo, especifique-o na variável
PRODUCT_PACKAGES
no makefiledevice/<company>/<device>/device.mk
do seu dispositivo:PRODUCT_PACKAGES := \ Gallery2 \ ...