센서 다중 HAL

센서 다중 HAL은 센서 HAL이 다른 센서 HAL과 함께 실행될 수 있도록 하는 프레임워크입니다. 센서 다중 HAL은 공급업체 파티션에 동적 라이브러리로 저장된 센서 하위 HAL을 동적으로 로드하고 이벤트 게시 및 깨우기 잠금 획득 및 해제를 처리할 수 있는 콜백 개체를 제공합니다. 센서 하위 HAL은 공급업체 파티션의 공유 개체에 빌드되고 다중 HAL 프레임워크에서 사용되는 센서 HAL입니다. 이러한 하위 HAL은 서로 의존하지 않거나 프로세스의 주요 기능을 포함하는 다중 HAL 코드에 의존하지 않습니다.

Android 11 이상을 실행하는 기기에서 사용할 수 있는 Sensors Multi-HAL 2.1은 힌지 각도 센서 유형을 노출할 수 있는 하위 HAL 로드를 지원하는 Sensors Multi-HAL 2.0의 반복입니다. 이 센서 유형을 지원하려면 하위 HAL은 2.1 SubHal 헤더 에 정의된 하위 HAL API를 사용해야 합니다.

센서 Multi-HAL 2와 센서 HAL 2의 차이점

Android 10 이상을 실행하는 기기에서 사용할 수 있는 Sensors Multi-HAL 2는 HAL API와 더 쉽게 상호 작용할 수 있도록 Sensors HAL 2 위에 여러 추상화를 도입합니다. Sensors Multi-HAL 2는 HalProxy 가 하위 HAL과 상호 작용할 수 있도록 Sensors HAL 2 인터페이스 및 V2_1/SubHal (또는 V2_0/SubHal ) 인터페이스 구현을 처리하는 HalProxy 클래스를 도입합니다.

ISensorsSubHal 인터페이스는 다음과 같은 점에서 2.1/ISensors.hal (또는 2.0/ISensors.hal ) 인터페이스와 다릅니다.

  • initialize 메소드는 두 개의 FMQ 및 ISensorsCallback 대신 IHalProxyCallback 클래스를 전달합니다.
  • 하위 HAL은 버그 보고서에 디버깅 정보를 제공하기 위해 디버그 기능을 구현해야 합니다.
  • 하위 HAL은 로드된 하위 HAL을 다른 하위 HAL과 구별할 수 있도록 이름 기능을 구현해야 합니다.

Sensors Multi-HAL 2와 Sensors HAL 2의 주요 차이점은 초기화 기능에 있습니다. IHalProxyCallback 인터페이스는 FMQ를 제공하는 대신 센서 프레임워크에 센서 이벤트를 게시하는 방법과 깨우기 잠금을 생성하는 방법의 두 가지 방법을 제공합니다. 내부적으로 Sensors Multi-HAL은 FMQ와의 모든 상호 작용을 관리하여 모든 하위 HAL에 대한 센서 이벤트를 적시에 전달할 수 있도록 합니다. 하위 HAL은 createScopedWakelock 메서드를 사용하여 깨우기 잠금 시간 초과 부담을 센서 다중 HAL에 위임하고 깨우기 잠금 사용을 전체 센서 다중 HAL에 대한 하나의 공통 깨우기 잠금으로 중앙 집중화하여 잠금 및 잠금 해제를 최소화하는 것이 좋습니다. 전화.

Sensors Multi-HAL 2에는 몇 가지 안전 기능이 내장되어 있습니다. 센서 FMQ가 가득 차거나 Android 센서 프레임워크가 다시 시작되고 센서 상태를 재설정해야 하는 상황을 처리합니다. 또한 이벤트가 HalProxy 클래스에 게시되었지만 센서 프레임워크가 이벤트를 즉시 수락할 수 없는 경우 Sensors Multi-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 객체가 postEventscreateScopedWakelock 에 사용될 수 있도록 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/ : 이 예제 sub-HAL 구현은 가짜 센서를 사용하여 가짜 데이터를 생성합니다. 기기에서 여러 하위 HAL이 상호 작용하는 방식을 테스트하는 데 유용합니다.

구현

이 섹션에서는 다음 상황에서 Sensor Multi-HAL을 구현하는 방법을 설명합니다.

센서 Multi-HAL 2.1 구현

새 기기에서 Sensors Multi-HAL 2.1을 구현하려면 다음 단계를 따르세요.

  1. SubHal.h 에 설명된 대로 ISensorsSubHal 인터페이스를 구현합니다.
  2. SubHal.h 에서 sensorsHalGetSubHal_2_1 메서드를 구현합니다.
  3. 새로 구현된 하위 HAL을 빌드하려면 cc_library_shared 대상을 추가하세요. 대상을 추가할 때:

    1. 대상이 장치의 공급업체 파티션 어딘가에 푸시되었는지 확인합니다.
    2. /vendor/etc/sensors/hals.conf 에 있는 구성 파일에서 새 줄에 라이브러리 경로를 추가합니다. 필요한 경우 hals.conf 파일을 만듭니다.

    하위 HAL 라이브러리를 빌드하기 위한 Android.bp 항목의 예는 hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp 를 참조하세요.

  4. 기기에서 지원되는 HAL 목록이 포함된 manifest.xml 파일에서 모든 android.hardware.sensors 항목을 제거합니다.

  5. device.mk 파일에서 모든 android.hardware.sensors 서비스 및 service.rc 파일을 제거하고 android.hardware.sensors@2.1-service.multihalandroid.hardware.sensors@2.1-service.multihal.rcPRODUCT_PACKAGES 에 추가합니다.

부팅 시 HalProxy 가 시작되고 새로 구현된 하위 HAL을 찾은 다음 sensorsHalGetSubHal_2_1 을 호출하여 초기화합니다.

센서 Multi-HAL 2.0에서 Multi-HAL 2.1로 이식

Multi-HAL 2.0에서 Multi-HAL 2.1로 이식하려면 SubHal 인터페이스를 구현하고 하위 HAL을 다시 컴파일하세요.

2.0과 2.1 SubHal 인터페이스의 차이점은 다음과 같습니다.

  • IHalProxyCallbackISensors.hal 사양의 버전 2.1에서 생성된 유형을 사용합니다.
  • initialize() 함수는 2.0 SubHal 인터페이스의 IHalProxyCallback 대신 새 IHalProxyCallback 을 전달합니다.
  • 하위 HAL은 ISensors.hal 사양 버전 2.1에 추가된 새 유형을 사용하므로 getSensorsListinjectSensorData_2_1 대신 getSensorsList_2_1injectSensorData 을 구현해야 합니다.
  • 하위 HAL은 다중 HAL이 버전 2.1 하위 HAL로 처리할 수 있도록 sensorsHalGetSubHal_2_1 이 아닌 sensorsHalGetSubHal 을 노출해야 합니다.

센서 HAL 2.0에서 이식

Sensors HAL 2.0에서 Sensors Multi-HAL 2.0으로 업그레이드할 때 HAL 구현이 다음 요구 사항을 충족하는지 확인하십시오.

HAL 초기화

센서 HAL 2.0에는 센서 서비스가 FMQ 및 동적 센서 콜백을 전달할 수 있도록 하는 초기화 기능이 있습니다. Sensors Multi-HAL 2.0에서 initialize() 함수는 센서 이벤트를 게시하고, 깨우기 잠금을 획득하고, 동적 센서 연결 및 연결 해제를 알리는 데 사용해야 하는 단일 콜백을 전달합니다.

다중 HAL 구현에 센서 이벤트 게시

FMQ를 통해 센서 이벤트를 게시하는 대신 하위 HAL은 센서 이벤트를 사용할 수 있을 때 IHalProxyCallback 에 센서 이벤트를 작성해야 합니다.

WAKE_UP 이벤트

센서 HAL 2.0에서 HAL은 구현을 위해 깨우기 잠금을 관리할 수 있습니다. Sensors Multi-HAL 2.0에서 하위 HAL을 사용하면 Multi-HAL 구현에서 깨우기 잠금을 관리할 수 있으며 createScopedWakelock 을 호출하여 깨우기 잠금을 획득하도록 요청할 수 있습니다. 잠긴 범위의 깨우기 잠금을 획득하고 다중 HAL 구현에 깨우기 이벤트를 게시할 때 postEvents 에 전달해야 합니다.

동적 센서

센서 다중 HAL 2.0에서는 동적 센서 연결이 변경될 때마다 IHalProxyCallbackonDynamicSensorsConnectedonDynamicSensorsDisconnected 가 호출되어야 합니다. 이러한 콜백은 initialize() 함수를 통해 제공되는 IHalProxyCallback 포인터의 일부로 사용할 수 있습니다.

센서 HAL 1.0에서 이식

Sensors HAL 1.0 에서 Sensors Multi-HAL 2.0으로 업그레이드할 때 HAL 구현이 다음 요구 사항을 충족하는지 확인하십시오.

HAL 초기화

하위 HAL과 다중 HAL 구현 간의 콜백을 설정하려면 initialize() 함수가 지원되어야 합니다.

사용 가능한 센서 노출

Sensors Multi-HAL 2.0에서 getSensorsList() 함수는 센서 HAL이 다시 시작되는 경우에도 단일 장치 부팅 중에 동일한 값을 반환해야 합니다. 이렇게 하면 시스템 서버가 다시 시작되는 경우 프레임워크에서 센서 연결 재설정을 시도할 수 있습니다. getSensorsList() 에 의해 반환된 값은 장치가 재부팅을 수행한 후 변경될 수 있습니다.

다중 HAL 구현에 센서 이벤트 게시

센서 HAL 2.0에서 poll() 이 호출되기를 기다리는 대신 하위 HAL은 센서 이벤트를 사용할 수 있을 때마다 IHalProxyCallback 에 센서 이벤트를 사전에 작성해야 합니다.

WAKE_UP 이벤트

센서 HAL 1.0에서 HAL은 구현을 위해 깨우기 잠금을 관리할 수 있습니다. Sensors Multi-HAL 2.0에서 하위 HAL을 사용하면 Multi-HAL 구현에서 깨우기 잠금을 관리할 수 있으며 createScopedWakelock 을 호출하여 깨우기 잠금을 획득하도록 요청할 수 있습니다. 잠긴 범위의 깨우기 잠금을 획득하고 다중 HAL 구현에 깨우기 이벤트를 게시할 때 postEvents 에 전달해야 합니다.

동적 센서

센서 HAL 1.0에서 동적 센서는 poll() 함수를 통해 반환됩니다. 센서 다중 HAL 2.0에서는 동적 센서 연결이 변경될 때마다 IHalProxyCallbackonDynamicSensorsConnectedonDynamicSensorsDisconnected 가 호출되어야 합니다. 이러한 콜백은 initialize() 함수를 통해 제공되는 IHalProxyCallback 포인터의 일부로 사용할 수 있습니다.

센서 Multi-HAL 1.0에서 이식

Sensors Multi-HAL 1.0 에서 기존 구현을 이식하려면 다음 단계를 따르세요.

  1. 센서 HAL 구성이 /vendor/etc/sensors/hals.conf. 여기에는 /system/etc/sensors/hals.conf 에 있는 파일 이동이 포함될 수 있습니다.
  2. HAL 2.0에서 지원되지 않는 하드웨어 hardware/hardware.h .h 및 hardware/sensors.h 에 대한 참조를 제거하세요.
  3. 센서 Hal 1.0에서 이식 에 설명된 대로 하위 HAL을 이식합니다.
  4. Sensors Multi-HAL 2.0 구현 섹션의 3단계와 4단계에 따라 Sensors Multi-HAL 2.0을 지정된 HAL로 설정합니다.

확인

VTS 실행

하나 이상의 하위 HAL을 Sensors Multi-Hal 2.1과 통합한 경우 VTS(Vendor Test Suite) 를 사용하여 하위 HAL 구현이 Sensors 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

단위 테스트 실행

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 코드의 다양한 측면을 강조할 수 있습니다.

두 개의 가짜 하위 HAL은 hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ 에서 사용할 수 있습니다.

가짜 하위 HAL을 빌드하고 기기에 푸시하려면 다음 단계를 수행하세요.

  1. 다음 명령을 실행하여 세 가지 다른 가짜 하위 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
    
  2. /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
    
  3. 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 인터페이스의 일부로 디버그 메서드를 구현해야 합니다.