Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

센서 Multi-HAL

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

다중 센서 HAL 2.1, 안드로이드 11 이상을 실행하는 장치에서 사용할 수는, 다중 센서 HAL 2.0 반복된다는 노출시킬 지지체 로딩 부 HAL이 힌지 각도 센서 타입. 이러한 센서 타입을 지원하기 위해 서브 HAL이이 정의 부 HAL API를 사용해야 2.1 SubHal 헤더 .

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

센서 멀티 HAL 2 위에 안드로이드 10을 실행하는 장치 이상, 소개하고 여러 추상화로 볼 센서 HAL (2)는 쉽게 HAL API와 상호 작용할 수 있도록합니다. 다중 센서 HAL 2 개 도입 HalProxy의 클래스는 HAL 2 센서 인터페이스 및 처리하도록 구현 V2_1/SubHal (또는 V2_0/SubHal 허용) 인터페이스 HalProxy 서브 HAL이 상호 작용하기.

ISensorsSubHal 인터페이스는 상이한 2.1/ISensors.hal (또는 2.0/ISensors.hal ) 다음과 같은 방법으로 인터페이스 :

  • 초기화 방법은 통과 IHalProxyCallback 클래스 대신 두 FMQs 및 ISensorsCallback .
  • 하위 HAL은 버그 보고서에 디버깅 정보를 제공하기 위해 디버그 기능을 구현해야 합니다.
  • 하위 HAL은 로드된 하위 HAL을 다른 하위 HAL과 구별할 수 있도록 이름 기능을 구현해야 합니다.

Sensors Multi-HAL 2와 Sensors HAL 2의 주요 차이점은 초기화 기능에 있습니다. 대신 FMQs를 제공하는 중, IHalProxyCallback 인터페이스는 두 가지 방법, 센서 프레임 워크 후 센서 이벤트 한 방법 및 웨이크 잠금을 만드는 하나의 방법을 제공한다. 내부적으로 Sensors Multi-HAL은 FMQ와의 모든 상호 작용을 관리하여 모든 하위 HAL에 대한 센서 이벤트를 적시에 전달할 수 있도록 합니다. 강력 하위 HAL이가 사용하는 것이 좋습니다 createScopedWakelock 전체 센서 최소화가 잠금 다중 HAL 및 잠금 해제에 대한 하나의 공통 웨이크 잠금 장치에 센서 멀티 HAL에 웨이크 잠금에서 벗어나 중앙 집중화 웨이크 잠금 사용에 타이밍의 부담을 위임하는 방법을 전화.

Sensors 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 . 서브 HAL 구현되도록 상기 초기화 방법 HalProxyCallback 목적을 위해 사용될 수 postEventscreateScopedWakelock .

    멀티 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/ 이 예 서브 HAL 구현 용도 가짜 센서 가짜 데이터를 생성한다. 기기에서 여러 하위 HAL이 상호 작용하는 방식을 테스트하는 데 유용합니다.

구현

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

센서 Multi-HAL 2.1 구현

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

  1. 도구 용 ISensorsSubHal 에 기재된 인터페이스를 SubHal.h .
  2. 도구 용 sensorsHalGetSubHal_2_1 메서드 SubHal.h .
  3. 추가 cc_library_shared 새로 구현 하위 HAL을 구축 할 목표를. 대상을 추가할 때:

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

    예를 들어 Android.bp 서브 HAL 라이브러리를 구축하기위한 엔트리를 참조 hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp .

  4. 모두 제거 android.hardware.sensors 으로부터 항목을 manifest.xml 장치에서 지원 가능한 HAL의 목록이 포함 된 파일.

  5. 모두 제거 android.hardware.sensors 서비스와 service.rc 로부터 파일을 device.mk 파일을 추가 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로 이식

멀티 HAL 2.0에서 멀티 HAL 2.1 포트로의 구현 SubHal 인터페이스 및 하위-HAL을 다시 컴파일.

다음은 2.0과 2.1의 차이입니다 SubHal 인터페이스 :

  • IHalProxyCallback 의 버전 2.1에 생성 유형 사용 ISensors.hal specifcation한다.
  • initialize() 함수는 새 통과 IHalProxyCallback 2.0에서 하나 대신 SubHal 인터페이스
  • 하위 HAL이이 구현해야 getSensorsList_2_1injectSensorData_2_1 대신 getSensorsListinjectSensorData 이러한 방법은 버전 2.1에 추가 된 새로운 유형의 사용으로 ISensors.hal 사양.
  • 하위 HAL이는 노출해야 sensorsHalGetSubHal_2_1 보다는 sensorsHalGetSubHal 버전 2.1 하위 HAL이로 처리하는 멀티 HAL을 위해.

센서 HAL 2.0에서 이식

시에서 센서 멀티 HAL 2.0로 업그레이드 센서 HAL 2.0 의 HAL 구현은 다음과 같은 요구 사항을 충족하는지 확인.

HAL 초기화

센서 HAL 2.0에는 센서 서비스가 FMQ 및 동적 센서 콜백을 전달할 수 있도록 하는 초기화 기능이 있습니다. 다중 센서 HAL 2.0에서 initialize() 함수는 웨이크 잠금을 획득하고, 동적 센서 연결 및 단절의 통지 후 센서 이벤트에 사용되어야하는 하나의 콜백을 통과한다.

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

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

WAKE_UP 이벤트

센서 HAL 2.0에서 HAL은 구현을 위해 깨우기 잠금을 관리할 수 있습니다. 센서 멀티 HAL 2.0에서는 하위 HAL이는 멀티 HAL 구현 웨이크 잠금을 관리 할 수 있도록하고 호출에 인수 될 웨이크 잠금을 요청할 수 있습니다 createScopedWakelock . A는 범위 웨이크 잠금이 인수에 전달해야 잠겨 postEvents 멀티 HAL 구현에 이벤트 일어나을 게시 할 때.

동적 센서

다중 센서 HAL 2.0해야 onDynamicSensorsConnectedonDynamicSensorsDisconnectedIHalProxyCallback 마다 동적 센서 연결 변화 불린다. 이 콜백의 일부로 사용할 IHalProxyCallback 관통 구비 포인터 initialize() 함수.

센서 HAL 1.0에서 이식

시에서 센서 멀티 HAL 2.0로 업그레이드 센서 HAL 1.0 의 HAL 구현은 다음과 같은 요구 사항을 충족하는지 확인.

HAL 초기화

initialize() 함수는 하위 HAL 및 멀티 HAL 구현 사이의 콜백을 설정하기 위해 지원해야합니다.

사용 가능한 센서 노출

센서 멀티 HAL 2.0에서 getSensorsList() 함수는 센서가 다시 시작 HAL도에 걸쳐 하나의 장치 부팅 중에 같은 값을 반환해야합니다. 이렇게 하면 시스템 서버가 다시 시작되는 경우 프레임워크에서 센서 연결 재설정을 시도할 수 있습니다. 돌려주는 값 getSensorsList() 장치 행한다 재부팅 후에 변경할 수있다.

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

센서 HAL 2.0 대신 기다리는 poll() 하위 HAL은에 적극적으로 쓰기 센서 이벤트를합니다 호출 할 IHalProxyCallback 센서 이벤트를 사용할 때마다.

WAKE_UP 이벤트

센서 HAL 1.0에서 HAL은 구현을 위해 깨우기 잠금을 관리할 수 있습니다. 다중 센서 HAL 2.0 부 HAL이이 멀티 HAL 구현 웨이크 잠금을 관리하고 호출하여 취득하는 웨이크 잠금 요청할 수있게 createScopedWakelock . A는 범위 웨이크 잠금이 인수에 전달해야 잠겨 postEvents 멀티 HAL 구현에 이벤트 일어나을 게시 할 때.

동적 센서

센서 HAL 1.0에서 동적 센서 관통 리턴 poll() 함수. 다중 센서 HAL 2.0해야 onDynamicSensorsConnectedonDynamicSensorsDisconnectedIHalProxyCallback 마다 동적 센서 연결 변화 불린다. 이 콜백의 일부로 사용할 IHalProxyCallback 관통 구비 포인터 initialize() 함수.

센서 Multi-HAL 1.0에서 이식

에서 포트 기존의 구현에 센서 멀티 HAL 1.0 , 다음 단계를 수행합니다.

  1. 센서의 HAL의 설정가에 위치하고 있는지 확인 /vendor/etc/sensors/hals.conf. 이것은에있는 파일 이동 포함 할 수 /system/etc/sensors/hals.conf .
  2. 에 대한 참조 제거 hardware/hardware.hhardware/sensors.h 다음으로는 HAL 2.0 지원되지 않습니다.
  3. 포트 부 HAL이이에 기재된 센서 핼 1.0 포팅 .
  4. 의 단계 3과 4를 따라 설정 센서 멀티 HAL 지정 HAL로 2.0 구현 센서 System의 - HAL 2.0 절을 참조하십시오.

확인

VTS 실행

당신이 센서 멀티 핼 2.1 하나 이상의 서브 HAL이 통합 한 경우, 사용 공급 업체 테스트 스위트 (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

단위 테스트 실행

의 단위 테스트 HalProxy_test.cpp 시험 HalProxy 유닛 테스트 인스턴스화되고 동적으로로드되지 않은 가짜 서브 가능한 HAL을 사용. 새 하위 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. 에서 센서 HAL의 설정 업데이트 /vendor/etc/sensors/hals.conf 가짜 하위 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 명령을 사용합니다. 센서 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에서 대량의 센서 이벤트가 게시되었음을 나타냅니다.

이후 로크 (REF)의 카운트보다 큰 경우, 0 , 이는 HalProxy 웨이크 잠금을 획득했다. 이것은 단지 이상이어야 0 경우 ScopedWakelock 의도적으로 유지되는 또는 웨이크 - 업 이벤트가 전송 된 경우 HalProxy 센서 프레임 워크로 처리되지 않았다.

의 디버그 방법에 전달 된 파일 기술자 HalProxy 개발자가의 일환으로 디버그 방법을 구현해야합니다 있도록 각 하위 HAL에 전달 ISensorsSubHal 인터페이스를.