اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
رصد الأجهزة في Tradefed
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يؤدي ربط جهاز جديد إلى بدء سلسلة من الأحداث غير المتزامنة التي ليست
واضحة، ولكن من المفيد فهمها.
متصلة جسديًا
يستخدم Tradefed مكتبة ddmlib
(مكتبة adb
لتطبيقات Java) لتوفير التفاعل الأساسي مع adb
والأجهزة. يشكّل واجهة IDeviceChangeListener جزءًا من هذا الحل، إذ تتيح هذه الواجهة تلقّي أحداث الأجهزة الجديدة، مثل:
deviceConnected
: عندما يرصد adb
جهازًا جديدًا
deviceDisconnected
: عندما يتوقف أحد الأجهزة عن إرسال التقارير إلى adb
deviceChanged
: عند حدوث تغيير كبير في حالة الجهاز (مثل الجهاز غير متصل بالإنترنت أو
الجهاز متصل بالإنترنت)
تكون هذه الأحداث كافية على مستوى adb
لتحديد ما إذا كان الجهاز
متصلاً بالإنترنت أو غير متصل به أو على الإنترنت أو غير متصل به. ولكن بالنسبة إلى مجموعة الاختبار، نحتاج إلى حالة
أقوى من هذه لضمان استعداد الجهاز فعليًا لبدء إجراء الاختبارات، ويجب ألا يتأثر
بالحالة غير المستقرة المحتملة التي يمكن أن تحدث لجهاز مرتبط حديثًا.
في ما يلي تسلسل الأحداث في Tradefed:
- تم التعرّف على الجهاز باسم
deviceConnected
وهو مفتوح للأحداث العادية من
adb
يتمّ إنشاء حدث داخلي في Tradefed سيؤدي إلى ما يلي:
- تحقّق ممّا إذا كان الجهاز معروفًا من قبل، إذ يحتفظ Tradefed بمرجع داخلي
لبعض الأجهزة (خاصةً الجهاز الذي تم تخصيصه حاليًا وإجراء الاختبارات عليه)
لتجنّب فقدان TF تتبُّعه بشكل عشوائي.
- تحقَّق مما إذا كان الجهاز
ONLINE
أو OFFLINE
.
إذا كان الجهاز:
OFFLINE
: سيتم تبديل حالة الجهاز إلى CONNECTED_OFFLINE
Tradefed، وهي حالة لا تسمح للجهاز بإجراء الاختبارات بعد. إذا كان الجهاز
متصلاً بالإنترنت لاحقًا، سيخضع لدورة 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. وعندما يحدث ذلك أثناء طلب برمجي واستخدام IDETestDevice، سيظلّ الجهاز الأساسي IDevice مثبّتًا كي تتمكّن من مواصلة الاختبار بالاستناد إلى المرجع المناسب. ويتم ذلك بسلاسة في كل مرة يتم فيها فصل أحد
الأجهزة أو إعادة توصيله (على سبيل المثال، أثناء إعادة التشغيل).
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Device detection in Tradefed\n\nA new device connection triggers a series of asynchronous events that are not\nobvious yet worth understanding.\n\nPhysically connected\n--------------------\n\nTradefed uses the `ddmlib` library (a Java `adb` library) to provide the basic\ninteraction with `adb` and devices. Part of this solution is the\n[IDeviceChangeListener interface](https://android.googlesource.com/platform/tools/base/+/refs/heads/android16-release/ddmlib/src/main/java/com/android/ddmlib/AndroidDebugBridge.java)\nthat allows reception of new device events, such as:\n\n- `deviceConnected`: When a new device is seen by `adb`\n- `deviceDisconnected`: When a device is not reporting to `adb` anymore\n- `deviceChanged`: When a major device state occurs (such as device offline or device online)\n\nThese events are enough at the `adb` level to decide whether or not a device is\nconnected, online, or offline. But for the test harness, we need a stronger\nstate than this to ensure a device is truly ready to start running tests; it\nshould not be impacted by potential state flakiness that can come with a newly\nconnected device.\n\nThis is the sequence of events in Tradefed:\n\n1. Device is recognized as `deviceConnected` and open to regular events from `adb`\n2. An internal Tradefed event is created that will:\n\n - Check if the device is known already; Tradefed keeps internal reference to some devices (especially the one current allocated and running tests) to avoid TF losing track of them randomly.\n - Check if the device is `ONLINE` or `OFFLINE`.\n3. If device is:\n\n - `OFFLINE`: Device will be switched to Tradefed `CONNECTED_OFFLINE`\n state, which doesn't allow the device to run tests yet. If the device is\n online later, it will go through the `ONLINE` cycle. If we receive a\n `deviceDisconnect` event, the device will simply be removed from the list.\n\n - `ONLINE` (as seen by adb): Device will be put in the state\n `CONNECTED_ONLINE` and will have its availability checked for test\n allocation: `checking_availability`.\n\n4. If `availability` check is successful, the device will be marked as\n available for test allocation; it will be able to run tests. If not, the\n device will be marked as `unavailable` for allocation and cannot receive any\n tests.\n\nAll of these states are reflected in the Tradefed console when listing the\ndevices via: `tf\u003e list devices`\n\nIt's important to note that when the device is currently allocated for a test,\nmost of the above will not occur and Tradefed will determine the device state\ninternally. So it's possible for a device to disappear from `adb devices` while\nstill being listed by Tradefed. That can happen when a test is rebooting the\ndevice for example.\n\nVirtual device connected with adb connect\n-----------------------------------------\n\nWhen a remote virtual device is created, Tradefed connects to it using `adb\nconnect`. This will usually trigger the device showing in `adb devices` as\n`\u003csome ip\u003e:\u003cport number\u003e` and will follow the same sequence as physically\nconnected devices.\n\nDevice tracking when a deviceConnected event occurs\n---------------------------------------------------\n\nWhen `deviceConnected` occurs, `ddmlib` creates a new reference\n[IDevice](https://android.googlesource.com/platform/tools/base/+/refs/heads/android16-release/ddmlib/src/main/java/com/android/ddmlib/IDevice.java)\nto track the newly connected device.\n\nTradefed uses that reference and wraps it in its own implementation of device\ninterface\n[ITestDevice](https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/android16-release/device_build_interfaces/com/android/tradefed/device/ITestDevice.java)\nto provide more advanced service. But the underlying IDevice is always the one\ncoming from `ddmlib`.\n\nThis means if a new device is connected, a new ITestDevice is created and\nassociated with the IDevice. When this happens during an invocation and the\nITestDevice is being used, the underlying IDevice is still replaced so\ntesting can proceed on the proper reference. This is done seamlessly each time a\ndevice is disconnected/reconnected (for example, during a reboot)."]]