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

Một 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ộ không rõ ràng nhưng đáng hiểu.

Kết nối thực tế

Tradefed sử dụng thư viện ddmlib (thư viện adb Java) để 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 tiế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
  • deviceChanged: Khi trạng thái thiết bị chính xảy ra (chẳng hạn như thiết bị ngoại tuyến hoặc thiết bị trực tuyến)

Các 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. Tuy nhiên, đối với bộ kiểm thử, chúng ta cần một trạng thái mạnh hơn để đảm bảo thiết bị thực sự sẵn sàng bắt đầu chạy kiểm thử; trạng thái này không được bị ảnh hưởng bởi trạng thái không ổn định tiềm ẩn có thể xảy ra với một thiết bị mới kết nối.

Đây là trình tự các 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. Hệ thống sẽ tạo một sự kiện Tradefed nội bộ để:

    • Kiểm tra xem thiết bị đã được biết hay chưa; Tradefed lưu giữ tệp tham chiếu nội bộ cho một số thiết bị (đặc biệt là thiết bị hiện đang được phân bổ và chạy kiểm thử) để tránh việc TF bị mất dấu 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ẽ được chuyển sang trạng thái CONNECTED_OFFLINE của Tradefed, trạng thái này chưa cho phép thiết bị chạy kiểm thử. Nếu sau đó thiết bị có kết nối mạng, 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ẽ bị xoá khỏi danh sách.

    • ONLINE (theo adb): Thiết bị sẽ được đặt ở trạng thái CONNECTED_ONLINE và sẽ được kiểm tra khả năng phân bổ thử nghiệm: checking_availability.

  4. Nếu 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 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 được bất kỳ 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

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

Thiết bị ảo được kết nối bằng 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ị hiển thị trong adb devices dưới dạng <some ip>:<port number> và sẽ tuân theo trình tự tương tự như các thiết bị được kết nối thực tế.

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 tệp tham chiếu mới IDevice để theo dõi thiết bị mới kết nối.

Tradefed sử dụng tệp tham chiếu đó và gói tệp tham chiếu đó trong quá trình triển khai giao diện thiết bị ITestDevice của riêng mình để cung cấp dịch vụ nâng cao hơn. Tuy nhiên, 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, 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 một lệ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 tệp tham chiếu thích hợp. Việc này được thực hiện 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).