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

스마트폰에는 각각 서로 다른 작업을 실행하도록 최적화된 다수의 프로세서가 포함되어 있습니다. 하지만 Android는 애플리케이션 프로세서(AP)라는 프로세서에서만 실행됩니다. AP는 게임과 같이 화면이 켜진 상태로 유지되는 사용 사례를 위해 우수한 성능을 제공하도록 조정되어 있지만 항상, 심지어 화면이 꺼져 있을 때도 전력 소모가 너무 많아 단시간의 처리 버스트가 자주 요구되는 기능을 지원하기 어렵습니다. 소규모 프로세서는 이러한 워크로드를 더 효율적으로 처리함으로써 배터리 수명에 별다른 영향을 주지 않고 작업을 완료할 수 있습니다. 그러나 이러한 저전력 프로세서의 소프트웨어 환경은 더 제한적이며 상당히 차이가 있을 수 있으므로 크로스 플랫폼 개발을 어렵게 합니다.

컨텍스트 허브 런타임 환경(CHRE)은 단순하고 표준화된 삽입 API를 사용하여 저전력 프로세서에서 앱을 실행하기 위한 공통 플랫폼을 제공합니다. CHRE를 사용하면 기기 OEM 및 신뢰할 수 있는 파트너가 손쉽게 AP에서 처리 작업을 이전하여 배터리를 절약하고 사용자 환경의 다양한 영역을 개선할 수 있으며 특히 주변 감지에 관한 머신러닝 적용과 관련하여 상시 사용 설정된 문맥 인지 기능을 사용할 수 있습니다.

주요 개념

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

개략적으로 CHRE와 Android의 아키텍처 간에 전체적으로 유사점을 도출할 수 있습니다. 하지만 몇 가지 중요한 차이점이 있습니다.

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

CHRE와 센서 허브의 개념 간에도 중요한 차이점이 있습니다. 센서 허브와 CHRE를 구현하는 데 동일한 하드웨어를 사용하는 것이 일반적이지만 CHRE 자체는 Android 센서 HAL에 필요한 센서 기능을 제공하지 않습니다. CHRE는 컨텍스트 허브 HAL과 연결되어 있으며 AP를 개입시키지 않고 센서 데이터를 수신하기 위한 기기별 센서 프레임워크의 클라이언트 역할을 합니다.

CHRE 프레임워크 아키텍처

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

컨텍스트 허브 HAL

컨텍스트 허브 하드웨어 추상화 계층(HAL)은 Android 프레임워크와 기기의 CHRE 구현 사이의 인터페이스이며 hardware/interfaces/contexthub에 정의되어 있습니다. 컨텍스트 허브 HAL은 Android 프레임워크가 사용 가능한 컨텍스트 허브와 nanoapp을 검색하고, 메시지 전달을 통해 이 nanoapp과 상호작용하고, nanoapp의 로드와 로드 취소를 가능하게 하는 API를 정의합니다. CHRE의 참조 구현과 함께 작동하는 컨텍스트 허브 HAL의 참조 구현은 system/chre/host에서 제공됩니다.

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

초기화

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

nanoapp 로드 및 로드 취소

컨텍스트 허브에는 기기 이미지에 포함되어 있으며 CHRE 시작 시 로드되는 일련의 nanoapp이 있을 수 있습니다. 이런 nanoapp을 미리 로드된 nanoapp이라고 하며 queryApps()에 대한 첫 번째 응답에 포함시켜야 합니다.

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

nanoapp 로드를 위한 구현 과정에 CHRE를 실행하는 프로세서에 연결된 플래시 저장소와 같은 비휘발성 메모리에 작성하는 것이 포함되는 경우 CHRE 구현은 항상 비활성 상태의 이 동적 nanoapp을 사용하여 부팅해야 합니다. 즉, HAL을 통해 enableNanoapp() 요청이 수신될 때까지 nanoapp의 코드가 실행되지 않습니다. 미리 로드된 nanoapp은 활성화된 상태로 초기화할 수 있습니다.

컨텍스트 허브 다시 시작

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

CHRE 시스템 개요

CHRE는 nanoapp의 이벤트 처리 진입점에 전달된 이벤트를 계산의 기본 단위로 사용하는 이벤트 기반 아키텍처를 중심으로 설계되었습니다. CHRE 프레임워크는 멀티스레드될 수 있지만, 지정된 nanoapp은 절대로 여러 스레드에서 동시에 실행되지 않습니다. CHRE 프레임워크는 세 가지 nanoapp 진입점(nanoappStart(), nanoappHandleEvent(), nanoappEnd()) 중 하나를 통해서나 이전 CHRE API 호출에서 제공된 콜백을 통해 지정된 nanoapp과 상호작용합니다. 또한 nanoapp은 CHRE API를 통해 CHRE 프레임워크 및 기본 시스템과 상호작용합니다. 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를 지원하는 모든 기기에서 nanoapp 코드가 호환되도록 설계되었습니다. 즉, 새로운 기기 유형을 지원하기 위해 nanoapp의 소스 코드를 수정할 필요가 없지만 대상 기기의 프로세서 명령 집합 또는 애플리케이션 바이너리 인터페이스(ABI)에 맞게 다시 컴파일해야 할 수 있습니다. 또한 CHRE 아키텍처 및 API 설계는 nanoapp 바이너리가 다양한 버전의 CHRE API 간에 호환되도록 합니다. 즉, nanoapp을 컴파일하는 타겟 API와 달리 다른 버전의 CHRE API를 구현하는 시스템에서 실행하기 위해 nanoapp을 다시 컴파일할 필요가 없습니다. 다시 말해서, 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 버전과 연결되지는 않습니다.

버전 요약

CHRE API는 Android HIDL 버전 관리 체계와 마찬가지로 시맨틱 버전 관리를 따릅니다. 주 버전은 바이너리 호환성을 나타내고 부 버전은 이전 버전과 호환되는 기능이 도입될 때 증분됩니다. CHRE API에는 함수 또는 매개변수를 도입한 버전을 알 수 있는 소스 코드 주석(예: @since v1.1)이 포함되어 있습니다.

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

버전 1.0(Android 7)

센서 및 핵심 nanoapp 기능(예: 이벤트, 타이머)을 위한 지원이 포함되어 있습니다.

버전 1.1(Android 8)

GNSS 위치 및 원시 측정값, Wi-Fi 검색, 셀룰러 네트워크 정보를 통한 위치 기능이 도입되었으며 nanoapp 간 통신을 사용하도록 설정하는 일반적인 수정사항 및 다른 개선사항이 포함되어 있습니다.

버전 1.2(Android 9)

저전력 마이크의 데이터 지원, Wi-Fi RTT 범위 설정, AP 절전 모드 해제/절전 모드 알림 및 다른 개선사항이 추가되었습니다.

버전 1.3(Android 10)

센서 보정 데이터 관련 기능이 향상되었고, 일괄 처리된 센서 데이터의 주문형 플러시 지원이 추가되었으며, 단계 감지 센서 유형이 정의되고, 추가 정확도 필드를 사용하여 GNSS 위치 이벤트가 확장되었습니다.

버전 1.4(Android 11)

5G 셀 정보 지원, nanoapp 디버그 덤프 및 다른 개선사항이 추가되었습니다.

필수 시스템 기능

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

CHRE API에 명문화된 핵심 시스템 기능과 더불어 컨텍스트 허브 HAL 수준에서 지정된 필수 CHRE 시스템 수준 기능도 있습니다. 그중 가장 중요한 것은 nanoapp을 동적으로 로드하고 로드 취소하는 기능입니다.

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 등의 호스트 환경에 액세스
  • POSIX 및 C99 또는 C++11 언어 표준에 포함되지 않은 다른 라이브러리

많은 경우 CHRE API 함수 또는 유틸리티 라이브러리에서 상응하는 기능을 사용할 수 있습니다. 예를 들어 Android logcat 시스템을 타겟팅하는 디버그 로깅에 chreLog를 사용할 수 있으며, 기존 프로그램은 printf 또는 std::cout를 사용할 수 있습니다.

반면, 일부 표준 라이브러리 기능은 필수입니다. nanoapp 바이너리에 포함하기 위한 정적 라이브러리를 통해서나 nanoapp과 시스템 간 동적 링크를 통해 노출하는 것은 플랫폼 구현에 달려 있습니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다.

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

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

일부 기본 플랫폼은 추가 기능을 지원하지만, nanoapp은 외부 종속 항목을 CHRE API 함수 및 승인된 표준 라이브러리 함수로 제약하지 않는 경우 CHRE 구현에서 이동 가능한 앱으로 간주되지 않습니다.

추가 기능(선택사항)

하드웨어 및 소프트웨어를 승격하기 위해 CHRE API는 기능 영역으로 나뉩니다. 이런 과정은 API 관점에서 선택적인 것으로 간주됩니다. 이러한 기능은 호환되는 CHRE 구현을 지원하는 데 필요하지 않을 수도 있지만 특정 nanoapp을 지원하기 위해 필요할 수도 있습니다. 플랫폼이 특정 API 집합을 지원하지 않는 경우에도 이러한 함수를 참조하는 nanoapp은 빌드하고 로드할 수 있어야 합니다.

센서

CHRE API는 가속도계, 자이로스코프, 자기계, 주변광 센서, 근접 센서를 포함한 센서에서 데이터를 요청하는 기능을 제공합니다. 이 API는 전력 소모량을 줄이기 위한 센서 샘플 일괄 처리 지원을 포함하여 Android Sensors API와 유사한 기능 세트를 제공하기 위한 것입니다. CHRE 내에서 센서 데이터를 처리하면 AP에서 실행하는 것에 비해 움직임 신호를 처리하는 데 소모되는 전력이 훨씬 더 적고 지연 시간이 더 짧습니다.

GNSS

CHRE는 GPS 및 다른 군집 위성을 포함한 글로벌 탐색 위성 시스템(GNSS)에 위치 데이터를 요청하는 API를 제공합니다. 여기에는 정기적인 위치 수정뿐만 아니라 원시 측정 데이터의 요청이 포함됩니다. 이 두 기능은 독립적인 기능입니다. CHRE는 GNSS 하위 시스템에 직접 링크되므로 AP 기반 GNSS 요청에 비해 전력 소모가 적습니다. AP의 경우 위치 세션의 전체 수명 주기 동안 절전 모드를 유지할 수 있기 때문입니다.

Wi-Fi

CHRE는 주로 위치 목적으로 Wi-Fi 칩과 상호작용하는 기능을 제공합니다. GNSS는 실외 위치에 잘 작동하지만, Wi-Fi 검색 결과는 실내 및 개발 지역에서 정확한 위치 정보를 제공할 수 있습니다. CHRE는 검색을 위해 AP의 절전 모드를 해제하는 데 드는 비용을 방지할 뿐만 아니라 Wi-Fi 펌웨어가 연결 목적으로 실행하는 Wi-Fi 검색의 결과를 수신 대기할 수 있습니다. 이러한 결과는 일반적으로 전력 소모의 이유로 AP에는 전달되지 않습니다. 컨텍스트 용도로 연결 검사를 활용하면 실행되는 총 Wi-Fi 검색 건수가 줄어 전력을 절약할 수 있습니다.

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

WWAN

CHRE API는 일반적으로 대략적인 위치 목적으로 사용되는 서비스 셀 및 주변 지역의 셀 식별 정보를 검색하는 기능을 제공합니다.

오디오

CHRE는 저전력 마이크의 오디오 데이터 배치를 처리할 수 있으며, 여기서는 일반적으로 SoundTrigger HAL을 구현하는 데 사용되는 하드웨어를 활용합니다. CHRE에서 오디오 데이터를 처리하면 이 데이터를 움직임 감지 센서 등의 다른 데이터와 통합할 수 있습니다.

참조 구현

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

기술 세부정보 및 포팅 가이드는 system/chre 프로젝트에 포함된 리드미를 참고하세요.