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ộ chưa rõ ràng nhưng vẫn đá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 tương tác cơ bản với adb
và 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 mới của thiết bị, chẳng hạn như:
-
deviceConnected
: Khiadb
nhìn thấy một thiết bị mới -
deviceDisconnected
: Khi một thiết bị không báo cáo vớiadb
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ấp adb
, những sự kiện này đủ để quyết định xem thiết bị có được kết nối, trực tuyến hay ngoại tuyến hay không. Nhưng đối với khai thác thử nghiệm, chúng tôi cần trạng thái mạnh hơn thế này để đảm bảo thiết bị thực sự sẵn sàng bắt đầu chạy thử nghiệm; nó sẽ không bị ảnh hưởng bởi tình trạng mất ổn định tiềm ẩn có thể xảy ra với thiết bị mới được kết nối.
Đây là chuỗi sự kiện trong Tradefed:
- Thiết bị được nhận dạng là
deviceConnected
và sẵn sàng đón nhận các sự kiện thông thường từadb
Một sự kiện Tradefed nội bộ được tạo sẽ:
- Kiểm tra xem thiết bị đã được biết đến chưa; Tradefed giữ tham chiếu nội bộ cho một số thiết bị (đặc biệt là thiết bị được phân bổ hiện tại và đang chạy thử nghiệm) để tránh TF mất dấu chúng một cách ngẫu nhiên.
- Kiểm tra xem thiết bị đang
ONLINE
hayOFFLINE
.
Nếu thiết bị là:
OFFLINE
: Thiết bị sẽ được chuyển sang trạng thái TradefedCONNECTED_OFFLINE
, trạng thái này chưa cho phép thiết bị chạy thử nghiệm. Nếu thiết bị trực tuyến muộn hơn, thiết bị sẽ chuyển sang chu trìnhONLINE
TUYẾN. Nếu chúng tôi nhận được sự kiệndeviceDisconnect
, thiết bị sẽ bị xóa khỏi danh sách.ONLINE
(do adb nhìn thấy): Thiết bị sẽ được đặt ở trạng tháiCONNECTED_ONLINE
và sẽ được kiểm tra tính khả dụng để phân bổ thử nghiệm:checking_availability
.
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ổ thử nghiệm; nó sẽ có thể chạy thử nghiệm. Nếu không, thiết bị sẽ bị đánh dấu làunavailable
để phân bổ và không thể nhận bất kỳ bài kiểm tra 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ổ để thử nghiệm, hầu hết những điều trên sẽ không xảy ra và Tradefed sẽ xác định trạng thái nội bộ của thiết 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 quá trình kiểm tra khởi động lại thiết bị chẳng hạn.
Thiết bị ảo được 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 cách sử dụng adb connect
. Điều 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 vật lý.
Theo dõi thiết bị khi xảy ra sự kiện deviceConnected
Khi deviceConnected
xảy ra, ddmlib
tạo một IDevice tham chiếu mới để theo dõi thiết bị mới được kết nối.
Tradefed sử dụng tham chiếu đó và gói gọn nó trong cách 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. Nhưng IDevice cơ bản luôn là thiết bị đế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, 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 tra có thể tiến hành trên 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 khi khởi động lại).