전원 정책

하드웨어 및 소프트웨어 구성요소 (디스플레이, 오디오, 음성 상호작용 등)가 필요에 따라 선택적으로 켜지고 꺼지도록 AAOS에서는 하드웨어 및 소프트웨어 구성요소에 관한 일련의 예상 전원 켜기/끄기 상태로 구성된 전원 정책을 제공합니다. VHAL 또는 시스템 권한이 있는 공급업체 서비스는 Android 전원 상태가 전환되거나 대기 중인 조건이 충족될 때 새 전원 정책을 적용할 수 있습니다.

Wait for VHAL 및 On 상태에서 전원 정책을 적용할 수 있습니다 (일부 제한사항이 적용되는 경우 있음). Shutdown Prepare에서는 차고 모드가 실행되고 전원 상태 변경으로 인해 방해받아서는 안 됩니다. 일반 전원 정책은 적용할 수 없지만 '사용자 상호작용 없음'이라는 시스템 전원 정책인 특수 전원 정책은 Shutdown Prepare에서 적용됩니다.

AAOS 전원 상태

AAOS 기기는 다음과 같은 전원 상태 다이어그램을 따릅니다.

AAOS 전원 상태 다이어그램

그림 1. AAOS 전원 상태 다이어그램

각 전원 상태는 아래에 설명되어 있습니다.

설명
꺼짐
  • 전원이 애플리케이션 프로세서 (AP), 메모리, 주변기기에 물리적으로 제공되지 않습니다.
Wait for VHAL
  • 운전자가 차량과 상호작용할 때 (문을 여는 등) VMCU는 AP, 메모리, 주변기기에 전원을 공급합니다.
  • AAOS는 세 가지 상태 (Off, Suspend-to-RAM (STR), Wait for VHAL Finish) 중 하나에서 전환한 후 Wait for VHAL로 전환되어 VHAL과의 조정을 기다립니다.
사용
  • VHAL은 AAOS에 On 상태로 전환하라고 지시합니다. 이 상태에서 AAOS는 완전히 실행 중이며 운전자와 상호작용합니다.
  • 디스플레이는 다른 폼 팩터의 Android 디스플레이 켜기/끄기 호출이 아닌 전원 정책에 따라 제어됩니다.
종료 준비
  • 운전자가 운전을 멈추면 VHAL은 AAOS에 Shutdown Prepare로 전환하라고 지시합니다. 이 상태에서 디스플레이와 오디오는 꺼지고 AAOS는 운전자와 상호작용하지 않습니다. Android 시스템은 여전히 실행 중이며 앱과 Android 시스템을 업데이트할 수 있습니다. 업데이트가 완료되면 Android 시스템은 Wait for VHAL Finish로 전환합니다.
VHAL이 완료될 때까지 기다립니다.
  • AAOS는 VHAL에 종료할 수 있다고 알립니다. 차량 마이크로컨트롤러 단위 (VMCU)는 단일 칩 시스템 (SoC)을 완전 절전 상태로 전환하고 AP에서 전원을 차단할 것으로 예상됩니다. 그러면 실행 중인 코드는 없지만 AAOS는 STR 상태가 됩니다.
  • VHAL이 완료되지 않고 운전자가 돌아오면 헤드 단위 (HU)가 Wait for VHAL로 직접 전환되어야 합니다.
Suspend-to-RAM(STR)
  • 차량과 AP가 꺼져 있고 실행되는 코드가 없으며 전원이 AP RAM에 유지됩니다.
Suspend-to-disk (STD)
  • 차량과 AP가 꺼져 있고 실행되는 코드가 없으며 처리 장치와 AP RAM에 전원이 유지되지 않습니다.

전원 정책은 어떻게 정의되나요?

구현자는 다음과 같이 /vendor/etc/automotive/power_policy.xml에서 전원 정책을 정의합니다.

  • 전원 정책을 정의합니다.
  • 기본 전원 정책이 포함되고 전원 상태 전환이 발생할 때 자동으로 적용되는 전원 정책 그룹을 정의합니다.
  • 시스템 전원 정책을 재정의합니다.

전원 정책

전원 정책은 하드웨어 및 소프트웨어 구성요소에 관한 일련의 예상 전원 상태로 구성됩니다. AAOS는 전원 정책에서 다음 구성요소를 지원합니다.

AUDIO
MEDIA
DISPLAY
BLUETOOTH
Wi-Fi
모바일
이더넷
프로젝션
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

공급업체는 전원 정책과 함께 사용할 자체 맞춤 전원 구성요소를 정의할 수도 있습니다. 다음 예와 같이 전원 정책과 동일한 XML 파일에 맞춤 전원 구성요소를 정의합니다.

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

전원 정책 그룹

기본 전원 정책은 전원 정책 그룹에 지정된 전원 상태 전환 시 자동으로 적용됩니다. 공급업체는 Wait For VHAL, On, Wait for VHAL Finish (Deep Sleep Entry 또는 Shutdown Start)의 기본 전원 정책을 정의할 수 있습니다.

시스템 전원 정책

AAOS는 사용자 상호작용 없음일시중지 준비라는 두 가지 시스템 전원 정책을 지원합니다. 시스템 전원 정책은 기기가 무음 모드, 차고 모드, Suspend-to-RAM 또는 Suspend-to-disk로 전환될 때 적용됩니다.

다음 표에는 시스템 전원 정책의 각 구성요소 동작이 나와 있습니다. 구현자는 사용자 상호작용 없음 시스템 전원 정책에서 블루투스, NFC, 신뢰할 수 있는 기기 감지를 재정의할 수 있습니다. 재정의는 /vendor/etc/power_policy.xml에서 적용됩니다.

사용자 상호작용 없음

사용자 상호작용 없음 시스템 전원 정책의 동작은 이 표에 정의되어 있습니다.

구성요소 전원 상태 구성 가능
오디오 꺼짐 아니요
미디어 꺼짐 아니요
디스플레이 꺼짐 아니요
블루투스 꺼짐
Wi-Fi 사용 아니요
모바일 데이터 사용 아니요
이더넷 사용 아니요
프로젝션 꺼짐 아니요
NFC 꺼짐
입력 꺼짐 아니요
어시스턴트 꺼짐 아니요
사용자 상호작용 꺼짐 아니요
사용자 로그인 시 신뢰할 수 있는 기기 감지 사용
위치 꺼짐 아니요
마이크 꺼짐 아니요
CPU 켜짐 아니요

일시중지 준비

suspend prep 시스템 전원 정책의 동작은 이 표에 정의되어 있습니다.

구성요소 전원 상태 OEM에서 구성 가능
오디오 꺼짐 아니요
미디어 해당 사항 없음 아니요
디스플레이 해당 사항 없음 아니요
블루투스 꺼짐 아니요
Wi-Fi 꺼짐 아니요
모바일 데이터 해당 사항 없음 아니요
이더넷 해당 사항 없음 아니요
프로젝션 해당 사항 없음 아니요
NFC 해당 사항 없음 아니요
입력 해당 사항 없음 아니요
어시스턴트 해당 사항 없음 아니요
사용자 상호작용 해당 사항 없음 아니요
사용자 로그인 시 신뢰할 수 있는 기기 감지 해당 사항 없음 아니요
위치 꺼짐 아니요
마이크 꺼짐 아니요
CPU 꺼짐 아니요

VHAL과의 상호작용

시스템 레이어에서 실행되는 자동차 전원 정책 데몬은 VHAL의 요청을 리슨하기 위해 두 가지 속성을 구독합니다.

  • POWER_POLICY_REQ - VHAL이 전원 정책 ID를 이 속성에 씁니다.
  • POWER_POLICY_GROUP_REQ - VHAL이 전원 정책 그룹 ID를 이 속성에 씁니다.

시스템의 현재 전원 정책은 VHAL이 아닌 모듈에서 변경할 수 있습니다. 이 경우 자동차 전원 정책 데몬은 VHAL의 변경사항을 알리도록 CURRENT_POWER_POLICY 속성을 업데이트합니다.

네이티브 프로세스와의 상호작용

위에서 언급했듯이 자동차 전원 정책 데몬은 시스템 레이어에서 실행되고 전원 정책 관리 측면에서 프레임워크 레이어에서 실행되는 CPMS와 거의 동일한 기능을 제공합니다. 또한 자동차 전원 정책 데몬과 CPMS는 완전히 동기화되었다고 가정합니다.

자동차 전원 정책 데몬은 HAL과 기타 네이티브 프로세스에서 사용할 AIDL 인터페이스를 내보냅니다. 새 전원 정책이 변경되면 알림을 받을 수 있습니다. 즉, 각각 전원 상태를 변경해야 하는 때입니다.

ICarPowerPolicyServer.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
  import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter;
  import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback;
  import android.frameworks.automotive.powerpolicy.PowerComponent;

  /**
   * ICarPowerPolicyServer is an interface implemented by the power policy daemon.
   * VHAL changes the power policy and the power policy daemon notifies the change to
   * registered subscribers. When subscribing to policy changes, a filter can be specified so
   * that the registered callbacks can listen only to a specific power component's change.
   */

  @VintfStability
  interface ICarPowerPolicyServer {
    /**
     * Gets the current power policy.
     * @throws IllegalStateException if the current policy is not set.
     */
    CarPowerPolicy getCurrentPowerPolicy();

    /**
     * Gets whether the power component is turned on or off.
     *
     * @param componentId Power component ID defined in PowerComponent.aidl to check power
     * state.
     * @return True if the component's power state is on.
     * @throws IllegalArgumentException if the componentId is invalid.
     */
    boolean getPowerComponentState(in PowerComponent componentId);

    /**
     * Subscribes to power policy change.
     * Notification is sent to the registered callback when the power policy changes and the
     * power state of the components which the callback is interested in changes.
     *
     * @param callback Callback that is invoked when the power policy changes.
     * @param filter The list of components which the callback is interested in.
     * @throws IllegalArgumentException if the callback is already registered.
     * @throws IllegalStateException if the callback is dead.
     */
    void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback,
        in CarPowerPolicyFilter filter);

    /**
     * Unsubscribes from power policy change.
     *
     * @param callback Callback that doesn't want to receive power policy change.
     * @throws IllegalArgumentException if the callback is not registered.
     */
    void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);

    /**
     * Applies the power policy.
     *
     * 

{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *

{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }

ICarPowerPolicyChangeCallback.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;

  /**
   * ICarPowerPolicyChangeCallback is notified when a power policy changes.
   */

  @VintfStability
  oneway interface ICarPowerPolicyChangeCallback {
    /**
     * Called when a power policy is fully changed.
     *
     * @param policy The current policy.
     */
    void onPolicyChanged(in CarPowerPolicy policy);
  }

자바 모듈과의 상호작용

CarPowerManager는 다음과 같이 전원 정책 관리를 사용 설정하는 메서드를 제공합니다.

  • 현재 전원 정책 가져오기
  • 새 전원 정책을 적용합니다.
  • 새 전원 정책 그룹을 설정합니다.

시스템 권한이 있는 모듈만 메서드를 사용할 수 있습니다. 전원 정책이 적용될 때 알림을 받으려는 모듈은 전원 정책 변경 리스너를 CarPowerManager에 등록하면 됩니다.