Sensors Multi-HALは、センサーHALを他のセンサーHALと一緒に実行できるようにするフレームワークです。 Sensors Multi-HALは、ベンダーパーティションにダイナミックライブラリとして格納されているセンサーサブHALを動的にロードし、イベントの投稿とウェイクロックの取得と解放を処理できるコールバックオブジェクトを提供します。センサーサブHALは、ベンダーパーティションの共有オブジェクトに組み込まれ、マルチHALフレームワークによって使用されるセンサーHALです。これらのサブHALは、相互に依存したり、プロセスのメイン関数を含むマルチHALコードに依存したりすることはありません。
Android11以降を実行しているデバイスで利用可能なSensorsMulti-HAL 2.1は、Sensors Multi-HAL 2.0のイテレーションであり、ヒンジ角度センサータイプを公開できるサブHALの読み込みをサポートします。このセンサータイプをサポートするには、サブHALは2.1SubHalヘッダーで定義されたサブHALAPIを使用する必要があります。
センサーMulti-HAL2とセンサーHAL2の違い
Android10以降を実行しているデバイスで利用可能なSensorsMulti-HAL 2は、 Sensors HAL 2にいくつかの抽象化を導入して、HALAPIとの対話を容易にします。 Sensors Multi-HAL 2では、Sensors HAL2インターフェイスとV2_1/SubHal
(またはV2_0/SubHal
)インターフェイスの実装を処理するHalProxyクラスが導入され、 HalProxy
がサブHALと対話できるようになります。
ISensorsSubHal
インターフェイスは、次の点で2.1/ISensors.hal
(または2.0/ISensors.hal
)インターフェイスとは異なります。
- initializeメソッドは、2つのFMQと
ISensorsCallback
の代わりにIHalProxyCallback
クラスを渡します。 - サブHALは、バグレポートでデバッグ情報を提供するためのデバッグ機能を実装する必要があります。
- サブHALは、ロードされたサブHALを他のサブHALと区別できるように、名前関数を実装する必要があります。
Sensors Multi-HAL2とSensorsHAL 2の主な違いは、初期化機能にあります。 IHalProxyCallback
インターフェイスは、FMQを提供する代わりに、2つのメソッドを提供します。1つはセンサーイベントをセンサーフレームワークに送信するメソッドで、もう1つはウェイクロックを作成するメソッドです。内部的には、Sensors Multi-HALはFMQとのすべての相互作用を管理して、すべてのサブHALのセンサーイベントをタイムリーに配信できるようにします。サブHALはcreateScopedWakelock
メソッドを使用して、ウェイクロックのタイムアウトの負担をSensors Multi-HALに委任し、WakeLockの使用をSensorsMulti-HAL全体の1つの共通のウェイクロックに集中させることを強くお勧めします。これにより、ロックとロック解除が最小限に抑えられます。呼び出します。
Sensors Multi-HAL 2には、いくつかの安全機能も組み込まれています。センサーFMQがいっぱいになった場合や、Androidセンサーフレームワークが再起動してセンサーの状態をリセットする必要がある場合に対応します。さらに、イベントがHalProxy
クラスに投稿されたが、センサーフレームワークがイベントをすぐに受け入れることができない場合、Sensors Multi-HALはイベントをバックグラウンドスレッドに移動して、イベントを待機している間、すべてのサブHALで作業を続行できるようにします。投稿されます。
ソースコードとリファレンス実装
すべてのセンサーMulti-HALコードは、 hardware/interfaces/sensors/common/default/2.X/multihal/
で利用できます。ここにいくつかのリソースへのポインタがあります。
-
HalProxy.h
:HalProxy
オブジェクトはSensors multi-HALによってインスタンス化され、サブHALからセンサーフレームワークへのデータの受け渡しを処理します。 -
HalProxy.cpp
:HalProxy
の実装には、サブHALとセンサーフレームワーク間の通信を多重化するために必要なすべてのロジックが含まれています。 SubHal.h
:ISensorsSubHal
インターフェイスは、HalProxy
と互換性を持たせるためにサブHALが従う必要のあるインターフェイスを定義します。サブHALは、HalProxyCallback
オブジェクトをpostEvents
およびcreateScopedWakelock
に使用できるように、initializeメソッドを実装します。Multi-HAL 2.0の実装には、
SubHal.h
のバージョン2.0を使用します。hardware/interfaces/sensors/common/default/2.X/multihal/tests/
:これらの単体テストはHalProxy
の実装を検証します。hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
:このサブHAL実装の例では、偽のセンサーを使用して偽のデータを生成します。複数のサブHALがデバイス上でどのように相互作用するかをテストするのに役立ちます。
実装
このセクションでは、次の状況でSensorsMulti-HALを実装する方法について説明します。
- センサーの実装Multi-HAL2.1
- センサーMulti-HAL2.0からMulti-HAL2.1への移植
- センサーHAL2.0からの移植
- センサーHAL1.0からの移植
- センサーからの移植Multi-HAL1.0
センサーの実装Multi-HAL2.1
新しいデバイスにSensorsMulti-HAL 2.1を実装するには、次の手順に従います。
-
SubHal.h
で説明されているように、ISensorsSubHal
インターフェイスを実装します。 -
SubHal.h
にsensorsHalGetSubHal_2_1
メソッドを実装します。 cc_library_shared
ターゲットを追加して、新しく実装されたサブHALを構築します。ターゲットを追加する場合:- ターゲットがデバイスのベンダーパーティションのどこかにプッシュされていることを確認します。
-
/vendor/etc/sensors/hals.conf
にある構成ファイルで、ライブラリへのパスを新しい行に追加します。必要に応じて、hals.conf
ファイルを作成します。
サブHALライブラリを構築するための
Android.bp
エントリの例については、hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
を参照してください。デバイスでサポートされているHALのリストが含まれている
manifest.xml
ファイルからすべてのandroid.hardware.sensors
エントリを削除します。device.mk
ファイルからすべてのandroid.hardware.sensors
サービスおよびservice.rc
ファイルを削除し、android.hardware.sensors@2.1-service.multihal.rc
android.hardware.sensors@2.1-service.multihal
PRODUCT_PACKAGES
に追加します。
起動時に、 HalProxy
が起動し、新しく実装されたサブHALを探し、 sensorsHalGetSubHal_2_1
を呼び出して初期化します。
センサーMulti-HAL2.0からMulti-HAL2.1への移植
Multi-HAL2.0からMulti-HAL2.1に移植するには、 SubHal
インターフェイスを実装し、サブHALを再コンパイルします。
2.0と2.1のSubHal
インターフェイスの違いは次のとおりです。
-
IHalProxyCallback
は、バージョン2.1のISensors.hal
仕様で作成されたタイプを使用します。 -
initialize()
関数は、2.0SubHal
インターフェイスからのものではなく、新しいIHalProxyCallback
を渡します。 - サブHALは、
getSensorsList
injectSensorData_2_1
getSensorsList_2_1
injectSensorData
する必要があります。これらのメソッドは、ISensors.hal
仕様のバージョン2.1で追加された新しいタイプを使用するためです。 - サブHALは、マルチHALがバージョン2.1サブHALとして扱うために、
sensorsHalGetSubHal_2_1
ではなくsensorsHalGetSubHal
を公開する必要があります。
センサーHAL2.0からの移植
Sensors HAL2.0からSensorsMulti-HAL 2.0にアップグレードする場合は、HALの実装が次の要件を満たしていることを確認してください。
HALの初期化
センサーHAL2.0には、センサーサービスがFMQと動的センサーコールバックを渡すことを可能にする初期化機能があります。 Sensors Multi-HAL 2.0では、 initialize()
関数は、センサーイベントの送信、ウェイクロックの取得、動的センサーの接続と切断の通知に使用する必要がある単一のコールバックを渡します。
Multi-HAL実装へのセンサーイベントの投稿
FMQを介してセンサーイベントを送信する代わりに、サブHALは、センサーイベントが使用可能な場合、センサーイベントをIHalProxyCallback
に書き込む必要があります。
WAKE_UPイベント
Sensors HAL 2.0では、HALはその実装のためにウェイクロックを管理できます。 Sensors Multi-HAL 2.0では、サブHALを使用すると、Multi-HAL実装でウェイクロックを管理でき、 createScopedWakelock
を呼び出すことでウェイクロックの取得を要求できます。ウェイクアップイベントをMulti-HAL実装に投稿するときは、ロックされたスコープのウェイクロックを取得してpostEvents
に渡す必要があります。
動的センサー
Sensors Multi-HAL 2.0では、動的センサー接続が変更されるたびに、 IHalProxyCallback
のonDynamicSensorsConnected
とonDynamicSensorsDisconnected
が呼び出される必要があります。これらのコールバックは、 initialize()
関数を介して提供されるIHalProxyCallback
ポインターの一部として使用できます。
センサーHAL1.0からの移植
Sensors HAL1.0からSensorsMulti-HAL 2.0にアップグレードする場合は、HALの実装が次の要件を満たしていることを確認してください。
HALの初期化
サブHALとマルチHAL実装の間のコールバックを確立するには、 initialize()
関数をサポートする必要があります。
利用可能なセンサーの公開
Sensors Multi-HAL 2.0では、 getSensorsList()
関数は、センサーHALが再起動した場合でも、単一のデバイスの起動中に同じ値を返す必要があります。これにより、システムサーバーが再起動した場合に、フレームワークがセンサー接続の再確立を試みることができます。 getSensorsList()
によって返される値は、デバイスが再起動を実行した後に変更される可能性があります。
Multi-HAL実装へのセンサーイベントの投稿
Sensors HAL 2.0では、 poll()
が呼び出されるのを待つ代わりに、サブHALは、センサーイベントが使用可能になるたびに、センサーイベントをIHalProxyCallback
にプロアクティブに書き込む必要があります。
WAKE_UPイベント
Sensors HAL 1.0では、HALはその実装のためにウェイクロックを管理できます。 Sensors Multi-HAL 2.0では、サブHALを使用すると、Multi-HAL実装でウェイクロックを管理でき、 createScopedWakelock
を呼び出すことでウェイクロックの取得を要求できます。ウェイクアップイベントをMulti-HAL実装に投稿するときは、ロックされたスコープのウェイクロックを取得してpostEvents
に渡す必要があります。
動的センサー
Sensors HAL 1.0では、動的センサーはpoll()
関数を介して返されます。 Sensors Multi-HAL 2.0では、動的センサー接続が変更されるたびに、 IHalProxyCallback
のonDynamicSensorsConnected
とonDynamicSensorsDisconnected
が呼び出される必要があります。これらのコールバックは、 initialize()
関数を介して提供されるIHalProxyCallback
ポインターの一部として使用できます。
センサーからの移植Multi-HAL1.0
Sensors Multi-HAL 1.0から既存の実装を移植するには、次の手順に従います。
- センサーのHAL構成が
/vendor/etc/sensors/hals.conf.
これには、/system/etc/sensors/hals.conf
にあるファイルの移動が含まれる場合があります。 - これらはHAL2.0でサポートされていないため、hardware /hardware.hおよび
hardware/hardware.h
hardware/sensors.h
への参照をすべて削除します。 - センサーHal1.0からの移植で説明されているようにサブHALを移植します。
- Sensors Mutli-HAL 2.0の実装セクションの手順3と4に従って、Sensors Multi-HAL2.0を指定されたHALとして設定します。
検証
VTSの実行
1つ以上のサブHALをSensorsMulti-Hal 2.1と統合した場合は、ベンダーテストスイート(VTS)を使用して、サブHALの実装がSensorsHALインターフェイスによって設定されたすべての要件を満たしていることを確認します。
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
単体テストの実行
HalProxy
の単体テストは、単体テストでインスタンス化され、動的にロードされない偽のサブHALを使用してHalProxy_test.cpp
をテストします。新しいサブHALを作成する場合、これらのテストは、新しいサブHALが正しく実装されていることを確認する単体テストを追加する方法のガイドとして機能する必要があります。
テストを実行するには、次のコマンドを実行します。
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
偽のサブHALを使用したテスト
偽のサブHALは、 ISensorsSubHal
インターフェイスのダミー実装です。サブHALは、センサーのさまざまなリストを公開します。センサーがアクティブ化されると、特定のセンサー要求で指定された間隔に基づいて、自動的に生成されたセンサーイベントをHalProxy
に定期的に送信します。
偽のサブHALを使用して、完全なマルチHALコードがシステムにロードされた他のサブHALとどのように連携するかをテストし、センサーマルチHALコードのさまざまな側面にストレスをかけることができます。
2つの偽のサブHALは、 hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
で入手できます。
偽のサブHALをビルドしてデバイスにプッシュするには、次の手順を実行します。
次のコマンドを実行して、3つの異なる偽のサブ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
コマンドを使用してフレームワークをデバッグできます。 Sensors 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から最近投稿されたことを示します。
ウェイクロック参照カウントが0
より大きい場合、これはHalProxy
がウェイクロックを取得したことを意味します。これは、 ScopedWakelock
が意図的に保持されている場合、またはウェイクアップイベントがHalProxy
に送信され、センサーフレームワークによって処理されていない場合にのみ、 0
より大きくする必要があります。
HalProxy
のデバッグメソッドに渡されるファイル記述子は各サブHALに渡されるため、開発者はISensorsSubHal
インターフェイスの一部としてデバッグメソッドを実装する必要があります。