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.
- 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 aCameraDevice
e, por fim,CameraCaptureSession
no nível do framework. - framework nativo
- Esse framework que reside em
frameworks/av/
fornece uma os nativosCameraDevice
eCameraCaptureSession
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 eICameraServiceListener
eICameraDeviceCallbacks
são os respectivosCameraService
eCameraDevice
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:
-
ICameraProvider
: Para enumerar dispositivos individuais e gerenciar o status deles. -
ICameraDevice
: A interface do dispositivo da câmera. -
ICameraDeviceSession
: Interface da sessão do dispositivo de câmera ativa.
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.
- 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 emframeworks/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 criarandroid.hardware.Camera
no nível do framework. - framework nativo
- O framework nativo definido em
frameworks/av/camera/Camera.cpp
oferece um equivalente nativoandroid.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, eICameraClient
é 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
:
- Criar um
device/<company_name>/<device_name>/camera
para conter os arquivos de origem da biblioteca. - 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 emhardware/ti/omap4xxx/Android.mk
: - 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
: - 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
edevice/<company_name>/<device_name>/media_codecs.xml
Arquivos XML. Para mais detalhes, consulte A exposição de codecs ao framework. - Adicione as seguintes linhas ao comando
Makefile
device/<company_name>/<device_name>/device.mk
para copiarmedia_profiles.xml
emedia_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
- Para incluir o aplicativo Câmera na imagem do sistema do seu dispositivo, especifique-o no
A variável
PRODUCT_PACKAGES
nodevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...