시스템 UI 구현

Android Automotive는 차량 전용으로 개발된 새로운 시스템 UI를 제공합니다. 시스템 UI의 대부분 구성요소는 프레임워크 서비스와 밀접하게 결합됩니다. 시스템 UI는 앱에 포함되지 않는 화면에 표시되는 모든 요소를 나타냅니다. Automotive 시스템 UI(CarSystemUI 요소 패키지)는 차량 전용으로 맞춤설정된 Android 시스템 UI(SystemUI 패키지)의 확장 프로그램입니다.

시스템 UI란 무엇인가요?

Automotive 시스템 UI와 관련된 구성요소는 다음과 같습니다.

구성요소 설명
잠금 화면 UI 사용자가 특정 사용자 계정으로 인증된 화면
탐색 메뉴 화면의 왼쪽, 하단 또는 오른쪽에 위치할 수 있으며 다른 앱으로 이동하기 위한 속성 버튼을 포함하고, 알림 패널을 전환하고, 차량 컨트롤(예: HVAC)을 제공할 수 있는 시스템 표시줄입니다. 뒤로, 홈 및 앱 스택 버튼을 제공하는 Android 시스템 UI 구현과는 다릅니다.
상태 표시줄 탐색 메뉴 역할을 하며 화면을 따라 위치하는 시스템 표시줄입니다. 상태 표시줄은 다음을 지원하는 기능도 제공합니다.
  • 연결 아이콘 블루투스, Wi-Fi, 핫스팟/모바일 연결 포함
  • 풀다운 알림 패널 예를 들어 화면 상단에서 아래로 스와이프합니다.
  • HUN(보행 중 주의 알림)
시스템 UI 앱에 포함되지 않는 화면에 표시되는 요소를 나타냅니다.
사용자 전환기 UI 사용자가 다른 사용자를 선택할 수 있는 화면입니다.
볼륨 UI 운전자가 물리적 볼륨 버튼을 사용하여 기기의 볼륨을 변경할 때 표시되는 대화상자입니다.

시스템 UI 작동 방식

시스템 UI는 기기의 전원이 켜질 때 실행되는 Android 애플리케이션입니다. 애플리케이션은 SystemServer에서 반전을 통해 시작됩니다. 시스템 UI에서 사용자가 볼 수 있는 측면과 가장 관련성이 높은 진입점이 아래 나와 있습니다. 이러한 구성요소를 사용하여 Automotive 관련 기능에 맞게 Android 시스템 UI를 맞춤설정합니다.

  • config_statusBarComponent
  • config_systemUIFactoryComponent

CarSystemUI는 SystemUI 패키지의 확장 프로그램입니다. 즉, SystemUI 패키지의 클래스와 리소스를 CarSystemUI 패키지에서 사용하고 재정의할 수 있습니다.

시스템 UI 맞춤설정

오버레이

Android 소스 코드를 수정하여 시스템 UI를 맞춤설정할 수 있지만, 이렇게 하면 향후 Android 업데이트를 적용하기가 더 어렵고 복잡해집니다. 대신 Android는 오버레이 디렉터리 사용을 지원하므로 소스 코드를 수정하지 않고 리소스 파일을 바꿀 수 있습니다. Android 빌드 시스템에서는 오버레이 시스템이 제어된 방식으로 파일을 재정의합니다. 수정된 모든 파일은 AOSP 소스 코드의 전체 트리를 순회하지 않고 명확하게 식별됩니다.

오버레이 파일은 PRODUCT_PACKAGE_OVERLAYS 디렉터리에 배치되어야 하며 원래 AOSP 루트 구조와 똑같은 하위 폴더가 있어야 합니다. Android 10 이상에서 PRODUCT_PACKAGE_OVERLAYS는 다음과 같이 설정됩니다.

PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay

Automotive 시스템 UI는 SystemUI CarSystemUI 패키지의 리소스를 사용합니다. 즉, 각 위치의 리소스는 오버레이를 통해 재정의되어 Automotive 시스템 UI의 디자인과 분위기에 영향을 줄 수 있습니다.

파일을 바꾸려면 지정한 /overlay 디렉터리에서 교체되는 파일의 디렉터리 구조를 복제한 다음, 이 디렉터리에 교체 파일을 포함합니다. 예를 들어 다음과 같이 바꿉니다.

frameworks/base/packages/CarSystemUI/res/layout/super_status_bar.xml

다음 위치에 교체 super_status_bar.xml 파일을 추가합니다.

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

frameworks/base/packages/SystemUI/res/values/config.xml(CarSystemUI가 아닌 SystemUI)을 바꾸려면 교체 config.xml 파일을 다음 위치에 추가합니다.

packages/services/Car/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/

또는

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

두 가지 기본 맞춤설정 진입점에 관한 설명이 아래 제공됩니다.

Automotive 시스템 UI에는 화면의 왼쪽, 하단, 오른쪽에 세 개의 탐색 메뉴가 있을 수 있습니다. 각 시스템 표시줄의 공개 상태는 다음 구성을 통해 전환됩니다.

  • config_enableLeftNavigationBar
  • config_enableBottomNavigationBar
  • config_enableRightNavigationBar

각 막대에는 각 레이아웃 파일을 오버레이하여 맞춤설정할 수 있는 프로비저닝 및 프로비저닝 해제된 상태가 있습니다.

  • car_left_navigation_bar.xml
  • car_left_navigation_bar_unprovisioned.xml
  • car_navigation_bar.xml (하단 탐색 메뉴의 레이아웃)
  • car_navigation_bar_unprovisioned.xml
  • car_right_navigation_bar.xml
  • car_right_navigation_bar_unprovisioned.xml

이러한 레이아웃은 필요한 다른 뷰를 모두 포함할 수 있는 최상위 수준에 com.android.systemui.statusbar.car.CarNavigationBarView가 있어야 합니다. 탐색 메뉴 내부 버튼은 다음 중 하나를 사용하여 포함할 수 있습니다.

  • com.android.systemui.statusbar.car.CarFacetButton
  • com.android.systemui.statusbar.car.CarNavigationButton(더 많은 XML 기반 구성 허용)

기기가 특정 사용자에게 제대로 프로비저닝되면 이러한 뷰가 CarStatusBar#createNavigationBar에서 확장됩니다.

상태 표시줄

상태 표시줄을 추가 기능이 있는 탐색 메뉴로 간주합니다. 탐색 메뉴와 달리 상태 표시줄에는 기능을 중지할 플래그가 없습니다. 다음 방법으로 상태 표시줄을 수정할 수 있습니다.

  • car_top_navigation_bar.xml
  • car_top_navigation_bar_unprovisioned.xml

이러한 레이아웃은 최상위 수준 com.android.systemui.statusbar.car.CarNavigationBarView 를 포함해야 합니다. 상태 표시줄에는 상태 아이콘이 있습니다. 아이콘의 크기를 변경하려면 특정 크기를 지정하는 대신 배율을 사용하여 아이콘을 균일하게 조정합니다. 예를 들어 오버레이 파일 /overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml에서 다음 크기를 추가하여 아이콘 크기를 두 배로 늘립니다.

<resources>
    <!-- The amount by which to scale up the status bar icons.-->
    <item name="status_bar_icon_scale_factor" format="float" type="dimen">2</item>
</resources>

상태 표시줄은 알림 패널, 사용자 전환기, HUN(보행 중 주의 알림) 및 키가드도 포함하는 특수 창 레이어에 있습니다. 이와 같은 다양한 레이아웃은 super_status_bar.xml에 포함됩니다.

시스템 UI 소스 코드 변경사항

오버레이는 시스템 UI 동작을 충분히 맞춤설정하는 데 필요한 유연성을 제공하지 않을 수 있습니다.

알림. Android 소스 코드를 변경하면 Android의 향후 릴리스에서 업데이트하기 어렵습니다. 코드를 직접 수정하는 대신 Automotive 시스템 UI 코드를 확장하는 것이 좋습니다. 이렇게 하면 모든 맞춤설정이 알려진 API 노출 영역을 통해 구현되므로 기본 Automotive 시스템 UI 소스 코드를 최소한의 병합 충돌로 업그레이드할 수 있습니다.

시스템 UI의 대부분 측면은 다음 두 진입점을 통해 맞춤설정할 수 있습니다.

  • config_statusBarComponent
  • config_systemUIFactoryComponent

예를 들어 CarStatusBar를 확장하는 com.android.systemui.statusbar.car.custom.CustomCarStatusBar라는 클래스를 만들 경우 이 새로운 구성요소를 가리키도록 config_statusBarComponent를 업데이트합니다. 이 클래스를 확장하면 시스템 표시줄 및 알림 로직과 관련된 대부분의 요소를 맞춤설정할 수 있습니다.

마찬가지로 CustomCarSystemUIFactory를 만들고 config_systemUIFactoryComponent에 배치할 수 있습니다. 이 클래스를 사용하여 VolumeUI 및 잠금 화면의 기능을 업데이트합니다.

사용자 전환 및 잠금 해제 맞춤설정

다음 자료에서는 사용자 전환 환경을 맞춤설정하는 방법을 설명합니다.

용어 설명
키가드 포그라운드 애플리케이션과 실수로 상호작용하는 것을 방지하기 위한 전체 화면 대화상자입니다. 여러 사용자가 설정된 경우 각 사용자의 개인정보를 보호합니다.
로드 중 대화상자 사용자 간에 전환할 때 표시되는 로드 중 화면입니다.
잠금 화면, 바운서 사용자가 PIN, 패턴 또는 비밀번호를 입력해야 하는 화면입니다.
사용자 Android 사용자입니다.
사용자 선택도구 기기가 부팅될 때 표시되는 사용자 선택도구 화면입니다.
사용자 전환기 QuickSettings에서 화면을 전환할 때 표시되는 사용자 전환기입니다.

사용자 전환 맞춤설정

키가드 및 바운서

Android Automotive OS에서는 사용자가 잠금 화면에서 취소 버튼을 클릭하는 경우에만 사용자 선택도구가 포함된 키가드 화면이 표시됩니다. 키가드 화면이 아래 표시되어 있습니다.

키가드 화면

그림 1. 키가드 화면

바운서가 있는 잠금 화면은 아래와 같이 사용자가 기기 잠금을 해제할 개인정보 보호 유형을 선택한 경우 표시됩니다.

잠금 화면

그림 2. 잠금 화면.

전원 켜기 또는 끄기를 수동으로 전환하도록 잠금이 설정된 경우에는 다음 안내를 사용합니다.

adb shell input keyevent 26

사용자 선택도구

사용자 선택 도구 화면은 자동차의 시스템 UI 상태 표시줄과 지도에 필수적인 기기가 재부팅된 경우 표시됩니다. 자세히 알아보려면 FullscreenUserSwitcher를 참고하세요.

로드 중 화면

그림 3. 로드 중 화면

이 화면의 레이아웃은 car_fullscreen_user_switcher.xml에서 맞춤설정할 수 있습니다.

로드 중 화면

진입점에 상관없이 사용자가 전환될 때마다 로드 중 화면이 표시됩니다. 사용자 선택도구 또는 설정 화면을 예로 들 수 있습니다. 로드 중 화면은 프레임워크 시스템 UI의 필수 요소이며 CarUserSwitchingDialog라는 공개 클래스에 매핑됩니다. 예시는 위의 그림 3을 참조하세요.

테마는 Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog에서 맞춤설정할 수 있습니다.

Android 사용자를 설정하려면 운전자가 초기 설정 마법사 흐름을 통해 사용자 이름을 직접 설정할 수 있습니다. 운전자가 Android 사용자를 Google 계정과 연결하면 이 계정에서 사용자 이름이 선택됩니다. 그러나 운전자가 DriverB와 같은 이름을 지정한 다음, 나중에 이름이 Maddy인 Google 계정에 사용자 이름을 연결하면 원래 할당된 이름(DriverB)은 명시적으로 설정되었으므로 변경되지 않습니다. 운전자는 설정 메뉴에서만 이름을 변경할 수 있습니다.

레이아웃은 car_user_switching_dialog.xml.에서 맞춤설정할 수 있습니다.

OEM은 NoActionBar.Fullscreen이라는 테마를 사용하여 상태 및 탐색 메뉴를 숨길 수 있습니다. 이는 자동차 참조 UI용으로 업데이트된 원래 시스템 UI입니다. 자세한 내용은 맞춤설정을 참조하세요.

OEM은 사용자 전환을 위한 사용자 인터페이스 진입점을 제공할 수 있지만 때로는 결과가 바람직하지 않을 수 있습니다. 이 상황이 발생하는 경우:

  1. OEM은 맞춤 로드 중 화면(또는 대화상자)을 만들고 표시합니다.
    • UX에 따라 OEM은 사용자가 전환할 수단을 선택할 때 맞춤 로드 중 화면을 시작하며 이 화면은 사용자 전환이 완료될 때 숨길 수 있습니다.
    • OEM은 환경설정에 따라 우선순위 창을 설정해야 합니다. 우선순위가 더 높은 창 유형을 예로 들 수 있습니다. 우선순위 우선순위는 키가드의 우선순위를 초과할 수 없습니다.
  2. OEM은 config_customuserswitchui의 설명대로 핵심 프레임워크 config.xml에서 config_customUserSwitchUi=true를 설정합니다. 따라서 프레임워크는 CarUserSwitchingDialog를 표시하지 않습니다.

잠금 화면 맞춤설정

잠금 화면은 OEM이 맞춤설정할 수 있는 시스템 UI의 필수 부분입니다. 흐름을 맞춤설정하려면 frameworks/base/packages/CarSystemUI/로 시작합니다.

최초 사용자 설정 맞춤설정

설정 마법사는 최초 사용자 설정을 실행합니다. 이 작업도 맞춤설정할 수 있습니다. UserManager API를 사용하여 사용자를 만들 수 있습니다. 경우에 따라 이 작업을 백그라운드에서 구현할 수 있으므로 설정 마법사 프로세스가 간소해집니다.