يؤدي اتصال الجهاز الجديد إلى تشغيل سلسلة من الأحداث غير المتزامنة التي ليست واضحة ولكنها تستحق الفهم.
متصل جسديا
يستخدم Tradefed مكتبة ddmlib
(مكتبة Java adb
) لتوفير التفاعل الأساسي مع adb
والأجهزة. جزء من هذا الحل هو واجهة IDeviceChangeListener التي تسمح باستقبال أحداث الجهاز الجديدة، مثل:
-
deviceConnected
: عندما يرىadb
جهازًا جديدًا -
deviceDisconnected
: عندما لا يقوم الجهاز بالإبلاغ إلىadb
بعد الآن -
deviceChanged
: عند حدوث حالة رئيسية للجهاز (مثل عدم اتصال الجهاز أو اتصال الجهاز بالإنترنت)
هذه الأحداث كافية على مستوى adb
لتحديد ما إذا كان الجهاز متصلاً أو متصلاً بالإنترنت أو غير متصل بالإنترنت أم لا. ولكن بالنسبة لأداة الاختبار، نحتاج إلى حالة أقوى من هذه للتأكد من أن الجهاز جاهز بالفعل لبدء تشغيل الاختبارات؛ ولا ينبغي أن يتأثر بالتقلبات المحتملة التي يمكن أن تأتي مع جهاز متصل حديثًا.
هذا هو تسلسل الأحداث في Tradefed:
- يتم التعرف على الجهاز على أنه
deviceConnected
ومفتوح للأحداث العادية منadb
يتم إنشاء حدث Tradefed داخلي من شأنه:
- التحقق مما إذا كان الجهاز معروفًا بالفعل؛ يحتفظ Tradefed بمرجع داخلي لبعض الأجهزة (خاصة الجهاز الحالي المخصص والاختبارات الجارية) لتجنب فقدان TF لتتبعها بشكل عشوائي.
- تحقق مما إذا كان الجهاز
ONLINE
أمOFFLINE
.
إذا كان الجهاز:
OFFLINE
: سيتم تحويل الجهاز إلى حالة TradefedCONNECTED_OFFLINE
، والتي لا تسمح للجهاز بإجراء الاختبارات حتى الآن. إذا كان الجهاز متصلاً بالإنترنت لاحقًا، فسوف يمر عبر دورة الاتصالONLINE
. إذا تلقينا حدثdeviceDisconnect
، فسيتم ببساطة إزالة الجهاز من القائمة.ONLINE
(كما يراها adb): سيتم وضع الجهاز في الحالةCONNECTED_ONLINE
وسيتم التحقق من توفره لتخصيص الاختبار:checking_availability
.
إذا نجح التحقق
availability
، فسيتم وضع علامة على الجهاز على أنه متاح لتخصيص الاختبار؛ سيكون قادرًا على إجراء الاختبارات. إذا لم يكن الأمر كذلك، فسيتم وضع علامة على الجهاز على أنهunavailable
للتخصيص ولا يمكنه تلقي أي اختبارات.
تنعكس كل هذه الحالات في وحدة تحكم Tradefed عند إدراج الأجهزة عبر: tf> list devices
من المهم ملاحظة أنه عندما يتم تخصيص الجهاز حاليًا للاختبار، فإن معظم ما سبق لن يحدث وستقوم Tradefed بتحديد حالة الجهاز داخليًا. لذلك من الممكن أن يختفي الجهاز من adb devices
بينما يظل مدرجًا بواسطة Tradefed. يمكن أن يحدث ذلك عندما يقوم الاختبار بإعادة تشغيل الجهاز على سبيل المثال.
جهاز افتراضي متصل بـ adb Connect
عند إنشاء جهاز افتراضي بعيد، يتصل Tradefed به باستخدام adb connect
. سيؤدي هذا عادةً إلى ظهور الجهاز في adb devices
كـ <some ip>:<port number>
وسيتبع نفس التسلسل مثل الأجهزة المتصلة فعليًا.
تتبع الجهاز عند وقوع حدث DeviceConnected
عند حدوث deviceConnected
، يقوم ddmlib
بإنشاء IDevice مرجعي جديد لتتبع الجهاز المتصل حديثًا.
يستخدم Tradefed هذا المرجع ويغلفه في تطبيقه الخاص لواجهة الجهاز ITestDevice لتوفير خدمة أكثر تقدمًا. لكن IDevice الأساسي هو دائمًا ما يأتي من ddmlib
.
وهذا يعني أنه إذا تم توصيل جهاز جديد، فسيتم إنشاء ITestDevice جديد وربطه بـ IDevice. عندما يحدث هذا أثناء الاستدعاء ويتم استخدام ITestDevice، فسيتم استبدال IDevice الأساسي حتى يمكن متابعة الاختبار على المرجع المناسب. ويتم ذلك بسلاسة في كل مرة يتم فيها فصل/إعادة توصيل الجهاز (على سبيل المثال، أثناء إعادة التشغيل).