اختبار المصنّع الأصلي للجهاز

يستخدم عدد كبير من تطبيقات Android تطبيق ExoPlayer. بصفتك مُصنّعًا أصليًا، من المهم التأكّد من عمل ExoPlayer بشكلٍ صحيح على كلّ من الأجهزة الجديدة والإصدارات الأنظمة الأساسية الجديدة للأجهزة الحالية. تصف هذه الصفحة اختبارات التوافق التي ننصح بتشغيلها قبل شحن جهاز أو نظام أساسي عبر الهواء، وبعض أوضاع الفشل الشائعة التي تواجهها عند تشغيلها.

إجراء الاختبارات

لإجراء اختبارات تشغيل 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. السبب الأكثر وضوحًا هو أن برنامج فك ترميز الفيديو هي المخازن المؤقتة البطيئة لفك الترميز. إذا لم تحدث إخفاقات إلا لمجموعة فرعية من الاختبارات التي تشغِّل محتوى Waze المحمي، فمن المحتمل أن تكون عمليات النظام الأساسي لفك تشفير المخزن المؤقت بطيئة جدًا. ونقترح عليك التحقق من أداء هذه المكوّنات، وتحديد ما إذا كان يمكن إجراء أي تحسينات لتسريعها.

تعذّرت مصادقة النافذة الأصلية.

ستحتوي 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). يُرجى فحص حزم الاستدعاءات لسلاسل المحادثات خلال عملية الاختبار لتحديد ما إذا كان هذا هو الحال.