Testar a HAL da câmera

Esta página lista todos os testes disponíveis para avaliar a camada de abstração de hardware (HAL) da câmera do Android. Ele é destinado a fabricantes de equipamentos originais (OEMs) e fornecedores de processadores de aplicativos (APs) para garantir a implementação adequada do HAL da câmera com o mínimo de defeitos. Embora seja uma adição voluntária ao Teste de compatibilidade do Android (CTS), ela aumenta muito a cobertura de testes da câmera e certamente vai identificar possíveis bugs.

Ao passar nesses testes, os OEMs validam se integraram corretamente as interfaces da camada de abstração de hardware (HAL) 3 da câmera do Android. Quando um dispositivo está em conformidade com todos os itens da checklist, a implementação pode ser considerada completa em relação às interfaces HAL da câmera do Android. Isso vai permitir que um dispositivo ofereça suporte adequado ao pacote android.hardware.camera2, que é a base dos apps de câmera.

Especificação da HAL3 da câmera

A especificação HAL3 da câmera do Android é a fonte oficial de informações sobre o que os dispositivos precisam atender. Esta página fornece um resumo de todos os testes que podem ser usados como uma checklist. Os implementadores da HAL da câmera (por exemplo, fornecedores de AP) precisam analisar a especificação da HAL3 da câmera linha por linha e garantir que os dispositivos estejam em conformidade com ela.

A especificação HAL atual é definida nestes arquivos no Android 5.0 e em versões mais recentes do Kit de desenvolvimento da plataforma Android (PDK) genérico:

Tipos de teste de câmera

Confira os principais tipos de testes disponíveis para a câmera Android mais recente, além de referências às instruções associadas abaixo:

Todos esses tipos de teste são descritos em detalhes abaixo. Esses testes são apresentados na ordem cronológica em que os OEMs devem executá-los.

Por exemplo, se um dispositivo falhar nos testes nativos, ele certamente vai falhar nos testes subsequentes do conjunto de teste de compatibilidade (CTS). E se um dispositivo falhar no CTS, não adianta prosseguir para o conjunto de testes de imagem (ITS). Recomendamos resolver as falhas em cada tipo de teste antes de passar para o próximo conjunto de testes.

Testes do Vendor Test Suite (VTS)

O Android Vendor Test Suite (VTS) é um conjunto de testes que funciona no nível da interface HIDL. Para mais informações sobre como usar o VTS, consulte Conjunto de teste de fornecedor.

Testes do conjunto de teste de compatibilidade (CTS)

Os testes do Teste de compatibilidade do Android (CTS) da câmera se concentram na compatibilidade do dispositivo. Para informações sobre como configurar um ambiente de teste, consulte Como configurar o CTS.

O caminho inicial para os testes de CTS da câmera é: platform/cts.

Ao executar o CTS da câmera em dispositivos que oferecem suporte a câmeras externas (como webcams USB), é necessário conectar um dispositivo ao executar o CTS. Caso contrário, os testes vão falhar automaticamente. Exemplos de câmeras externas: Webcam Logitech HD Pro C920 e Microsoft LifeCam HD-3000.

Consulte a introdução ao CTS e as subpáginas dela para instruções gerais sobre como executar o CTS.

Testes do CTS para a API android.hardware.Camera

Encontre esses testes de câmera em cts/tests/tests/:

  • hardware/src/android/hardware/cts/CameraTest.java
  • hardware/src/android/hardware/cts/CameraGLTest.java
  • hardware/src/android/hardware/cts/Camera_SizeTest.java
  • permission/src/android/permission/cts/CameraPermissionTest.java

Testes do CTS para a API android.hardware.camera2

Encontre esses testes de câmera em cts/tests/tests/:

  • hardware/src/android/hardware/camera2/cts/*
  • permission/src/android/permission/cts/Camera2PermissionTest.java

Testes de câmera do CTS Verifier

Encontre esses testes de câmera em: cts/apps/CtsVerifier/src/com/android/cts/verifier/camera/*

Testes do pacote de testes de imagens (ITS)

Os testes do pacote de testes de imagens da câmera (ITS) se concentram na correção da imagem. Para realizar os testes, execute os scripts Python em uma estação de trabalho com o dispositivo Android conectado via USB.

A infraestrutura e os testes ITS da câmera estão localizados no diretório cts/apps/CameraITS. Cada teste fica em um subdiretório tests/scene#.

Para mais informações sobre como configurar e executar os testes, consulte Camera ITS.

Para descrições de cenas e testes, consulte Testes de ITS da câmera.

Os testes do ITS são aprovados ou reprovados. Todos os testes obrigatórios em cada pasta de cena precisam ser aprovados. Os testes não obrigatórios podem falhar e ainda contar como uma aprovação em CtsVerifier.

Os testes do ITS testam cenários que não são testados no CTS e são um componente importante do plano de teste do HAL 3.2.

Testes do Media Framework

Aprovar todos os testes de mídia relacionados à câmera em MediaFrameworkTest. Esses testes exigem que o arquivo mediaframeworktest.apk esteja instalado no dispositivo Android. Você vai precisar make mediaframeworktest e usar o adb para instalar o .apk resultante. Exemplos de comandos estão incluídos abaixo.

O caminho inicial para testes de framework de mídia relacionados à câmera é: platform/frameworks/base

Encontre o código-fonte dos testes aqui: frameworks/base/media/tests/MediaFrameworkTest

Para configurar esses testes:

make mediaframeworktest
adb install out/target/product/name/data/app/mediaframeworktest.apk

Em que a variável name representa o diretório que contém o produto do fornecedor.

Encontre todos os testes no seguinte diretório ou subdiretórios:

frameworks/base/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest

Cada subdiretório representa uma classe de testes:

  • functional/
  • integration/
  • performance/
  • power/
  • stress/
  • unit/

Executar testes do Media Framework

Para conferir todos os testes disponíveis::

adb shell pm list instrumentation

Isso vai gerar resultados semelhantes a:

instrumentation:com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
(target=com.android.mediaframeworktest)
instrumentation:com.android.mediaframeworktest/.MediaRecorderStressTestRunner
(target=com.android.mediaframeworktest)
instrumentation:com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner
(target=com.android.mediaframeworktest)
instrumentation:com.android.mediaframeworktest/.MediaFrameworkPowerTestRunner
(target=com.android.mediaframeworktest)

Identifique e extraia o componente (entre instrumentation: e (target=com.android.mediaframeworktest) ) de cada linha de teste. O componente é composto pelo nome do pacote de destino (com.android.mediaframeworktest) e pelo nome do executor de teste (MediaFrameworkTestRunner).

Por exemplo:

com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
com.android.mediaframeworktest/.MediaRecorderStressTestRunner
com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner
com.android.mediaframeworktest/.MediaFrameworkPowerTestRunner

Em seguida, transmita cada componente para adb shell am instrument da seguinte maneira:

adb shell am instrument -w component.name

Em que component.name é igual ao valor extraído acima. Por exemplo:

adb shell am instrument -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner

Embora o caminho de classe seja o pacote Java + nome da classe, o pacote de instrumentação não é necessariamente o mesmo que o pacote Java. Use o pacote AndroidManifest.xml ao concatenar o nome do componente, não o pacote Java em que a classe de execução de teste reside.

Para executar uma única classe de testes, transmita o argumento -e class , como este:

adb shell am instrument -e class com.android.mediaframeworktest.integration.CameraBinderTest -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner

Para executar apenas um método em uma classe de teste, adicione um sinal de libra (#) e o nome do método (neste caso, testConnectPro) ao nome da classe, assim:

adb shell am instrument -e class 'com.android.mediaframeworktest.integration.CameraBinderTest#testConnectPro' -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner

Testes funcionais das configurações de mídia

Confira um exemplo de execução de um teste funcional. Esse teste verifica a funcionalidade básica de diferentes combinações de configurações da câmera. (ou seja, flash, exposição, WB, cena, tamanho da imagem e geotag)

Execute o comando de teste:

adb shell am instrument -w -r  -e delay_msec 15 -e log true -e class com.android.mediaframeworktest.functional.camera.CameraPairwiseTest com.android.mediaframeworktest/com.android.mediaframeworktest.CameraStressTestRunner

Testes de integração de mídia

Confira um exemplo de execução de um teste de integração, neste caso mediaframeworktest/integration/CameraBinderTest.java e mediaframeworktest/CameraStressTestRunner.java:

adb  shell am instrument -e class \ 'com.android.mediaframeworktest.integration.CameraBinderTest' -w \ 'com.android.mediaframeworktest/.CameraStressTestRunner'

Se for bem-sucedido, o resultado será semelhante a este:

-----

com.android.mediaframeworktest.integration.CameraBinderTest:...........
Test results for CameraStressTestRunner=...........
Time: 3.328

OK (11 tests)

-----

Testes de performance de mídia

Esse teste de memória de visualização vai abrir e liberar a visualização da câmera 200 vezes. Em cada 20 iterações, o snapshot do mediaserver ps será gravado e comparará o uso de memória diferente após 200 iterações. O teste vai falhar se a diferença for maior que 150 km.

Execute o comando de teste:

adb shell am instrument -w -r  -e class com.android.mediaframeworktest.performance.MediaPlayerPerformance#testCameraPreviewMemoryUsage com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner

Confira uma saída mais detalhada em: /sdcard/mediaMemOutput.txt

Testes de unidade de mídia

Os comandos para executar testes de unidade são todos semelhantes. Por exemplo, para CameraMetadataTest.java, o comando seria:

adb shell am instrument -e class 'com.android.mediaframeworktest.unit.CameraMetadataTest' -w 'com.android.mediaframeworktest/.CameraStressTestRunner'

Testes de estresse de mídia

Esse teste é para estressar a captura de imagens e a gravação de vídeo da câmera.

Execute o comando de teste:

adb shell am instrument -w com.google.android.camera.tests/com.android.camera.stress.CameraStressTestRunner

Todos os testes precisam ser aprovados.

Testes manuaisTestes de câmera

O app TestingCam precisa ser executado manualmente com as seguintes verificações: A fonte do TestingCam está aqui: pdk/apps/TestingCamera/

Foco no infinito com inclinação da câmera

Inicie o TestingCam, ative a visualização e verifique se o modo de foco automático está definido como infinito. Usando o botão Tirar foto, capture imagens de objetos distantes (pelo menos 10 m de distância) com a câmera apontada horizontalmente, para cima (perto da vertical) e para baixo (perto da vertical). Um exemplo de foto para cima pode ser folhas/galhos altos de uma árvore de baixo para cima, e um exemplo de foto para baixo pode ser a rua vista do telhado de um prédio. Em todos os casos, o objeto distante precisa estar nítido e em foco. Salve e confira as fotos na visualização em galeria para aumentar o zoom e inspecionar a nitidez com mais facilidade.

Para que uma câmera com um atuador VCM passe nesse teste, ela precisa de um sistema de controle AF de circuito fechado ou de algum tipo de correção de software com base no uso de dados do acelerômetro para determinar a orientação da câmera. Também será necessária uma calibragem de fábrica confiável da posição infinita da lente.

Testes manuais do Cam2

O app TestingCam2 precisa ser executado manualmente, com as seguintes verificações realizadas. A fonte do TestingCam2 está aqui: pdk/apps/TestingCamera2/

Captura JPEG

Inicie o TestingCam2 e pressione o botão JPEG. A imagem que aparece à direita da imagem do visor precisa ser igual ao visor, incluindo a mesma orientação.