컨텍스트 허브 런타임 환경(CHRE)

스마트폰에는 각기 다른 작업을 수행하는 데 최적화된 여러 프로세서가 포함되어 있습니다. 그러나 Android는 하나의 프로세서, 즉 애플리케이션 프로세서(AP)에서만 실행됩니다. AP는 게임과 같은 스크린 온 사용 사례에 대해 뛰어난 성능을 제공하도록 조정되었지만 화면이 꺼져 있을 때에도 항상 빈번하고 짧은 처리 버스트가 필요한 기능을 지원하기에는 너무 많은 전력이 소모됩니다. 더 작은 프로세서는 이러한 작업 부하를 보다 효율적으로 처리하여 배터리 수명에 눈에 띄는 영향을 주지 않고 작업을 완료할 수 있습니다. 그러나 이러한 저전력 프로세서의 소프트웨어 환경은 더 제한적이며 크게 다를 수 있으므로 플랫폼 간 개발이 어렵습니다.

Context Hub Runtime Environment(CHRE)는 단순하고 표준화된 내장형 API를 사용하여 저전력 프로세서에서 앱을 실행하기 위한 공통 플랫폼을 제공합니다. CHRE를 사용하면 장치 OEM 및 신뢰할 수 있는 파트너가 AP에서 처리를 오프로드하고 배터리를 절약하고 사용자 경험의 다양한 영역을 개선하며 항상 켜져 있고 상황에 맞는 인식 기능, 특히 기계 응용 프로그램과 관련된 클래스를 활성화할 수 있습니다. 주변 감지 학습.

주요 컨셉

CHRE는 nanoapps 라고 하는 작은 기본 응용 프로그램이 저전력 프로세서에서 실행되고 공통 CHRE API를 통해 기본 시스템과 상호 작용하는 소프트웨어 환경입니다. CHRE API의 적절한 구현을 가속화하기 위해 CHRE의 플랫폼 간 참조 구현이 AOSP에 포함되어 있습니다. 참조 구현에는 일련의 플랫폼 추상화 계층(PAL)을 통해 기본 하드웨어 및 소프트웨어에 대한 공통 코드 및 추상화가 포함됩니다. Nanoapp은 거의 항상 Android에서 실행되는 하나 이상의 클라이언트 앱 에 연결되어 있으며, 이는 제한된 액세스 ContextHubManager 시스템 API를 통해 CHRE 및 nanoapp과 상호 작용합니다.

높은 수준에서 CHRE와 Android의 아키텍처는 전체적으로 유사합니다. 그러나 몇 가지 중요한 차이점이 있습니다.

  • CHRE는 네이티브 코드(C 또는 C++)로 개발된 나노앱만 실행하는 것을 지원합니다. 자바는 지원하지 않습니다.
  • 리소스 제약 및 보안 제한으로 인해 CHRE는 임의의 타사 Android 앱에서 사용할 수 없습니다. 시스템에서 신뢰할 수 있는 앱만 액세스할 수 있습니다.

또한 CHRE 개념과 센서 허브 사이에는 중요한 차이점이 있습니다. 동일한 하드웨어를 사용하여 센서 허브와 CHRE를 구현하는 것이 일반적이지만 CHRE 자체는 Android 센서 HAL 에 필요한 센서 기능을 제공하지 않습니다. CHRE는 Context Hub HAL에 연결되어 AP를 포함하지 않고 센서 데이터를 수신하는 장치별 센서 프레임워크의 클라이언트 역할을 합니다.

CHRE 프레임워크 아키텍처

그림 1. CHRE 프레임워크 아키텍처

컨텍스트 허브 HAL

Context Hub HAL(하드웨어 추상화 계층)은 hardware/interfaces/contexthub 에 정의된 Android 프레임워크와 기기의 CHRE 구현 간의 인터페이스입니다. 컨텍스트 허브 HAL은 Android 프레임워크가 사용 가능한 컨텍스트 허브 및 해당 나노앱을 검색하고, 메시지 전달을 통해 해당 나노앱과 상호작용하고, 나노앱이 로드 및 언로드되도록 허용하는 API를 정의합니다. CHRE의 참조 구현과 함께 작동하는 컨텍스트 허브 HAL의 참조 구현은 system/chre/host 에서 사용할 수 있습니다.

이 문서와 HAL 정의가 충돌하는 경우 HAL 정의가 우선합니다.

초기화

Android가 부팅될 때 ContextHubServicegetHubs() HAL 함수를 호출하여 기기에서 사용 가능한 컨텍스트 허브가 있는지 확인합니다. 이것은 차단된 일회성 호출이므로 부팅 지연을 방지하기 위해 빠르게 완료되어야 하며 이후에 새 컨텍스트 허브를 도입할 수 없으므로 정확한 결과를 반환해야 합니다.

nanoapp 로드 및 언로드

컨텍스트 허브에는 장치 이미지에 포함되고 CHRE가 시작될 때 로드되는 nanoapp 세트가 포함될 수 있습니다. 이를 미리 로드된 나노앱이라고 하며 queryApps() 에 대한 첫 번째 가능한 응답에 포함되어야 합니다.

컨텍스트 허브 HAL은 또한 loadNanoApp()unloadNanoApp() 함수를 통해 런타임에 동적으로 nanoapp 로드 및 언로드를 지원합니다. Nanoapp은 장치의 CHRE 하드웨어 및 소프트웨어 구현과 관련된 바이너리 형식으로 HAL에 제공됩니다.

나노앱을 로드하기 위한 구현에 CHRE를 실행하는 프로세서에 연결된 플래시 스토리지와 같은 비휘발성 메모리에 쓰는 것이 포함되는 경우 CHRE 구현은 항상 비활성화된 상태에서 이러한 동적 나노앱으로 부팅해야 합니다. 이는 HAL을 통해 enableNanoapp() 요청이 수신될 때까지 nanoapp의 코드가 실행되지 않음을 의미합니다. 미리 로드된 nanoapp은 활성화된 상태에서 초기화할 수 있습니다.

컨텍스트 허브 다시 시작

CHRE는 정상 작동 중에 다시 시작되지 않을 것으로 예상되지만 매핑되지 않은 메모리 주소에 액세스하려는 시도와 같은 예기치 않은 조건에서 복구해야 할 수 있습니다. 이러한 상황에서 CHRE는 Android와 독립적으로 다시 시작됩니다. HAL은 RESTARTED 이벤트를 통해 Android에 이를 알립니다. 이 이벤트는 queryApps() 와 같은 새 요청을 수락할 수 있는 지점까지 CHRE가 다시 초기화된 후에만 보내야 합니다.

CHRE 시스템 개요

CHRE는 이벤트 기반 아키텍처를 중심으로 설계되었으며, 여기서 계산의 기본 단위는 이벤트가 nanoapp의 이벤트 처리 진입점으로 전달되는 것입니다. CHRE 프레임워크는 다중 스레드가 될 수 있지만 주어진 nanoapp은 여러 스레드에서 병렬로 실행되지 않습니다. CHRE 프레임워크는 3개의 nanoapp 진입점( nanoappStart() , nanoappHandleEvent()nanoappEnd() ) 중 하나를 통해 또는 이전 CHRE API 호출에서 제공된 콜백을 통해 주어진 nanoapp과 상호 작용하고 nanoapp은 CHRE 프레임워크 및 CHRE API를 통한 기본 시스템. CHRE API는 센서, GNSS, Wi-Fi, WWAN 및 오디오를 포함한 상황별 신호에 액세스하기 위한 기능과 기본 기능 세트를 제공하며 공급업체별 nanoapp에서 사용할 수 있는 추가 공급업체별 기능으로 확장할 수 있습니다. .

시스템 구축

컨텍스트 허브 HAL 및 기타 필요한 AP 측 구성 요소는 Android와 함께 빌드되지만 CHRE 내에서 실행되는 코드에는 특수 도구 모음의 필요성과 같이 Android 빌드 시스템과 호환되지 않는 요구 사항이 있을 수 있습니다. 따라서 AOSP의 CHRE 프로젝트는 GNU Make를 기반으로 하는 간소화된 빌드 시스템을 제공하여 nanoapp을 컴파일하고 선택적으로 CHRE 프레임워크를 시스템과 통합할 수 있는 라이브러리로 컴파일합니다. CHRE에 대한 지원을 추가하는 장치 제조업체는 대상 장치에 대한 빌드 시스템 지원을 AOSP에 통합해야 합니다.

CHRE API는 C99 언어 표준으로 작성되었으며 참조 구현은 리소스가 제한된 애플리케이션에 적합한 C++11의 제한된 하위 집합을 사용합니다.

CHRE API

CHRE API는 nanoapp과 시스템 간의 소프트웨어 인터페이스를 정의하는 C 헤더 파일의 모음입니다. 이는 CHRE를 지원하는 모든 장치에서 nanoapps 코드가 호환되도록 설계되었습니다. 즉, nanoapp의 소스 코드는 새로운 장치 유형을 지원하기 위해 수정할 필요가 없지만 대상 장치의 프로세서에 대해 특별히 다시 컴파일해야 할 수도 있습니다. 명령어 세트 또는 애플리케이션 바이너리 인터페이스(ABI). CHRE 아키텍처 및 API 디자인은 또한 nanoapp이 다른 버전의 CHRE API에서 바이너리 호환이 가능하도록 보장합니다. nanoapp이 컴파일되는 대상 API입니다. 즉, nanoapp 바이너리가 CHRE API v1.3을 지원하는 장치에서 실행되고 해당 장치가 CHRE API v1.4를 지원하도록 업그레이드된 경우 동일한 nanoapp 바이너리가 계속 작동합니다. 마찬가지로 nanoapp은 CHRE API v1.2에서 실행될 수 있으며 기능을 달성하기 위해 API v1.3의 기능이 필요한지 또는 잠재적으로 정상적인 기능 저하와 함께 작동할 수 있는지 여부를 런타임에 결정할 수 있습니다.

새 버전의 CHRE API는 Android와 함께 출시되지만 CHRE 구현은 공급업체 구현 의 일부이므로 기기에서 지원되는 CHRE API 버전이 반드시 Android 버전에 연결되어야 하는 것은 아닙니다.

버전 요약

Android HIDL 버전 관리 체계 와 마찬가지로 CHRE API는 의미 체계 버전 관리 를 따릅니다. 메이저 버전은 바이너리 호환성을 나타내며, 마이너 버전은 이전 버전과 호환되는 기능이 도입될 때 증가합니다. CHRE API에는 함수 또는 매개변수를 도입한 버전을 식별하기 위한 소스 코드 주석이 포함되어 있습니다(예 @since v1.1 ).

또한 CHRE 구현은 chreGetVersion() 을 통해 플랫폼별 패치 버전을 노출합니다. 이는 구현에서 버그 수정 또는 사소한 업데이트가 이루어진 시기를 나타냅니다.

버전 1.0(안드로이드 7)

센서 및 이벤트 및 타이머와 같은 핵심 nanoapp 기능에 대한 지원을 포함합니다.

버전 1.1(안드로이드 8)

GNSS 위치 및 원시 측정, Wi-Fi 스캔 및 셀룰러 네트워크 정보를 통한 위치 기능을 소개하고, nanoapp 간 통신을 가능하게 하는 일반적인 개선 사항 및 기타 개선 사항을 소개합니다.

버전 1.2(안드로이드 9)

저전력 마이크의 데이터 지원, Wi-Fi RTT 범위 지정, AP 깨우기/절전 알림 및 기타 개선 사항을 추가합니다.

버전 1.3(안드로이드 10)

센서 보정 데이터와 관련된 기능을 향상하고, 요청 시 배치된 센서 데이터 플러시 지원을 추가하고, 단계 감지 센서 유형을 정의하고, 추가 정확도 필드로 GNSS 위치 이벤트를 확장합니다.

버전 1.4(안드로이드 11)

5G 셀 정보, nanoapp 디버그 덤프 및 기타 개선 사항에 대한 지원을 추가합니다.

필수 시스템 기능

센서와 같은 상황 신호 소스는 선택적 기능 영역으로 분류되지만 모든 CHRE 구현에는 몇 가지 핵심 기능이 필요합니다. 여기에는 타이머 설정, 애플리케이션 프로세서의 클라이언트에 메시지 송수신, 로깅 등과 같은 핵심 시스템 API가 포함됩니다. 자세한 내용은 API 헤더 를 참조하세요.

CHRE API에 코드화된 핵심 시스템 기능 외에도 컨텍스트 허브 HAL 수준에서 지정된 필수 CHRE 시스템 수준 기능도 있습니다. 이들 중 가장 중요한 것은 나노앱을 동적으로 로드 및 언로드하는 기능입니다.

C/C++ 표준 라이브러리

메모리 사용량과 시스템 복잡성을 최소화하기 위해 CHRE 구현은 런타임 지원이 필요한 표준 C 및 C++ 라이브러리와 언어 기능의 하위 집합만 지원해야 합니다. 이러한 원칙에 따라 일부 기능은 메모리 및/또는 광범위한 OS 수준 종속성으로 인해 명시적으로 제외되고 다른 기능은 보다 적합한 CHRE 관련 API로 대체되기 때문에 명시적으로 제외됩니다. 완전한 목록은 아니지만 다음 기능은 nanoapp에서 사용할 수 있도록 의도되지 않았습니다.

  • C++ 예외 및 런타임 유형 정보(RTTI)
  • C++11 헤더 <thread> , <mutex> , <atomic> , <future> 를 포함한 표준 라이브러리 멀티스레딩 지원
  • C 및 C++ 표준 입력/출력 라이브러리
  • C++ 표준 템플릿 라이브러리(STL)
  • C++ 표준 정규식 라이브러리
  • 표준 함수(예: malloc , calloc , realloc , free , operator new ) 및 std::unique_ptr 과 같이 본질적으로 동적 할당을 사용하는 기타 표준 라이브러리 함수를 통한 동적 메모리 할당
  • 현지화 및 유니코드 문자 지원
  • 날짜 및 시간 라이브러리
  • <setjmp.h> , <signal.h> , abort , std::terminate 를 포함하여 정상적인 프로그램 흐름을 수정하는 함수
  • system , getenv 를 포함한 호스트 환경에 액세스
  • C99 또는 C++11 언어 표준에 포함되지 않은 POSIX 및 기타 라이브러리

많은 경우 CHRE API 함수 및/또는 유틸리티 라이브러리에서 동등한 기능을 사용할 수 있습니다. 예를 들어 chreLog 는 Android logcat 시스템을 대상으로 하는 디버그 로깅에 사용할 수 있습니다. 여기서 더 전통적인 프로그램은 printf 또는 std::cout 를 사용할 수 있습니다.

대조적으로, 일부 표준 라이브러리 기능이 필요합니다. nanoapp 바이너리에 포함하기 위해 정적 라이브러리를 통해 또는 nanoapp과 시스템 간의 동적 연결을 통해 이를 노출하는 것은 플랫폼 구현에 달려 있습니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다.

  • 문자열/배열 유틸리티: memcmp , memcpy , memmove , memset , strlen
  • 수학 라이브러리: 일반적으로 사용되는 단정밀도 부동 소수점 함수:

    • 기본 연산: ceilf , fabsf , floorf , fmaxf , fminf , fmodf , roundf , lroundf , remainderf f
    • 지수/제곱 함수: expf , log2f , powf , sqrtf
    • 삼각/쌍곡선 함수: cosf , sinf , tanf , asinf , acosf , atan2f , tanhf

일부 기본 플랫폼은 추가 기능을 지원하지만 nanoapp은 CHRE API 기능 및 승인된 표준 라이브러리 기능에 대한 외부 종속성을 제한하지 않는 한 CHRE 구현 간에 이식 가능한 것으로 간주되지 않습니다.

옵션 기능

하드웨어 및 소프트웨어를 홍보하기 위해 CHRE API는 API 관점에서 선택 사항으로 간주되는 기능 영역으로 나뉩니다. 이러한 기능은 호환 가능한 CHRE 구현을 지원하는 데 필요하지 않을 수 있지만 특정 nanoapp을 지원하는 데 필요할 수 있습니다. 플랫폼이 주어진 API 세트를 지원하지 않더라도 해당 기능을 참조하는 나노앱은 빌드 및 로드할 수 있어야 합니다.

센서

CHRE API는 가속도계, 자이로스코프, 자력계, 주변광 센서 및 근접도를 포함한 센서에서 데이터를 요청할 수 있는 기능을 제공합니다. 이러한 API는 전력 소비를 줄이기 위해 센서 샘플을 일괄 처리하는 지원을 포함하여 Android 센서 API와 유사한 기능 세트를 제공하기 위한 것입니다. CHRE 내에서 센서 데이터를 처리하면 AP에서 실행하는 것과 비교하여 훨씬 더 낮은 전력과 모션 신호의 더 낮은 대기 시간 처리가 가능합니다.

GNSS

CHRE는 GPS 및 기타 위성 별자리를 포함하여 GNSS(Global Navigation Satellite System)에서 위치 데이터를 요청하기 위한 API를 제공합니다. 여기에는 주기적인 위치 수정과 원시 측정 데이터에 대한 요청이 포함되지만 둘 다 독립적인 기능입니다. CHRE는 GNSS 하위 시스템에 직접 연결되어 있으므로 AP 기반 GNSS 요청에 비해 전력이 감소합니다. 이는 AP가 위치 세션의 전체 수명 주기 동안 절전 상태를 유지할 수 있기 때문입니다.

와이파이

CHRE는 주로 위치 확인을 위해 Wi-Fi 칩과 상호 작용하는 기능을 제공합니다. GNSS는 실외 위치에서 잘 작동하지만 Wi-Fi 스캔 결과는 실내 및 개발된 지역에서 정확한 위치 정보를 제공할 수 있습니다. 스캔을 위해 AP를 깨우는 비용을 피하는 것 외에도 CHRE는 연결 목적으로 Wi-Fi 펌웨어에서 수행한 Wi-Fi 스캔 결과를 수신할 수 있습니다. 일반적으로 전원 문제로 인해 AP에 전달되지 않습니다. 상황에 맞는 목적으로 연결 스캔을 활용하면 수행되는 Wi-Fi 스캔의 총 횟수를 줄여 전력을 절약하는 데 도움이 됩니다.

검색 결과를 모니터링하고 요청 시 검색을 트리거하는 기능을 포함하여 Wi-Fi 지원이 CHRE API v1.1에 추가되었습니다. 이러한 기능은 정확한 상대 위치 결정을 가능하게 하는 기능을 지원하는 액세스 포인트에 대해 왕복 시간(RTT) 측정을 수행하는 기능과 함께 v1.2에서 확장되었습니다.

WWAN

CHRE API는 일반적으로 대략적인 위치 지정 목적으로 사용되는 서빙 셀 및 그 이웃에 대한 셀 식별 정보를 검색하는 기능을 제공합니다.

오디오

CHRE는 일반적으로 SoundTrigger HAL을 구현하는 데 사용되는 하드웨어를 활용하는 저전력 마이크에서 오디오 데이터 배치를 처리할 수 있습니다. CHRE에서 오디오 데이터를 처리하면 모션 센서와 같은 다른 데이터와 융합될 수 있습니다.

참조 구현

CHRE 프레임워크에 대한 참조 코드는 C++11로 구현된 system/chre 프로젝트의 AOSP에 포함되어 있습니다. 엄격하게 요구되는 것은 아니지만 일관성을 보장하고 새로운 기능의 채택을 가속화하기 위해 모든 CHRE 구현이 이 코드베이스를 기반으로 하는 것이 좋습니다. 이 코드는 애플리케이션에서 사용하는 API의 오픈 소스 구현이라는 점에서 핵심 Android 프레임워크와 유사하며, 호환성을 위한 기준 및 표준 역할을 합니다. 공급업체별 기능으로 사용자 정의하고 확장할 수 있지만 권장 사항은 공통 코드를 가능한 한 참조에 가깝게 유지하는 것입니다. Android의 HAL과 유사하게 CHRE 참조 구현은 다양한 플랫폼 추상화를 사용하여 최소 요구 사항을 충족하는 모든 기기에 적용할 수 있습니다.

기술적인 세부 사항 및 이식 가이드는 system/chre 프로젝트에 포함된 README 를 참조하십시오.