Trong Android 9 (và thấp hơn), SurfaceFlinger và DisplayManagerService
giả định rằng có tối đa hai màn hình thực có mã nhận dạng được mã hoá cứng là 0 và 1. Như mô tả trong phần Mã nhận dạng màn hình tĩnh, SurfaceFlinger hiện tận dụng API Trình kết hợp phần cứng (HWC) để tạo mã nhận dạng màn hình ổn định, cho phép ứng dụng này quản lý số lượng màn hình thực tế tuỳ ý.
Khung này có thể tra cứu mã thông báo IBinder
cho màn hình thực qua SurfaceControl#getPhysicalDisplayToken
sau khi lấy mã màn hình 64 bit từ SurfaceControl#getPhysicalDisplayIds
hoặc từ sự kiện hotplug DisplayEventReceiver
.
Trong Android 10, màn hình trong chính là TYPE_BUILT_IN
và tất cả màn hình phụ đều được gắn cờ là TYPE_HDMI
bất kể loại kết nối. Do đó, các màn hình nội bộ bổ sung hiện được coi là màn hình ngoài. Để khắc phục, mã dành riêng cho thiết bị có thể đưa ra giả định về DisplayAddress.Physical#getPort
nếu biết HWC và có thể dự đoán được logic phân bổ cổng.
Triển khai
Trước đây, màn hình được xác định bằng mã nhận dạng 32 bit, trong đó 0 là màn hình nội bộ, 1 là màn hình bên ngoài, [2, INT32_MAX] là màn hình ảo HWC và -1 biểu thị màn hình không hợp lệ hoặc màn hình ảo không phải HWC. Để SurfaceFlinger và DisplayManagerService
theo dõi nhiều màn hình và nhận dạng màn hình đã thấy trước đó, màn hình phải được cấp mã nhận dạng ổn định và liên tục.
Nếu HWC hỗ trợ IComposerClient.getDisplayIdentificationData
và cung cấp dữ liệu nhận dạng màn hình, thì SurfaceFlinger sẽ phân tích cú pháp cấu trúc EDID và phân bổ mã màn hình 64 bit ổn định cho màn hình thực và màn hình ảo HWC. Các mã nhận dạng được biểu thị bằng một loại tuỳ chọn, trong đó giá trị rỗng đại diện cho màn hình không hợp lệ hoặc màn hình ảo không phải HWC. Nếu không có tính năng hỗ trợ HWC, SurfaceFlinger sẽ quay lại hành vi cũ với tối đa 2 màn hình thực.