O ExoPlayer é usado por um grande número de apps Android. Como OEM, é importante garantir que o ExoPlayer funcione corretamente em dispositivos novos e em novas versões de plataforma para dispositivos atuais. Nesta página, descrevemos os testes de compatibilidade que recomendamos executar antes de enviar uma atualização OTA de dispositivo ou plataforma e alguns dos modos de falha comuns encontrados ao executá-los.
Como executar os testes
Para executar os testes de reprodução do ExoPlayer, primeiro confira a versão mais recente do ExoPlayer no GitHub. 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 aparecem em STDOUT.
Android Studio
Abra o projeto 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 testes de reprodução do ExoPlayer são descritos abaixo, junto com a provável causa raiz em cada caso. Vamos adicionar mais produtos na lista à medida que forem descobertos.
Carimbo de data/hora de apresentação do buffer de vídeo inesperado
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 remover da fila um buffer com o carimbo de data/hora de apresentação 134766000 de
MediaCodec.dequeueOutputBuffer, mas descobriu que ele removeu da fila um buffer com o carimbo de data/hora de
apresentação 134733000. Recomendamos que você verifique a implementação do decodificador ao encontrar essa falha, principalmente se ele processa corretamente as mudanças de resolução adaptativa sem descartar buffers.
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 atrasou a decodificação de um grande número de buffers. No exemplo acima, o ExoPlayer descartou 200 buffers porque eles estavam atrasados quando foram removidos da fila, em um teste que impõe um limite de 25. A causa mais óbvia é que o decodificador de vídeo está muito lento para decodificar buffers. 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 estejam muito lentas. Recomendamos verificar a performance desses componentes e analisar se é possível fazer otimizações para acelerar o processo.
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 tempo limite do teste foi atingido
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 travando 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 verificar se é esse o caso.