
Hệ thống con đầu vào của Android trên danh nghĩa bao gồm một đường dẫn 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ư các lần nhấn phím và các điểm tiếp xúc cảm ứng. 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 theo 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, thông qua giao thức đầu vào Linux. Giao thức đầu vào của 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
. Theo cách này, các thành phần bên ngoài hạt nhân 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ừ nhân 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. Thành phần Android InputReader sau đó 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 các 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 của 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 đường ống đầu vào có tác dụng kiểm soát hành vi của thiết bị đầu vào.
Trình điều khiển và cấu hình phần sụn
Trình điều khiển thiết bị đầu vào thường định cấu hình hành vi 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 phần sụn lên. Đây là trường hợp đặc biệt đối với các thiết bị nhúng như màn hình cảm ứng, trong đó phần lớn quy trình hiệu chuẩn liên quan đến việc điều chỉnh các tham số này hoặc sửa chữ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ư triệt tiêu tiếng ồn.
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ợ bo mạch 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 chương trình cơ sở, nhưng nó cung cấp hướng dẫn về hiệu chỉnh thiết bị nói chung.
Thuộc tính cấu hình bảng
Gói hỗ trợ bo mạch nhân (BSP) có thể xuất các thuộc tính cấu hình bo mạch qua SysFS được thành phần InputReader của Android 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 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 bảng.
Lớp phủ tài nguyên
Một số hành vi đầu vào được định cấu hình theo cách của 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.
Đây là vài ví dụ:
config_lidKeyboardAccessibility
: Chỉ định tác động của công tắc nắp đối với việc có thể truy cập hay ẩn bàn phím phần cứng hay không.config_lidNavigationAccessibility
: Chỉ định tác độ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.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 ảnh hưở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 đồ phím được sử dụng bởi các thành phần Android EventHub
và InputReader
để đị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 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 đồ chính.
Nhập tập tin cấu hình thiết bị
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 thông tin về kích thước cảm ứng được báo cáo.
Tham khảo 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 danh khác nhau được sử dụng để chỉ bất kỳ phím cụ thể nào 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 điều khiển khác. Mối quan hệ giữa các số nhận dạng 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ố bảng 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 danh 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ì các mã quét vật lý thường thay đổi từ thiết bị này sang thiết bị khác 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 danh tiêu chuẩn, chẳng hạn như Sử dụng HID hoặc mã khóa Linux.
Mã quét chủ yếu được quan tâm cho 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, thông báo 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.
- Sử dụng HID
Cách sử dụng HID là mã định danh tiêu chuẩn được sử 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 đặc điểm kỹ thuật HID, cho phép hệ thống giao tiếp với chúng theo cách thống nhất.
Android Framework 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 danh 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 danh 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á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 đề cập đến mã khóa Linux được liên kết với một 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 của nó 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á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 các 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ã 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ã công tắc Linux là mã định danh tiêu chuẩn để báo cáo trạng thái của 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á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ác sự kiện từ các công tắc, nhưng hệ thống có thể sử dụng chúng bên trong để kiểm soát các chức năng cụ thể của thiết bị khác nhau.
- Mã khóa Android
Mã khóa Android là mã định danh 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 của Android được xác định bởi lớp
android.view.KeyEvent
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 mã khóa Linux được ánh xạ 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ả hai phím được xác định là
KEYCODE_SHIFT
vàKEYCODE_A
đượ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 thấy chữ in hoa 'A', sau đó được chèn vào tiện ích con văn bản hiện được đặt tiêu điểm.- Mã trục Android
Mã trục Android là mã định danh tiêu chuẩn được xác định trong API Android để chỉ ra một trục thiết bị cụ thể. Mã trục Android được xác định bởi lớp
android.view.MotionEvent
dưới dạng các hằng số bắt đầu bằng tiền tốAXIS_
.Bố cục khóa chỉ định cách Mã trục Linux được ánh xạ 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 của Android là một mã định danh tiêu chuẩn được xác định trong API Android để cho biết các phím bổ trợ nào được nhấn. Trạng thái siêu dữ liệu của Android được xác định bởi lớp
android.view.KeyEvent
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 InputReader của Android. Thành phần này giám sát khi nhấn/nhả các phím bổ trợ như
KEYCODE_SHIFT_LEFT
và đặt/đặt lại cờ trạng thái meta thích hợp.Mối quan hệ giữa các phím 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 bản thân các phím bổ trợ được ánh xạ, từ đó ảnh hưởng đến trạng thái meta.
- Trạng thái nút Android
Trạng thái nút Android là mã định danh 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 stylus) được nhấn. Các trạng thái của nút Android được xác định bởi lớp
android.view.MotionEvent
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 InputReader của Android. Thành phần này giám sát thời điểm các nút (trên chuột hoặc bút stylus) đượ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.