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 các sự kiện không đồng bộ không rõ ràng nhưng đáng hiểu.

Kết nối vật lý

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 thiết bị không báo cáo với adb nữa
  • deviceChanged: Khi xảy ra trạng thái thiết bị chính (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ủa các sự kiện trong Tradefeed:

  1. Thiết bị được nhận dạng là deviceConnected và sẵn sàng nhận các sự kiện định kỳ 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ổ để kiểm thử: 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

Điều quan trọng bạn cần lưu ý là khi thiết bị đang được phân bổ cho một chương trình kiểm thử, hầu hết những điều nêu trên sẽ không xảy ra và Tradefeed sẽ xác định trạng thái của 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 đã kết nối với 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.

Tradefeed sử dụng tham chiếu đó và gói nó trong cách triển khai giao diện thiết bị ITestDevice riêng để 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).