感應器 Multi-HAL 是一種架構 其他感應器 HAL感應器 Multi-HAL 可動態載入感應器 sub-HAL 以動態程式庫的形式儲存在廠商分區中 物件,能夠處理張貼事件,並取得及釋放 Wake Lock。 感應器 HAL 是一種感應器 HAL,內建於 並由 Multi-HAL 架構使用,這些子 HAL 則不需要 依附另一個程式碼,或仰賴包含主要函式的 Multi-HAL 程式碼 整個程序。
感應器 Multi-HAL 2.1,適用於搭載 Android 的裝置 11 以上,則為 感應器多 HAL 2.0 疊代,可載入可載入的子 HAL 公開 轉軸角度 感應器類型。如要支援這種感應器類型,Sub-HAL 必須使用 sub-HAL API 2.1 SubHal 標頭。
適用於搭載 Android 13 以上版本且使用 感應器 AIDL HAL,您可以使用 多 HAL 輔助程式層,以支援多 HAL 功能。如需實作詳細資料, 看 將感應器多 HAL 與感應器 AIDL HAL 搭配使用。
多 HAL 2 感應器與感應器 HAL 2 之間的差異
感應器 Multi-HAL 2,適用於搭載 Android 的裝置
10 或更高,
在 Sensors HAL 上執行幾種抽象化機制
2,簡化購買程序
才能與 HAL API 互動感應器 Multi-HAL 2 引進了
HalProxy
類別,負責處理偵測感應器 HAL 2 介面和
V2_1/SubHal
敬上
(或
V2_0/SubHal
)。
介面,讓 HalProxy
與子 HAL 互動。
ISensorsSubHal
介面與
2.1/ISensors.hal
(或
2.0/ISensors.hal
)
存取 API
- 初始化方法會傳遞
IHalProxyCallback
而不是兩個 FMQ 和ISensorsCallback
- Sub-HAL 必須實作偵錯函式才能提供偵錯 回報相關資訊
- Sub-HAL 必須實作名稱函式,以便載入所載入的 sub-HAL 與其他子 HAL 區隔開來
感應器多 HAL 2 和感應器 HAL 2 的主要差異
初始化函式。與其提供 FMQ 值,IHalProxyCallback
介面提供兩種方法,一種將感應器事件發布至感應器的方法
以及建立 Wake Lock 的方法實際上
多 HAL 負責管理與 FMQ 的所有互動,確保
所有子 HAL 的感應器事件我們強烈建議子 HAL 採用
createScopedWakelock
方法,將 Wake Lock 逾時的負擔委派給
感應器多重 HAL 功能,並彙整 Wake Lock 使用情形,集中分析同一個常見的 Wake Lock
整個感應器的多 HAL 功能,將通話鎖定和解鎖方式降到最低。
此外,若感應器搭載 Multi-HAL 2,還內建部分安全功能,處理
感應器 FMQ 已滿或 Android 感應器架構為何
並且必須重設感應器狀態。此外,當事件處於
發布至 HalProxy
類別,但感應器架構無法接受
感應器多 HAL 可以立即將事件移到背景
讓作業在等待 HAL 的同時繼續作業
即將張貼的活動。
原始碼和參考實作
所有感應器多 HAL 程式碼都可供使用
hardware/interfaces/sensors/common/default/2.X/multihal/
。
以下是部分資源的指標。
HalProxy.h
:HalProxy
物件已由感應器具多重 HAL 執行個體化,並處理 將資料從子 HAL 傳遞至感應器架構HalProxy.cpp
:HalProxy
實作包含 子 HAL 和感應器架構之間的多工通訊SubHal.h
:ISensorsSubHal
介面定義了子 HAL 必須採用的介面 請遵循以下指示,與HalProxy
相容。sub-HAL 會實作 初始化方法,讓HalProxyCallback
物件可用於postEvents
和createScopedWakelock
。實作 Multi-HAL 2.0 時,請使用 2.0 版 (
SubHal.h
。hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: 這些單元測試會驗證HalProxy
實作。hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: 這個 sub-HAL 實作範例使用假感應器產生假的 資料。適用於測試多部子 HAL 在裝置上的互動方式。
實作
本節說明如何實作感應器多 HAL,請參閱以下內容: 情境:
- 將感應器多 HAL 與感應器 AIDL HAL 搭配使用
- 實作感應器 Multi-HAL 2.1
- 從感應器多 HAL 2.0 移植至多 HAL 2.1
- 從感應器 HAL 2.0 移植
- 從感應器 HAL 1.0 移植
- 從感應器移植 Multi-HAL 1.0
將感應器多 HAL 與感應器 AIDL HAL 搭配使用
如要允許使用感應器 AIDL HAL 的多 HAL 功能,請匯入 AIDL 多 HAL 輔助層模組位於 hardware/interfaces/sensors/aidl/default/multihal/。 此模組會處理 AIDL 與 HIDL 感應器的 HAL 定義轉換 並定義有關 Multi-HAL 介面的包裝函式,如 實作感應器 Multi-HAL 2.1。AIDL 多重 HAL Shim 層與實作感應器 Multi-HAL 2.1 的裝置相容。
AIDL 多 HAL 輔助程式層能讓你
感應器 AIDL HAL 中的限定軸 IMU 感應器類型。如何使用這些感應器
是由 AIDL HAL 介面定義的型別,請將 type
欄位設定成
getSensorsList_2_1()
實作中的 SensorInfo
結構。很安全
因為 AIDL 和 HIDL 感應器的整數支援感應器類型欄位
兩者不得重疊
實作感應器 Multi-HAL 2.1
如要在新裝置上實作感應器 Multi-HAL 2.1,請按照下列步驟操作:
- 按照下列說明實作
ISensorsSubHal
介面:SubHal.h
。 - 實作
sensorsHalGetSubHal_2_1
敬上SubHal.h
中的方法。 新增
cc_library_shared
目標,建構新實作的子 HAL。 新增目標時,請注意下列事項:- 確保目標推送至供應商的某處 裝置分區
- 在位於
/vendor/etc/sensors/hals.conf
的設定檔中, 在新行中加入程式庫路徑。視需要建立hals.conf
檔案。
如需建構 sub-HAL 程式庫的
Android.bp
項目範例,請參閱hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
。移除所有的
android.hardware.sensors
項目manifest.xml
檔案,內含裝置上支援的 HAL 清單。從以下位置移除所有「
android.hardware.sensors
」服務和service.rc
個檔案:device.mk
檔案並新增android.hardware.sensors@2.1-service.multihal
和android.hardware.sensors@2.1-service.multihal.rc
到PRODUCT_PACKAGES
。
HalProxy
啟動時,會尋找新實作的 sub-HAL,並且
會初始化
sensorsHalGetSubHal_2_1
。
從感應器多 HAL 2.0 到多 HAL 2.1 連接埠
如要從 Multi-HAL 2.0 到 Multi-HAL 2.1,請執行
SubHal
敬上
介面並重新編譯 sub-HAL。
下列是 2.0 和 2.1 SubHal
介面之間的差異:
IHalProxyCallback
會使用您在 2.1 版的ISensors.hal
規格。initialize()
函式會傳遞新的IHalProxyCallback
而不是 2.0SubHal
介面的- Sub-HAL 必須實作
getSensorsList_2_1
和injectSensorData_2_1
而不是getSensorsList
和injectSensorData
ISensors.hal
規格 2.1 版中新增的類型。 - Sub-HAL 必須公開
sensorsHalGetSubHal_2_1
sensorsHalGetSubHal
,用於將 Multi-HAL 當做 2.1 版 Sub-HAL。
來自感應器 HAL 2.0 的連接埠
從 Sensors HAL 升級至 Multi-HAL 2.0 版本時 2.0,確認 HAL 導入必須符合下列規定。
初始化 HAL
HAL 2.0 感應器具有初始化函式,可讓感應器服務
傳遞 FMQ 和動態感應器回呼。在感應器 Multi-HAL 2.0 中
initialize()
函式會傳遞必須用來發布內容的回呼
偵測感應器事件、取得 Wake Lock,並接收動態感應器連線
斷斷續續。
將感應器事件發布至 Multi-HAL 實作項目
Sub-HAL 必須寫入感應器,而不是透過 FMQ 發布感應器事件
傳送給
IHalProxyCallback
敬上
就會傳回相關資訊
WAKE_UP 事件
在感應器 HAL 2.0 中,HAL 可管理用於實作的 Wake Lock。於
感應器 Multi-HAL 2.0,子 HAL 可讓採用多重 HAL 的實作方式
管理 Wake Lock,並可透過叫用取得 Wake Lock 功能
createScopedWakelock
。
必須取得鎖定的範圍 Wake Lock,並在發生下列情況時傳遞至 postEvents
將喚醒事件發布到 Multi-HAL 實作。
動態感應器
感應器支援 Multi-HAL 2.0 需要 onDynamicSensorsConnected
和
onDynamicSensorsDisconnected
英寸
IHalProxyCallback
敬上
。這些回呼
可做為 IHalProxyCallback
指標的一部分,由
initialize()
函式。
來自感應器 HAL 1.0 的連接埠
從 Sensors HAL 升級至 Multi-HAL 2.0 版本時 1.0,確認 HAL 導入必須符合下列規定。
初始化 HAL
必須支援 initialize()
函式,才能在兩個位置之間建立回呼
「Sub-HAL」和「Multi-HAL」實作項目
公開可用的感應器
在感應器 Multi-HAL 2.0 中,getSensorsList()
函式必須傳回相同的
。這樣一來,
系統伺服器,嘗試重新建立感應器連線的架構
就會重新啟動。裝置之後,getSensorsList()
傳回的值可能會有所變更
就會重新啟動。
將感應器事件發布至 Multi-HAL 實作項目
在 HAL 2.0 感應器中,由於 poll()
是子 HAL,因此不必等待系統呼叫
必須主動將感應器事件寫入
IHalProxyCallback
就會傳回相關資訊
WAKE_UP 事件
在感應器 HAL 1.0 中,HAL 可管理用於實作的 Wake Lock。於
感應器 Multi-HAL 2.0,子 HAL 可讓多重 HAL 實作
管理 Wake Lock,並可透過叫用取得 Wake Lock 功能
createScopedWakelock
。
必須取得鎖定的範圍 Wake Lock,並在發生下列情況時傳遞至 postEvents
將喚醒事件發布到 Multi-HAL 實作。
動態感應器
在感應器 HAL 1.0 中,動態感應器會透過 poll()
函式傳回。
感應器支援 Multi-HAL 2.0 需要 onDynamicSensorsConnected
和
onDynamicSensorsDisconnected
英寸
IHalProxyCallback
敬上
。這些回呼
可做為 IHalProxyCallback
指標的一部分,由
initialize()
函式。
感應器連接埠 Multi-HAL 1.0
如要將現有實作從 Sensors Multi-HAL 1.0, 步驟如下:
- 確認感應器 HAL 設定位於
/vendor/etc/sensors/hals.conf
。這可能涉及移動檔案的位置 通知時間:/system/etc/sensors/hals.conf
。 - 移除所有參照
hardware/hardware.h
敬上 和hardware/sensors.h
因為 HAL 2.0 不支援這些類型 - 按照「從感應器 Hal 攜碼轉移」一文中所述,設定連接埠子 HAL 1.0 版。
- 請按照下列步驟 3 和 「Implementing Sensors Mutli-HAL 2.0」一節第 4 頁。
驗證
執行 VTS
將一或多個子 HAL 與感應器整合 Multi-Hal 2.1 之後, 使用供應商測試套件 (VTS) 來確保你的副 HAL 實作項目符合感應器 HAL 介面設定的所有要求。
如要在主機電腦上設定 VTS 時只執行感應器 VTS 測試, 執行下列指令:
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
如果您執行 AIDL Multi-HAL 輔助程式層,請執行 VtsAidlHalSensorsTargetTest
。
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
執行單元測試
HalProxy_test.cpp
中的單元測試 HalProxy
會使用假造的 subHAL,
會在單元測試中例項化,不會動態載入。建立 Deployment
新的 sub-HAL 時,這些測試應可做為新增單元測試的指引
確認新的 sub-HAL 已正確安裝。
如要執行測試,請執行下列指令:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
使用假的 sub-HAL 進行測試
假 sub-HAL 是 ISensorsSubHal
介面的虛擬實作。
子 HAL 會顯示不同的感應器清單。感應器啟動後
他們會定期將自動產生的感應器事件發布至HalProxy
取值範圍
利用假的 sub-HAL 測試完整的 Multi-HAL 程式碼如何運作 又會載入系統的其他子 HAL 感應器多 HAL 程式碼。
以下網站提供兩條假子 HAL:
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
。
如要建構假的子 HAL 並推送到裝置上,請按照下列步驟操作:
執行下列指令,建構並推送三個不同的假資料 子 HAL:
$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
請更新位於
/vendor/etc/sensors/hals.conf
的感應器 HAL 設定: 虛構子 HAL 的路徑/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
重新啟動
HalProxy
,並載入設定中列出的新的子 HAL。adb shell stop
adb shell start
偵錯
開發人員可以使用 lshal
指令對架構進行偵錯。如要要求
感應器 HAL 的偵錯輸出內容,請執行下列指令:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
那麼,HalProxy
目前狀態及其子 HAL 的相關資訊如下
輸出至終端機以下為
HalProxy
物件和假的子 HAL。
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
如果針對 # of events on pending write queue
指定的數字是
大型數字 (1000 或以上)
這表示有許多事件尚待寫入感應器
這個架構的重點在於這表示感應器服務已死結或當機,
系統未處理感應器事件,或有大量感應器事件
最近張貼的一則副 HAL 內容
如果 Wake Lock 遭拒次數大於 0
,表示 HalProxy
已
取得 Wake Lock。如果 ScopedWakelock
的值,這個值必須大於 0
系統刻意保留,或如果喚醒事件傳送至 HalProxy
,且
但並未經過感應器架構處理
傳遞至 HalProxy
偵錯方法的檔案描述元會傳遞到
子 HAL,因此開發人員必須實作偵錯方法,
ISensorsSubHal
介面。