Rất nhiều ứng dụng Android sử dụng ExoPlayer. Là một OEM, bạn cần đảm bảo rằng ExoPlayer hoạt động chính xác trên cả thiết bị mới và bản dựng nền tảng mới cho thiết bị hiện có. Trang này mô tả các kiểm thử khả năng tương thích mà bạn nên chạy trước khi phát hành OTA cho thiết bị hoặc nền tảng, cũng như một số chế độ lỗi thường gặp khi chạy các kiểm thử này.
Chạy các kiểm thử
Để chạy các kiểm thử phát của ExoPlayer, trước tiên, hãy kiểm tra bản phát hành mới nhất của ExoPlayer trên GitHub. Sau đó, bạn có thể chạy các kiểm thử này qua dòng lệnh hoặc Android Studio.
Dòng lệnh
Từ thư mục gốc, hãy tạo và cài đặt các kiểm thử phát lại:
./gradlew :test-exoplayer-playback:installDebug
Tiếp theo, hãy chạy các kiểm thử phát lại trong gói 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
Kết quả kiểm thử sẽ xuất hiện trong STDOUT.
Android Studio
Mở dự án ExoPlayer, chuyển đến mô-đun playbacktests, nhấp chuột phải vào thư mục gts rồi chạy các kiểm thử. Kết quả kiểm thử sẽ xuất hiện trong cửa sổ chạy của Android Studio.
Các chế độ lỗi thường gặp
Dưới đây là một số chế độ lỗi thường gặp khi chạy các bài kiểm thử phát của ExoPlayer, cùng với nguyên nhân gốc có thể xảy ra trong mỗi trường hợp. Chúng tôi sẽ bổ sung vào danh sách này khi phát hiện thêm các chế độ lỗi khác.
Dấu thời gian trình bày vùng đệm video ngoài dự kiến
Logcat sẽ chứa một lỗi tương tự như sau:
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
Lỗi này thường xảy ra do bộ giải mã video đang được kiểm thử loại bỏ, chèn hoặc sắp xếp lại các vùng đệm không chính xác. Trong ví dụ trên, phép kiểm thử dự kiến sẽ loại bỏ một vùng đệm có dấu thời gian trình bày 134766000 khỏi MediaCodec.dequeueOutputBuffer, nhưng phát hiện thấy phép kiểm thử này đã loại bỏ một vùng đệm có dấu thời gian trình bày 134733000. Bạn nên kiểm tra việc triển khai bộ giải mã khi gặp phải lỗi này, đặc biệt là bộ giải mã xử lý chính xác các hoạt động chuyển đổi độ phân giải thích ứng mà không loại bỏ bất kỳ bộ đệm nào.
Có quá nhiều vùng đệm bị loại bỏ
Logcat sẽ chứa một lỗi tương tự như sau:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Lỗi này là một vấn đề về hiệu suất, trong đó bộ giải mã video đang được kiểm thử đã giải mã muộn một số lượng lớn các vùng đệm. Trong ví dụ trên, ExoPlayer đã loại bỏ 200 vùng đệm vì chúng bị trễ vào thời điểm được xoá khỏi hàng đợi, đối với một thử nghiệm áp đặt giới hạn là 25. Nguyên nhân rõ ràng nhất là bộ giải mã video giải mã các vùng đệm quá chậm. Nếu lỗi chỉ xảy ra đối với một số ít các kiểm thử phát nội dung được bảo vệ bằng Widevine, thì có thể các thao tác của nền tảng để giải mã vùng đệm diễn ra quá chậm. Bạn nên kiểm tra hiệu suất của các thành phần này và xem xét liệu có thể tối ưu hoá để tăng tốc độ cho các thành phần này hay không.
Không thể xác thực cửa sổ gốc
Logcat sẽ chứa một lỗi tương tự như sau:
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
Lỗi này cho biết nền tảng không đặt đúng cờ bit bảo mật.
Đã hết thời gian kiểm thử
Logcat sẽ chứa một lỗi tương tự như sau:
AssertionFailedError: Test timed out after 300000 ms.
Lỗi này thường xảy ra do kết nối mạng kém trong quá trình chạy kiểm thử. Nếu thiết bị có vẻ kết nối mạng tốt, thì có thể thử nghiệm bị kẹt khi gọi vào một thành phần nền tảng (chẳng hạn như MediaCodec, MediaDrm hoặc AudioTrack). Hãy kiểm tra ngăn xếp lệnh gọi của các luồng trong quy trình kiểm thử để xác định xem có phải trường hợp này hay không.