Lớp HAL (HAL) cho cảm biến là một khung cho phép HAL cảm biến hoạt động cùng với các lớp HAL cảm biến khác. Cảm biến Multi-HAL cảm biến tải động các lớp HAL (HAL) cho cảm biến được lưu trữ dưới dạng thư viện động trên phân vùng nhà cung cấp và cung cấp cho họ lệnh gọi lại có thể xử lý các sự kiện đăng, thu nạp và mở khoá chế độ thức. Lớp trừu tượng phần cứng (HAL) của cảm biến là một lớp HAL (HAL) cho cảm biến, được tích hợp thành một đối tượng dùng chung trên phân vùng nhà cung cấp và được sử dụng bởi khung đa HAL. Các HAL phụ này không phụ thuộc vào nhau hoặc phụ thuộc vào mã nhiều-HAL có chứa hàm chính cho quy trình này.
Cảm biến Multi-HAL 2.1, có trên các thiết bị chạy Android 11 trở lên là lặp lại của Cảm biến Multi-HAL 2.0 hỗ trợ tải các HAL phụ có thể hiển thị góc bản lề loại cảm biến. Để hỗ trợ loại cảm biến này, các lớp trừu tượng phụ (HAL) phải sử dụng API HAL phụ được xác định trong 2.1 Tiêu đề SubHal.
Đối với các thiết bị chạy Android 13 trở lên sử dụng HAL HAL Cảm biến, bạn có thể sử dụng lớp chèn HAL để cho phép khả năng sử dụng nhiều lớp HAL. Để biết thông tin chi tiết về việc triển khai, xem Sử dụng Lớp trừu tượng phần cứng (HAL) của cảm biến với lớp trừu tượng phần cứng (HAL) của cảm biến.
Sự khác biệt giữa cảm biến Multi-HAL 2 và Cảm biến HAL 2
Cảm biến Multi-HAL 2, có trên các thiết bị chạy Android
10 trở lên,
đưa ra một số đối tượng trừu tượng ở đầu HAL cảm biến
2 để giúp bạn
để tương tác với API HAL. Cảm biến Multi-HAL 2 giới thiệu
Proxy
để xử lý việc triển khai giao diện HAL 2 của Cảm biến và
V2_1/SubHal
(hoặc
V2_0/SubHal
)
để cho phép HalProxy
tương tác với các HAL phụ.
Giao diện ISensorsSubHal
khác với
2.1/ISensors.hal
(hoặc
2.0/ISensors.hal
)
giao diện theo các cách sau:
- Phương thức khởi tạo truyền một
IHalProxyCallback
thay vì hai FMQ vàISensorsCallback
. - Các lớp trừu tượng phụ (HAL phụ) phải triển khai chức năng gỡ lỗi để cung cấp tính năng gỡ lỗi trong báo cáo lỗi.
- HAL phụ phải triển khai hàm tên để HAL phụ đã tải khác biệt với các HAL phụ khác.
Sự khác biệt chính giữa Cảm biến Multi-HAL 2 và Cảm biến HAL 2 nằm ở
khởi tạo hàm. Thay vì cung cấp FMQ, IHalProxyCallback
giao diện cung cấp hai phương thức, một phương thức để đăng sự kiện cảm biến đến các cảm biến
khung và một phương thức để tạo khoá chế độ thức. Ẩn sâu, Cảm biến
Multi-HAL quản lý tất cả các hoạt động tương tác với FMQ để đảm bảo kịp thời phân phối
sự kiện cảm biến cho tất cả các HAL phụ. Chúng tôi đặc biệt khuyên các HAL phụ sử dụng
Phương thức createScopedWakelock
để uỷ quyền gánh nặng của thời gian chờ khoá chế độ thức cho
cảm biến Multi-HAL và để tập trung việc sử dụng khóa chế độ thức thành một khóa chế độ thức chung
cho toàn bộ Cảm biến Multi-HAL, giúp giảm thiểu việc khoá và mở khoá cuộc gọi.
Các cảm biến Multi-HAL 2 cũng được tích hợp sẵn một số tính năng an toàn. Chiến dịch này xử lý
trong trường hợp FMQ của cảm biến đã đầy hoặc khung cảm biến Android
sẽ khởi động lại và cần đặt lại trạng thái cảm biến. Ngoài ra, khi sự kiện
đã đăng lên lớp HalProxy
nhưng khung cảm biến không thể chấp nhận
các sự kiện ngay lập tức, Multi-HAL cảm biến có thể chuyển sự kiện sang chế độ nền
để cho phép công việc tiếp tục trên tất cả các HAL phụ trong khi chờ
các sự kiện được đăng.
Triển khai mã nguồn và tham chiếu
Tất cả mã Multi-HAL của cảm biến đều có trong
hardware/interfaces/sensors/common/default/2.X/multihal/
.
Dưới đây là gợi ý về một số tài nguyên.
HalProxy.h
: Đối tượngHalProxy
được tạo thực thể bằng nhiều lớp HAL (HAL) cho Cảm biến và xử lý truyền dữ liệu từ các HAL phụ sang khung cảm biến.HalProxy.cpp
: Việc triển khaiHalProxy
chứa tất cả logic cần thiết để giao tiếp đa điểm giữa các HAL phụ và khung cảm biến.SubHal.h
: Giao diệnISensorsSubHal
xác định giao diện mà các lớp trừu tượng phụ (HAL) phải thực hiện theo để tương thích vớiHalProxy
. HAL phụ triển khai phương thức khởi tạo để đối tượngHalProxyCallback
có thể được sử dụng chopostEvents
vàcreateScopedWakelock
.Để triển khai Multi-HAL 2.0, hãy sử dụng phiên bản 2.0 của
SubHal.h
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: Các bài kiểm thử đơn vị này xác minh việc triển khaiHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: Ví dụ về cách triển khai lớp trừu tượng phần cứng (HAL) này sử dụng các cảm biến giả để tạo . Được dùng để kiểm thử cách nhiều lớp HAL phụ tương tác trên một thiết bị.
Triển khai
Phần này mô tả cách triển khai Lớp trừu tượng phần cứng (HAL) cho cảm biến trong phần sau trường hợp:
- Sử dụng Lớp trừu tượng phần cứng (HAL) của cảm biến với lớp trừu tượng phần cứng (HAL) cho cảm biến
- Triển khai cảm biến Multi-HAL 2.1
- Chuyển đổi từ cảm biến Multi-HAL 2.0 sang Multi-HAL 2.1
- Cổng kết nối từ cảm biến HAL 2.0
- Cổng kết nối từ cảm biến HAL 1.0
- Cổng kết nối qua cảm biến Multi-HAL 1.0
Sử dụng lớp HAL (HAL) cho cảm biến với cảm biến AIDL HAL
Để cho phép tính năng nhiều lớp trừu tượng (HAL) với lớp trừu tượng phần cứng (HAL) cho cảm biến, hãy nhập AIDL Mô-đun lớp đệm nhiều HAL, được tìm thấy trong phần cứng/giao diện/cảm biến/aidl/default/multihal/. Mô-đun này xử lý việc chuyển đổi giữa định nghĩa HAL của cảm biến AIDL và HIDL và xác định một trình bao bọc xung quanh giao diện nhiều lớp trừu tượng (HAL) được mô tả trong Triển khai cảm biến đa lớp HAL 2.1. AIDL đa-HAL lớp shim tương thích với các thiết bị triển khai Cảm biến Multi-HAL 2.1.
Lớp đệm lót AIDL đa HAL cho phép bạn hiển thị thiết bị theo dõi chuyển động đầu và
các loại cảm biến IMU trục giới hạn trong lớp trừu tượng phần cứng (HAL) của cảm biến. Để sử dụng các cảm biến này
các loại được xác định bằng giao diện AIDL HAL, hãy đặt trường type
trong
Cấu trúc SensorInfo
trong quá trình triển khai getSensorsList_2_1()
. Đây là một trường hợp an toàn
vì các trường loại cảm biến dựa trên số nguyên của HAL cảm biến AIDL và HIDL
không chồng chéo nhau.
Triển khai cảm biến Multi-HAL 2.1
Để triển khai Cảm biến Multi-HAL 2.1 trên thiết bị mới, hãy làm theo các bước sau:
- Triển khai giao diện
ISensorsSubHal
như mô tả trongSubHal.h
. - Triển khai
sensorsHalGetSubHal_2_1
trongSubHal.h
. Thêm mục tiêu
cc_library_shared
để tạo HAL phụ mới được triển khai. Khi thêm mục tiêu:- Đảm bảo mục tiêu được đẩy đến vị trí nào đó trên nhà cung cấp phân vùng của thiết bị.
- Trong tệp cấu hình nằm tại
/vendor/etc/sensors/hals.conf
, thêm đường dẫn đến thư viện trên một dòng mới. Nếu cần, hãy tạo Tệphals.conf
.
Để xem ví dụ về mục nhập
Android.bp
để xây dựng thư viện HAL phụ, hãy xemhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
.Xoá tất cả
android.hardware.sensors
mục nhập khỏimanifest.xml
chứa danh sách các HAL được hỗ trợ trên thiết bị.Xoá tất cả dịch vụ
android.hardware.sensors
vàservice.rc
tệp khỏi tệpdevice.mk
và thêmandroid.hardware.sensors@2.1-service.multihal
vàandroid.hardware.sensors@2.1-service.multihal.rc
thànhPRODUCT_PACKAGES
.
Khi khởi động, HalProxy
sẽ bắt đầu, tìm lớp HAL phụ mới được triển khai và
sẽ khởi chạy bằng cách gọi
sensorsHalGetSubHal_2_1
.
Cổng từ Cảm biến Multi-HAL 2.0 sang Multi-HAL 2.1
Để chuyển từ Multi-HAL 2.0 sang Multi-HAL 2.1, hãy thực hiện
SubHal
giao diện và biên dịch lại HAL phụ của bạn.
Dưới đây là sự khác biệt giữa giao diện SubHal
2.0 và 2.1:
IHalProxyCallback
sử dụng các kiểu được tạo trong phiên bản 2.1 của thông số kỹ thuậtISensors.hal
.- Hàm
initialize()
truyền một giá trị mớiIHalProxyCallback
thay vì từ giao diệnSubHal
2.0 - Các lớp trừu tượng phần cứng phụ phải triển khai
getSensorsList_2_1
vàinjectSensorData_2_1
thay vìgetSensorsList
vàinjectSensorData
vì các phương thức này sử dụng các loại mới được thêm vào phiên bản 2.1 của thông số kỹ thuậtISensors.hal
. - Các lớp trừu tượng phần cứng phụ phải hiển thị
sensorsHalGetSubHal_2_1
thay vìsensorsHalGetSubHal
cho Multi-HAL để coi chúng là phiên bản 2.1 HAL phụ.
Cổng từ Cảm biến HAL 2.0
Khi nâng cấp lên Cảm biến Multi-HAL 2.0 từ Cảm biến HAL 2.0, đảm bảo HAL đáp ứng các yêu cầu sau.
Khởi chạy HAL
Cảm biến HAL 2.0 có chức năng khởi động cho phép dịch vụ cảm biến
truyền FMQ và lệnh gọi lại cảm biến động. Trong Cảm biến Multi-HAL 2.0,
Hàm initialize()
truyền một lệnh gọi lại duy nhất phải được dùng để đăng
các sự kiện cảm biến, nhận khoá chế độ thức cũng như thông báo về kết nối cảm biến động và
ngắt kết nối.
Đăng các sự kiện cảm biến lên quy trình triển khai Multi-HAL
Thay vì đăng sự kiện cảm biến thông qua FMQ, lớp trừu tượng phụ (HAL) phải ghi cảm biến
sự kiện vào
IHalProxyCallback
khi có sự kiện cảm biến.
Sự kiện WAKE_UP
Trong Cảm biến HAL 2.0, HAL có thể quản lý khóa chế độ thức để thực hiện. Ngang bằng
Cảm biến Multi-HAL 2.0, các HAL phụ cho phép triển khai Multi-HAL
quản lý khoá chế độ thức và có thể yêu cầu có được khoá chế độ thức bằng cách gọi
createScopedWakelock
.
Bạn phải thu nạp và truyền khoá chế độ thức có phạm vi khoá cho postEvents
khi
đăng các sự kiện đánh thức lên triển khai Multi-HAL.
Cảm biến động
Cảm biến Multi-HAL 2.0 yêu cầu onDynamicSensorsConnected
và
onDynamicSensorsDisconnected
inch
IHalProxyCallback
được gọi bất cứ khi nào kết nối cảm biến động thay đổi. Những lệnh gọi lại này là
có sẵn như một phần của con trỏ IHalProxyCallback
được cung cấp qua
hàm initialize()
.
Cổng từ Cảm biến HAL 1.0
Khi nâng cấp lên Cảm biến Multi-HAL 2.0 từ Cảm biến HAL 1.0, đảm bảo HAL đáp ứng các yêu cầu sau.
Khởi chạy HAL
Hàm initialize()
phải được hỗ trợ để thiết lập lệnh gọi lại giữa
lớp HAL phụ và triển khai Multi-HAL.
Hiển thị các cảm biến có sẵn
Trong Cảm biến Multi-HAL 2.0, hàm getSensorsList()
phải trả về cùng một
trong một lần khởi động thiết bị, ngay cả khi HAL của cảm biến khởi động lại. Điều này cho phép
khung để cố gắng thiết lập lại kết nối cảm biến nếu máy chủ hệ thống
sẽ khởi động lại. Giá trị do getSensorsList()
trả về có thể thay đổi sau khi thiết bị
khởi động lại.
Đăng các sự kiện cảm biến lên quy trình triển khai Multi-HAL
Trong Cảm biến HAL 2.0, thay vì đợi poll()
được gọi, lớp HAL phụ
phải chủ động ghi sự kiện cảm biến vào
IHalProxyCallback
bất cứ khi nào có sự kiện cảm biến.
Sự kiện WAKE_UP
Trong Cảm biến HAL 1.0, HAL có thể quản lý khóa chế độ thức để thực hiện. Ngang bằng
Cảm biến Multi-HAL 2.0, các HAL phụ cho phép triển khai Multi-HAL
quản lý khoá chế độ thức và có thể yêu cầu có được khoá chế độ thức bằng cách gọi
createScopedWakelock
.
Bạn phải thu nạp và truyền khoá chế độ thức có phạm vi khoá cho postEvents
khi
đăng các sự kiện đánh thức lên triển khai Multi-HAL.
Cảm biến động
Trong Cảm biến HAL 1.0, các cảm biến động được trả về thông qua hàm poll()
.
Cảm biến Multi-HAL 2.0 yêu cầu onDynamicSensorsConnected
và
onDynamicSensorsDisconnected
inch
IHalProxyCallback
được gọi bất cứ khi nào kết nối cảm biến động thay đổi. Những lệnh gọi lại này là
có sẵn như một phần của con trỏ IHalProxyCallback
được cung cấp qua
hàm initialize()
.
Cổng từ Cảm biến Multi-HAL 1.0
Để chuyển một phương thức triển khai hiện có từ Cảm biến Multi-HAL 1.0, hãy làm theo các bước sau.
- Đảm bảo rằng cấu hình HAL của cảm biến nằm ở
/vendor/etc/sensors/hals.conf
. Quá trình này có thể bao gồm việc di chuyển tệp nằm lúc/system/etc/sensors/hals.conf
. - Xoá mọi tham chiếu đến
hardware/hardware.h
vàhardware/sensors.h
vì những tính năng này không được hỗ trợ cho HAL 2.0. - Chuyển các lớp HAL phụ như mô tả trong bài viết Chuyển từ cảm biến Hal 1.0.
- Thiết lập Cảm biến Multi-HAL 2.0 làm HAL được chỉ định bằng cách làm theo các bước 3 và 4 trong phần Triển khai cảm biến Mutli-HAL 2.0.
Xác nhận kết quả
Chạy VTS
Khi bạn đã tích hợp một hoặc nhiều HAL phụ với Cảm biến Multi-Hal 2.1, sử dụng Bộ thử nghiệm nhà cung cấp (VTS) để đảm bảo lớp trừu tượng phần cứng (HAL) phụ của bạn việc triển khai đáp ứng tất cả các yêu cầu do giao diện HAL của Cảm biến đặt ra.
Để chỉ chạy các bài kiểm tra VTS của cảm biến khi VTS được thiết lập trên máy chủ, thực thi các lệnh sau:
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_0Target && \
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_1Target
Nếu bạn đang chạy lớp đệm lót AIDL Multi-HAL, hãy chạy VtsAidlHalSensorsTargetTest
.
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
Chạy kiểm thử đơn vị
Các bài kiểm thử đơn vị trong HalProxy_test.cpp
kiểm thử HalProxy
bằng cách sử dụng các lớp trừu tượng phần cứng (HAL phụ) giả mạo
sẽ được tạo thực thể trong kiểm thử đơn vị và không được tải động. Khi tạo một
HAL phụ mới, những bài kiểm thử này sẽ đóng vai trò là hướng dẫn về cách thêm kiểm thử đơn vị
xác minh rằng HAL phụ mới được triển khai đúng cách.
Để chạy kiểm thử, hãy thực thi các lệnh sau:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
Kiểm thử bằng lớp trừu tượng phần cứng (HAL) giả
Các lớp trừu tượng phụ (HAL) giả là những cách triển khai giả của giao diện ISensorsSubHal
.
Các HAL phụ hiển thị các danh sách cảm biến khác nhau. Khi cảm biến được kích hoạt,
họ định kỳ đăng các sự kiện cảm biến được tạo tự động lên HalProxy
dựa trên các khoảng thời gian được chỉ định trong một yêu cầu cảm biến nhất định.
Có thể sử dụng HAL phụ giả để kiểm tra cách hoạt động của mã Multi-HAL đầy đủ với các lớp HAL phụ khác được đưa vào hệ thống và để áp lực cho nhiều khía cạnh của Mã Multi-HAL của cảm biến.
Có hai lớp HAL phụ giả tại
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
.
Để tạo và đẩy các lớp trừu tượng phụ (HAL) giả vào một thiết bị, hãy thực hiện các bước sau:
Chạy các lệnh sau để tạo và đẩy 3 loại giả HAL phụ cho thiết bị:
$ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
mma
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
Cập nhật cấu hình HAL của cảm biến tại
/vendor/etc/sensors/hals.conf
bằng đường dẫn cho các HAL phụ giả mạo./vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
Khởi động lại
HalProxy
rồi tải các HAL phụ mới được liệt kê trong cấu hình.adb shell stop
adb shell start
Gỡ lỗi
Nhà phát triển có thể gỡ lỗi cho khung này bằng cách dùng lệnh lshal
. Để yêu cầu
đầu ra gỡ lỗi của HAL Cảm biến, hãy chạy lệnh sau:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
Sau đó, thông tin về trạng thái hiện tại của HalProxy
và các lớp trừu tượng phần cứng (HAL phụ) của nó
đến thiết bị đầu cuối. Dưới đây là ví dụ về kết quả của lệnh cho
Đối tượng HalProxy
và các lớp HAL phụ giả mạo.
Internal values:
Threads are running: true
Wakelock timeout start time: 200 ms ago
Wakelock timeout reset time: 73208 ms ago
Wakelock ref count: 0
# of events on pending write queue: 0
# of non-dynamic sensors across all subhals: 8
# of dynamic sensors across all subhals: 0
SubHals (2):
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Nếu số được chỉ định cho # of events on pending write queue
là
số lượng lớn (1.000 trở lên),
điều này cho thấy có nhiều sự kiện đang chờ xử lý được ghi vào cảm biến
khung. Điều này cho biết dịch vụ cảm biến đã bị tắc nghẽn hoặc đã gặp sự cố và
không xử lý các sự kiện trên cảm biến hoặc một loạt sự kiện cảm biến lớn
được đăng tải gần đây từ một HAL phụ.
Nếu số lượng tham chiếu khóa chế độ thức lớn hơn 0
, điều này có nghĩa là HalProxy
có
đã sử dụng khóa chế độ thức. Giá trị này chỉ được lớn hơn 0
nếu ScopedWakelock
được tổ chức một cách có chủ đích hoặc nếu sự kiện đánh thức được gửi tới HalProxy
và có
không được khung cảm biến xử lý.
Chỉ số mô tả tệp đã chuyển đến phương thức gỡ lỗi của HalProxy
sẽ được chuyển đến mỗi
HAL phụ để các nhà phát triển phải triển khai phương thức gỡ lỗi như một phần của
Giao diện ISensorsSubHal
.