Phát hiện thiết bị trong Tradefed

Việc kết nối thiết bị mới sẽ kích hoạt một loạt sự kiện không đồng bộ chưa rõ ràng nhưng đáng tìm hiểu.

Kết nối vật lý

Tradefed sử dụng thư viện ddmlib (một thư viện Java adb) để cung cấp hoạt động tương tác cơ bản với adb và các thiết bị. Một phần của giải pháp này là giao diện IDeviceChangeListener cho phép nhận các sự kiện thiết bị mới, chẳng hạn như:

  • deviceConnected: Khi adb phát hiện thấy một thiết bị mới
  • deviceDisconnected: Khi một thiết bị không còn báo cáo cho adb nữa
  • deviceChanged: Khi trạng thái chính của thiết bị xảy ra (chẳng hạn như thiết bị ngoại tuyến hoặc thiết bị trực tuyến)

Những sự kiện này là đủ ở cấp adb để quyết định xem thiết bị có kết nối, trực tuyến hay ngoại tuyến hay không. Nhưng đối với bộ kiểm thử, chúng ta cần một trạng thái mạnh hơn trạng thái này để đảm bảo thiết bị thực sự sẵn sàng bắt đầu chạy các kiểm thử; trạng thái này không bị ảnh hưởng bởi sự không ổn định tiềm ẩn về trạng thái có thể xảy ra với một thiết bị mới kết nối.

Đây là chuỗi sự kiện trong Tradefed:

  1. Thiết bị được nhận dạng là deviceConnected và mở cho các sự kiện thông thường từ adb
  2. Một sự kiện Tradefed nội bộ sẽ được tạo để:

    • Kiểm tra xem thiết bị đã được biết đến hay chưa; Tradefed giữ thông tin tham chiếu nội bộ cho một số thiết bị (đặc biệt là thiết bị hiện được phân bổ và đang chạy các kiểm thử) để tránh TF mất dấu vết của các thiết bị đó một cách ngẫu nhiên.
    • Kiểm tra xem thiết bị có phải là ONLINE hay OFFLINE.
  3. Nếu thiết bị là:

    • OFFLINE: Thiết bị sẽ chuyển sang trạng thái Tradefed CONNECTED_OFFLINE, trạng thái này chưa cho phép thiết bị chạy các kiểm thử. Nếu thiết bị kết nối mạng sau, thiết bị sẽ trải qua chu kỳ ONLINE. Nếu chúng ta nhận được một sự kiện deviceDisconnect, thiết bị sẽ chỉ bị xoá khỏi danh sách.

    • ONLINE (như adb thấy): Thiết bị sẽ được chuyển sang trạng thái CONNECTED_ONLINE và sẽ được kiểm tra tính khả dụng để phân bổ kiểm thử: checking_availability.

  4. Nếu quá trình kiểm tra availability thành công, thiết bị sẽ được đánh dấu là có sẵn để phân bổ kiểm thử; thiết bị sẽ có thể chạy các kiểm thử. Nếu không, thiết bị sẽ được đánh dấu là unavailable để phân bổ và không thể nhận bất kỳ bài kiểm thử nào.

Tất cả các trạng thái này đều được phản ánh trong bảng điều khiển Tradefed khi liệt kê các thiết bị thông qua: tf> list devices

Điều quan trọng cần lưu ý là khi thiết bị hiện được phân bổ cho một quy trình kiểm thử, hầu hết các trường hợp nêu trên sẽ không xảy ra và Tradefed sẽ xác định trạng thái thiết bị nội bộ. Vì vậy, có thể một thiết bị sẽ biến mất khỏi adb devices trong khi Tradefed vẫn liệt kê thiết bị đó. Điều này có thể xảy ra khi một quy trình kiểm thử đang khởi động lại thiết bị, chẳng hạn như vậy.

Thiết bị ảo được kết nối bằng lệnh adb connect

Khi một thiết bị ảo từ xa được tạo, Tradefed sẽ kết nối với thiết bị đó bằng adb connect. Thao tác này thường sẽ kích hoạt thiết bị xuất hiện trong adb devices dưới dạng <some ip>:<port number> và sẽ tuân theo cùng một trình tự như các thiết bị được kết nối thực.

Theo dõi thiết bị khi xảy ra sự kiện deviceConnected

Khi deviceConnected xảy ra, ddmlib sẽ tạo một tham chiếu IDevice mới để theo dõi thiết bị vừa kết nối.

Tradefed sử dụng thông tin tham chiếu đó và bao bọc thông tin tham chiếu đó trong quá trình triển khai giao diện thiết bị riêng ITestDevice để cung cấp dịch vụ nâng cao hơn. Nhưng IDevice cơ bản luôn là IDevice đến từ ddmlib.

Điều này có nghĩa là nếu một thiết bị mới được kết nối, thì một ITestDevice mới sẽ được tạo và liên kết với IDevice. Khi điều này xảy ra trong quá trình gọi và ITestDevice đang được sử dụng, IDevice cơ bản vẫn được thay thế để quá trình kiểm thử có thể tiếp tục dựa trên thông tin tham chiếu thích hợp. Việc này diễn ra liền mạch mỗi khi thiết bị bị ngắt kết nối/kết nối lại (ví dụ: trong quá trình khởi động lại).