מספר רב של אפליקציות ל-Android משתמשות ב-ExoPlayer. יצרני ציוד מקורי (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 Studio
פותחים את פרויקט 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). כדאי לבדוק את מחסניות הקריאות של השרשורים בתהליך הבדיקה כדי לראות אם זה המקרה.