Hệ thống con đầu vào Android trên danh nghĩa bao gồm một kênh sự kiện đi qua nhiều lớp của hệ thống.
Đường ống đầu vào
Ở lớp thấp nhất, thiết bị đầu vào vật lý tạo ra các tín hiệu mô tả các thay đổi trạng thái như nhấn phím và chạm vào các điểm tiếp xúc. Phần sụn của thiết bị mã hóa và truyền các tín hiệu này theo một cách nào đó, chẳng hạn như bằng cách gửi báo cáo USB HID đến hệ thống hoặc bằng cách tạo ra các ngắt trên bus I2C.
Các tín hiệu sau đó được giải mã bởi trình điều khiển thiết bị trong nhân Linux. Nhân Linux cung cấp trình điều khiển cho nhiều thiết bị ngoại vi tiêu chuẩn, đặc biệt là những thiết bị tuân thủ giao thức HID. Tuy nhiên, OEM thường phải cung cấp trình điều khiển tùy chỉnh cho các thiết bị nhúng được tích hợp chặt chẽ vào hệ thống ở mức độ thấp, chẳng hạn như màn hình cảm ứng.
Trình điều khiển thiết bị đầu vào chịu trách nhiệm dịch các tín hiệu dành riêng cho thiết bị sang định dạng sự kiện đầu vào tiêu chuẩn bằng giao thức đầu vào Linux. Giao thức đầu vào Linux xác định một tập hợp tiêu chuẩn các loại sự kiện và mã trong tệp tiêu đề hạt nhân linux/input.h
. Bằng cách này, các thành phần bên ngoài kernel không cần quan tâm đến các chi tiết như mã quét vật lý, cách sử dụng HID, thông báo I2C, chân GPIO, v.v.
Tiếp theo, thành phần Android EventHub
đọc các sự kiện đầu vào từ kernel bằng cách mở trình điều khiển evdev
được liên kết với từng thiết bị đầu vào. Sau đó, thành phần Android InputReader sẽ giải mã các sự kiện đầu vào theo lớp thiết bị và tạo ra một luồng sự kiện đầu vào của Android. Là một phần của quy trình này, mã sự kiện giao thức đầu vào Linux được dịch sang mã sự kiện Android theo cấu hình thiết bị đầu vào, tệp bố cục bàn phím và các bảng ánh xạ khác nhau.
Cuối cùng, InputReader
gửi các sự kiện đầu vào đến inputDispatcher để chuyển tiếp chúng đến cửa sổ thích hợp.
Điểm kiểm soát
Có một số giai đoạn trong quy trình đầu vào có tác dụng kiểm soát hoạt động của thiết bị đầu vào.
Cấu hình trình điều khiển và phần sụn
Trình điều khiển thiết bị đầu vào thường xuyên định cấu hình hoạt động của thiết bị đầu vào bằng cách đặt tham số trong các thanh ghi hoặc thậm chí tải chính chương trình cơ sở lên. Điều này đặc biệt xảy ra với các thiết bị nhúng như màn hình cảm ứng trong đó phần lớn quá trình hiệu chỉnh liên quan đến việc điều chỉnh các tham số này hoặc sửa phần sụn để mang lại độ chính xác và khả năng phản hồi mong muốn cũng như để khử nhiễu.
Các tùy chọn cấu hình trình điều khiển thường được chỉ định làm tham số mô-đun trong gói hỗ trợ bảng hạt nhân (BSP) để cùng một trình điều khiển có thể hỗ trợ nhiều triển khai phần cứng khác nhau.
Tài liệu này cố gắng mô tả cấu hình trình điều khiển hoặc phần sụn nhưng nó cung cấp hướng dẫn về cách hiệu chỉnh thiết bị nói chung.
Thuộc tính cấu hình bảng
Gói hỗ trợ bảng hạt nhân (BSP) có thể xuất các thuộc tính cấu hình bảng thông qua SysFS được thành phần Android InputReader sử dụng, chẳng hạn như vị trí của các phím ảo trên màn hình cảm ứng.
Tham khảo các phần lớp thiết bị để biết chi tiết về cách các thiết bị khác nhau sử dụng thuộc tính cấu hình bo mạch.
Lớp phủ tài nguyên
Một số hành vi đầu vào được định cấu hình bằng lớp phủ tài nguyên trong config.xml
, chẳng hạn như hoạt động của công tắc nắp.
Dưới đây là một vài ví dụ:
config_lidKeyboardAccessibility
: Chỉ định tác dụng của công tắc nắp đối với việc bàn phím phần cứng có thể truy cập hay ẩn.config_lidNavigationAccessibility
: Chỉ định tác dụng của công tắc nắp đối với việc bàn di chuột có thể truy cập hay ẩn hay không.config_longPressOnPowerBehavior
: Chỉ định điều gì sẽ xảy ra khi người dùng giữ nút nguồn.config_lidOpenRotation
: Chỉ định tác dụng của công tắc nắp đối với hướng màn hình.
Tham khảo tài liệu trong frameworks/base/core/res/res/values/config.xml
để biết chi tiết về từng tùy chọn cấu hình.
Bản đồ chính
Bản đồ khóa được các thành phần Android EventHub
và InputReader
sử dụng để định cấu hình ánh xạ từ mã sự kiện Linux sang mã sự kiện Android cho các phím, nút cần điều khiển và trục cần điều khiển. Ánh xạ có thể phụ thuộc vào thiết bị hoặc ngôn ngữ.
Tham khảo các phần lớp thiết bị để biết chi tiết về cách các thiết bị khác nhau sử dụng sơ đồ khóa.
File cấu hình thiết bị đầu vào
Các tệp cấu hình thiết bị đầu vào được các thành phần Android EventHub
và InputReader
sử dụng để định cấu hình các đặc điểm đặc biệt của thiết bị, chẳng hạn như cách báo cáo thông tin kích thước cảm ứng.
Tham khảo các phần lớp thiết bị để biết chi tiết về cách các thiết bị khác nhau sử dụng bản đồ cấu hình thiết bị đầu vào.
Hiểu cách sử dụng HID và mã sự kiện
Thường có một số mã nhận dạng khác nhau được sử dụng để chỉ một phím nhất định bất kỳ trên bàn phím, nút trên bộ điều khiển trò chơi, trục cần điều khiển hoặc bộ điều khiển khác. Mối quan hệ giữa các mã định danh này không phải lúc nào cũng giống nhau: chúng phụ thuộc vào một tập hợp các bảng ánh xạ, một số trong đó là cố định và một số thay đổi dựa trên đặc điểm của thiết bị, trình điều khiển thiết bị, ngôn ngữ hiện tại, cấu hình hệ thống, sở thích của người dùng và các yếu tố khác.
- Mã quét vật lý
Mã quét vật lý là mã nhận dạng dành riêng cho thiết bị được liên kết với từng phím, nút hoặc điều khiển khác. Vì mã quét vật lý thường khác nhau giữa các thiết bị nên chương trình cơ sở hoặc trình điều khiển thiết bị chịu trách nhiệm ánh xạ chúng tới các mã nhận dạng tiêu chuẩn như Mã sử dụng HID hoặc mã khóa Linux.
Mã quét chủ yếu được quan tâm đối với bàn phím. Các thiết bị khác thường giao tiếp ở mức độ thấp bằng cách sử dụng chân GPIO, tin nhắn I2C hoặc các phương tiện khác. Do đó, các lớp trên của ngăn xếp phần mềm dựa vào trình điều khiển thiết bị để hiểu điều gì đang diễn ra.
- Cách sử dụng HID
Cách sử dụng HID là mã nhận dạng tiêu chuẩn dùng để báo cáo trạng thái của điều khiển, chẳng hạn như phím bàn phím, trục cần điều khiển, nút chuột hoặc điểm tiếp xúc cảm ứng. Hầu hết các thiết bị đầu vào USB và Bluetooth đều tuân theo thông số kỹ thuật HID, cho phép hệ thống giao tiếp với chúng một cách thống nhất.
Khung Android dựa vào trình điều khiển HID của nhân Linux để dịch mã sử dụng HID thành mã khóa Linux và các mã nhận dạng khác. Do đó việc sử dụng HID chủ yếu được các nhà sản xuất thiết bị ngoại vi quan tâm.
- Mã khóa Linux
Mã khóa Linux là mã nhận dạng tiêu chuẩn cho một phím hoặc nút. Mã khóa Linux được xác định trong tệp tiêu đề
linux/input.h
bằng cách sử dụng các hằng số bắt đầu bằng tiền tốKEY_
hoặcBTN_
. Trình điều khiển đầu vào nhân Linux chịu trách nhiệm dịch mã quét vật lý, cách sử dụng HID và các tín hiệu dành riêng cho thiết bị khác thành mã khóa Linux và cung cấp thông tin về chúng như một phần của sự kiệnEV_KEY
.API Android đôi khi gọi mã khóa Linux được liên kết với khóa là "mã quét" của nó. Điều này không chính xác về mặt kỹ thuật nhưng nó giúp phân biệt mã khóa Linux với mã khóa Android trong API.
- Mã trục tương đối hoặc tuyệt đối của Linux
Mã trục tương đối hoặc tuyệt đối của Linux là mã định danh tiêu chuẩn để báo cáo các chuyển động tương đối hoặc vị trí tuyệt đối dọc theo một trục, chẳng hạn như chuyển động tương đối của chuột dọc theo trục X hoặc vị trí tuyệt đối của cần điều khiển dọc theo trục X của nó. Mã trục Linux được xác định trong tệp tiêu đề
linux/input.h
bằng cách sử dụng các hằng số bắt đầu bằng tiền tốREL_
hoặcABS_
. Trình điều khiển đầu vào nhân Linux chịu trách nhiệm dịch việc sử dụng HID và các tín hiệu dành riêng cho thiết bị khác thành mã trục Linux và cung cấp thông tin về chúng như một phần của các sự kiệnEV_REL
vàEV_ABS
.- Mã chuyển đổi Linux
Mã chuyển đổi Linux là mã nhận dạng tiêu chuẩn để báo cáo trạng thái của một công tắc trên thiết bị, chẳng hạn như công tắc nắp. Mã chuyển đổi Linux được xác định trong tệp tiêu đề
linux/input.h
bằng cách sử dụng các hằng số bắt đầu bằng tiền tốSW_
. Trình điều khiển đầu vào nhân Linux báo cáo các thay đổi trạng thái chuyển đổi dưới dạng sự kiệnEV_SW
.Các ứng dụng Android thường không nhận được sự kiện từ bộ chuyển mạch nhưng hệ thống có thể sử dụng chúng trong nội bộ để kiểm soát các chức năng khác nhau dành riêng cho thiết bị.
- Mã khóa Android
Mã khóa Android là mã nhận dạng tiêu chuẩn được xác định trong API Android để chỉ ra một khóa cụ thể, chẳng hạn như 'HOME'. Mã khóa Android được lớp
android.view.KeyEvent
xác định dưới dạng các hằng số bắt đầu bằng tiền tốKEYCODE_
.Bố cục khóa chỉ định cách ánh xạ mã khóa Linux tới mã khóa Android. Các bố cục phím khác nhau có thể được sử dụng tùy thuộc vào kiểu bàn phím, ngôn ngữ, quốc gia, bố cục hoặc các chức năng đặc biệt.
Sự kết hợp của mã khóa Android được chuyển đổi thành mã ký tự bằng cách sử dụng bản đồ ký tự khóa cụ thể của thiết bị và ngôn ngữ. Ví dụ: khi các phím được xác định là
KEYCODE_SHIFT
vàKEYCODE_A
đều được nhấn cùng nhau, hệ thống sẽ tra cứu tổ hợp trong bản đồ ký tự phím và tìm chữ in hoa 'A', sau đó được chèn vào tiện ích văn bản hiện có tiêu điểm.- Mã trục Android
Mã trục Android là mã nhận dạng tiêu chuẩn được xác định trong API Android để biểu thị một trục thiết bị cụ thể. Mã trục Android được lớp
android.view.MotionEvent
xác định dưới dạng các hằng số bắt đầu bằng tiền tốAXIS_
.Bố cục phím chỉ định cách ánh xạ Mã trục Linux tới mã trục Android. Các bố cục phím khác nhau có thể được sử dụng tùy thuộc vào kiểu thiết bị, ngôn ngữ, quốc gia, bố cục hoặc các chức năng đặc biệt.
- Trạng thái Meta của Android
Trạng thái meta Android là mã định danh tiêu chuẩn được xác định trong API Android để cho biết phím bổ trợ nào được nhấn. Các trạng thái meta của Android được lớp
android.view.KeyEvent
xác định dưới dạng các hằng số bắt đầu bằng tiền tốMETA_
.Trạng thái meta hiện tại được xác định bởi thành phần Android InputReader. Thành phần này sẽ giám sát thời điểm các phím bổ trợ như
KEYCODE_SHIFT_LEFT
được nhấn/nhả và đặt/đặt lại cờ trạng thái meta thích hợp.Mối quan hệ giữa các khóa bổ trợ và trạng thái meta được mã hóa cứng nhưng bố cục khóa có thể thay đổi cách ánh xạ các khóa bổ trợ, điều này ảnh hưởng đến các trạng thái meta.
- Trạng thái nút Android
Trạng thái nút Android là mã nhận dạng tiêu chuẩn được xác định trong API Android để cho biết nút nào (trên chuột hoặc bút cảm ứng) được nhấn. Trạng thái nút Android được lớp
android.view.MotionEvent
xác định dưới dạng các hằng số bắt đầu bằng tiền tốBUTTON_
.Trạng thái nút hiện tại được xác định bởi thành phần Android InputReader, thành phần này sẽ giám sát thời điểm các nút (trên chuột hoặc bút cảm ứng) được nhấn/nhả và đặt/đặt lại cờ trạng thái nút thích hợp.
Mối quan hệ giữa các nút và trạng thái nút được mã hóa cứng.