Testes de OEM

O ExoPlayer é usado por um grande número de apps Android. Como OEM, é importante garantir que o ExoPlayer funcione corretamente em novos dispositivos e em novos builds de plataforma para dispositivos já existentes. Esta página descreve os testes de compatibilidade que recomendamos executar antes de enviar um dispositivo ou plataforma OTA, e alguns dos modos de falha comuns encontrados nessa etapa.

Como executar os testes

Para executar os testes de reprodução do ExoPlayer, primeiro confira a versão mais recente do ExoPlayer no GitHub (link em inglês). Em seguida, execute os testes na linha de comando ou no Android Studio.

Linha de comando

No diretório raiz, crie e instale os testes de reprodução:

./gradlew :test-exoplayer-playback:installDebug

Em seguida, execute os testes de reprodução no pacote GTS:

adb shell am instrument -w -r -e debug false \
  -e package androidx.media3.test.exoplayer.playback.gts \
  androidx.media3.test.exoplayer.playback.test/androidx.test.runner.AndroidJUnitRunner

Os resultados do teste são exibidos em STDOUT.

Android Studio

Abra o projeto do ExoPlayer, navegue até o módulo playbacktests, clique com o botão direito do mouse na pasta gts e execute os testes. Os resultados do teste aparecem na janela Run do Android Studio.

Modos de falha comuns

Alguns dos modos de falha comuns encontrados ao executar os testes de reprodução do ExoPlayer estão descritos abaixo, junto com a causa raiz provável em cada caso. Adicionaremos a essa lista à medida que mais modos de falha forem descobertos.

Carimbo de data/hora inesperado da apresentação do buffer de vídeo

O Logcat vai conter um erro semelhante a este:

Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).

Essa falha geralmente é causada pelo decodificador de vídeo em teste descartando, inserindo ou reordenando buffers incorretamente. No exemplo acima, o teste esperava cancelar a fila de um buffer com o carimbo de data/hora da apresentação 134766000 de MediaCodec.dequeueOutputBuffer, mas descobriu que ele removeu a fila um com carimbo de data/hora da apresentação 134733000. Recomendamos verificar a implementação do decodificador ao encontrar essa falha, principalmente se ela processa corretamente as chaves de resolução adaptáveis sem descartar nenhum buffer.

Muitos buffers descartados

O Logcat vai conter um erro semelhante a este:

junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.

Essa falha é um problema de desempenho em que o decodificador de vídeo em teste estava atrasando a decodificação de um grande número de buffers. No exemplo acima, o ExoPlayer descartou 200 buffers porque eles estavam atrasados no momento em que foram removidos da fila, para um teste que impõe um limite de 25. A causa mais óbvia é que o decodificador de vídeo tem buffers de decodificação muito lentos. Se as falhas ocorrerem apenas no subconjunto de testes que reproduzem conteúdo protegido pelo Widevine, é provável que as operações da plataforma para descriptografia de buffer sejam muito lentas. Recomendamos verificar o desempenho desses componentes e analisar se é possível fazer otimizações para acelerá-los.

Não foi possível autenticar a janela nativa

O Logcat vai conter um erro semelhante a este:

SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff

Essa falha indica que a plataforma não definiu corretamente a flag de bit seguro.

O teste expirou

O Logcat vai conter um erro semelhante a este:

AssertionFailedError: Test timed out after 300000 ms.

Essa falha geralmente é causada por uma conectividade de rede ruim durante a execução do teste. Se o dispositivo parecer ter uma boa conectividade de rede, é possível que o teste esteja travado ao chamar um componente da plataforma (como MediaCodec, MediaDrm ou AudioTrack). Inspecione as pilhas de chamadas das linhas de execução no processo de teste para estabelecer se esse é o caso.