ExoPlayer используется большим количеством приложений для Android. OEM-производителю важно убедиться, что ExoPlayer работает правильно как на новых устройствах, так и на новых платформах для существующих устройств. На этой странице описаны тесты совместимости, которые мы рекомендуем проводить перед отправкой устройства или платформы OTA, а также некоторые распространенные режимы сбоев, возникающие при их запуске.
Запуск тестов
Чтобы запустить тесты воспроизведения ExoPlayer, сначала ознакомьтесь с последней версией ExoPlayer на GitHub . Затем вы можете запустить тесты из командной строки или Android Studio.
Командная строка
Из корневого каталога соберите и установите тесты воспроизведения:
./gradlew :test-exoplayer-playback:installDebug
Далее запустите тесты воспроизведения в пакете 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
Результаты теста отображаются в STDOUT.
Android-студия
Откройте проект ExoPlayer, перейдите к модулю playbacktests
, щелкните правой кнопкой мыши папку gts
и запустите тесты. Результаты теста отображаются в окне «Выполнить» Android Studio.
Распространенные виды отказов
Некоторые из распространенных режимов сбоев, возникающих при запуске тестов воспроизведения ExoPlayer, описаны ниже вместе с вероятной основной причиной в каждом случае. Мы будем дополнять этот список по мере обнаружения новых видов отказа.
Неожиданная временная метка представления видеобуфера
Logcat будет содержать ошибку, похожую на:
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
Этот сбой чаще всего вызван тем, что тестируемый видеодекодер неправильно отбрасывает, вставляет или переупорядочивает буферы. В приведенном выше примере тест ожидал исключить из очереди буфер с отметкой времени представления 134766000
из MediaCodec.dequeueOutputBuffer
, но обнаружил, что вместо этого он исключил из очереди буфер с отметкой времени представления 134733000
. Мы рекомендуем вам проверить реализацию декодера при возникновении этой ошибки, в частности, правильно ли он обрабатывает переключатели адаптивного разрешения, не отбрасывая какие-либо буферы.
Слишком много удаленных буферов
Logcat будет содержать ошибку, похожую на:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Этот сбой является проблемой производительности, поскольку тестируемый видеодекодер запаздывает с декодированием большого количества буферов. В приведенном выше примере ExoPlayer отбросил 200 буферов, поскольку они опоздали к моменту удаления из очереди, для теста, который накладывает ограничение в 25. Наиболее очевидная причина заключается в том, что видеодекодер слишком медленно декодирует буферы. Если сбои происходят только для подмножества тестов, которые воспроизводят защищенный Widevine контент, вполне вероятно, что операции платформы по расшифровке буфера выполняются слишком медленно. Мы рекомендуем проверить производительность этих компонентов и посмотреть, можно ли провести какую-либо оптимизацию для их ускорения.
Не удалось аутентифицировать собственное окно
Logcat будет содержать ошибку, похожую на:
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
Этот сбой указывает на то, что платформа не может правильно установить флаг безопасного бита.
Время тестирования истекло
Logcat будет содержать ошибку, похожую на:
AssertionFailedError: Test timed out after 300000 ms.
Этот сбой чаще всего вызван плохим сетевым подключением во время тестового запуска. Если устройство имеет хорошее сетевое подключение, возможно, тест зависает при вызове компонента платформы (например, MediaCodec
, MediaDrm
или AudioTrack
). Проверьте стеки вызовов потоков в тестовом процессе, чтобы установить, так ли это.