Android Automotive OS용 주차 앱 빌드

Android Automotive OS는 운전 중에 사용할 수 있도록 빌드된 앱을 지원할 뿐만 아니라 주차되어 있는 동안 사용할 수 있는 브라우저게임, 동영상 앱도 지원합니다. 약간의 변경사항만으로 다른 대형 화면 기기에 제공하는 앱과 동일한 앱을 자동차에 제공할 수 있습니다.

Android Automotive OS 에뮬레이터에서 기존 앱 테스트

Android Automotive OS용 앱 빌드를 시작하려면 먼저 Android Automotive OS 에뮬레이터에서 기존 앱을 테스트해야 합니다. 에뮬레이터를 설정하려면 Android Automotive OS 에뮬레이터를 사용하여 테스트 페이지의 단계를 따르세요. 그런 다음 에뮬레이터에서 앱 실행 안내에 따라 앱을 실행하면 됩니다.

앱을 실행할 때 다음과 같은 호환성 문제가 있는지 확인해야 합니다.

  • 인포테인먼트 화면은 방향이 고정되어 있습니다. 자동차 앱 품질 가이드라인을 충족하려면 앱이 세로 모드 방향과 가로 모드 방향을 모두 지원해야 합니다.
  • 다른 기기에서 사용할 수 있는 API도 Android Automotive OS에서는 사용하지 못할 수 있습니다. 예를 들어 일부 Google Play 서비스 API는 Android Automotive OS에서 사용할 수 없습니다. 이러한 문제를 해결하는 방법에 관한 자세한 내용은 기능 사용 중지 섹션을 참고하세요.

앱의 매니페스트 파일 구성

Android Automotive OS를 타겟팅하려면 앱에 특정 매니페스트 항목이 있어야 합니다. 이러한 항목을 사용하여 Android Automotive OS를 타겟팅하는 앱은 별도의 Automotive OS 출시 유형으로 Play 스토어에 제출되며, 자동차에서 사용하기에 안전한지 확인하기 위해 수동 검토 절차를 거칩니다. 자세한 내용은 자동차용 Android 앱 배포를 참고하세요.

Android Automotive OS 필수 기능

자동차의 Play 스토어에 등록되려면 Android Automotive OS용으로 빌드된 앱의 AndroidManifest.xml 파일에 다음 <uses-feature> 요소를 포함해야 합니다.

<manifest ...>
    ...
    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />
    ...
</manifest>

자동차가 아닌 트랙에 제출된 앱은 자동차 관련 하드웨어에 종속될 수 없으므로 이전 코드 샘플에 표시된 <uses-feature> 요소를 선언할 수 없습니다. 따라서 자동차 기기와 자동차가 아닌 기기 모두에 동일한 앱을 출시하려면 적어도 두 가지 버전의 앱을 생성해야 합니다. 하나는 자동차 기기용이고 다른 하나는 휴대기기용입니다. 이처럼 서로 다른 버전을 만드는 방법을 자세히 알아보려면 다음 문서를 참고하세요.

앱의 두 버전은 동일한 패키지 이름을 공유할 수 있지만, Play 스토어 트랙에 각각 업로드되므로 다른 버전 코드를 사용해야 합니다.

또는 서로 다른 버전을 사용하는 대신 모바일과 자동차 APK에 서로 다른 패키지 이름을 사용하거나 App Bundle을 사용하면 됩니다. 각 방법의 장단점을 알아보려면 미디어 앱 개발자 가이드의 패키지 이름을 참고하세요.

이전 코드 샘플에 표시된 요소 외에도 Android Automotive OS용으로 빌드된 앱은 루트 <manifest> 요소에 다음과 같이 <uses-feature> 요소를 포함해야 합니다.

<uses-feature
  android:name="android.hardware.wifi"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.portrait"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.landscape"
  android:required="false"/>

이러한 기능을 필수가 아닌 것으로 명시적으로 설정하면 앱이 Android Automotive OS 기기에서 사용할 수 있는 하드웨어 기능과 충돌하지 않습니다.

주의 분산 행동 최적화 활동이 없는지 확인

주차 시에만 앱을 사용할 수 있도록 하려면 매니페스트 내에서 <activity> 요소에 다음 <meta-data> 요소를 포함하지 마세요.

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

이 메타데이터가 없으면 운전자의 주의가 분산되는 것을 줄이기 위해 자동차가 운전 모드로 전환될 때 OS에서 앱의 활동을 자동으로 차단합니다. 이 작업은 onPause 수명 주기 콜백으로 발생하며 이 기간에는 앱에서 동영상 및 오디오 재생을 모두 일시중지해야 합니다.

Android Automotive OS에서 앱 최적화

사용자에게 최상의 환경을 제공하려면 Android Automotive OS용 앱을 빌드할 때 다음 사항에 유의하세요.

대형 화면에 최적화

Android Automotive OS 차량에 있는 화면은 스마트폰보다는 태블릿과 폴더블의 크기, 해상도, 가로세로 비율과 더 유사합니다. 따라서 대형 화면에 맞게 앱을 최적화하면 자동차 운전자에게도 도움이 됩니다.

특히 대형 디스플레이 크기를 최대한 활용하는 방법에 관한 자세한 내용은 다양한 화면 크기 지원반응형 레이아웃으로 UI 이전 가이드를 참고하고 디자인 아이디어와 안내는 미디어게임 갤러리를 참고하세요.

입력 호환성과 같은 다른 대형 화면 최적화는 Android Automotive OS에 직접적인 도움이 되지 않지만 사용자 환경은 개선될 수 있습니다. 예를 들어 키보드 탐색은 로터리 탐색과 동일한 API를 사용하므로 키보드 탐색에서 최적화하면 두 폼 팩터에 모두 유용할 수 있습니다.

창 인셋 및 디스플레이 컷아웃 사용

다른 폼 팩터와 마찬가지로 Android Automotive OS에는 상태 및 탐색 메뉴와 같은 시스템 UI 요소와 직사각형이 아닌 디스플레이 지원이 포함되어 있습니다.

기본적으로 앱은 시스템 표시줄이나 디스플레이 컷아웃과 겹치지 않는 영역에 그립니다. 그러나 창 인셋 내에 앱 배치에 설명된 대로 앱이 시스템 표시줄을 숨기거나 시스템 표시줄 뒤에 콘텐츠를 그리거나 디스플레이 컷아웃에 콘텐츠를 표시하도록 할 수 있습니다. 앱에서 이러한 작업을 하는 경우 다음 하위 섹션에서 앱이 Android Automotive OS 기기 생태계에서 원활하게 작동하도록 하는 방법을 자세히 알아보세요.

시스템 표시줄, 몰입형 모드, 더 넓은 화면 렌더링

자동차의 시스템 표시줄은 다른 폼 팩터와 다르게 크기와 위치가 지정될 수 있습니다. 예를 들어 탐색 메뉴는 화면 왼쪽, 오른쪽 또는 하단에 위치할 수 있습니다. 대부분의 휴대전화와 태블릿처럼 상단에 상태 표시줄이 있고 하단에 탐색 메뉴가 있는 경우에도 자동차에서 이러한 요소의 크기가 훨씬 더 클 수 있습니다.

또한 Android Automotive OS에서는 OEM이 앱이 몰입형 모드에 들어가거나 종료하기 위해 시스템 표시줄을 표시하거나 숨길 수 있는지를 제어할 수 있습니다. 예를 들어 OEM은 앱이 시스템 표시줄을 숨기지 못하도록 하여 실내 온도 조절기와 같은 차량 컨트롤에 항상 화면에서 액세스할 수 있도록 할 수 있습니다. OEM에서 앱이 시스템 표시줄을 제어하지 못하게 한 경우 앱이 WindowInsetsController (또는 WindowInsetsControllerCompat) API를 호출하여 시스템 표시줄을 표시하거나 숨기면 아무 일도 일어나지 않습니다. 앱이 인셋을 수정할 수 있었는지 감지하는 방법에 관한 자세한 내용은 showhide 문서를 참고하세요.

마찬가지로 OEM은 앱이 시스템 표시줄의 색상과 반투명도를 설정하여 막대와 그 안에 포함된 요소가 항상 명확하게 표시되도록 할 수 있는지 제어할 수 있습니다. 앱이 더 넓은 화면을 그리는 경우 중요하지 않은 콘텐츠만 시스템 표시줄 뒤에 그려지는지 확인합니다. 기기 OEM에서 막대의 색상이나 반투명도를 설정하지 않으면 이 콘텐츠가 표시되지 않을 수도 있습니다.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

앱이 더 넓은 화면으로 이동하는 경우 시스템 표시줄의 크기나 개수, 유형 또는 위치를 가정하지 마세요. 대신 창 인셋 API를 사용하여 시스템 표시줄을 기준으로 앱의 콘텐츠를 배치합니다. 이러한 API를 사용하는 방법에 관한 자세한 내용은 앱에서 더 넓은 화면에 콘텐츠 표시를 참고하세요. 권장하지는 않지만 콘텐츠를 다른 기기의 안전 영역에 유지할 수 있는 하드 코딩된 패딩 값(자동차에서는 찾아볼 수 없음)

불규칙한 모양의 디스플레이에 맞게 조정

일부 차량에는 직사각형 디스플레이 외에도 그림 1과 같이 불규칙한 모양의 화면이 있을 수 있습니다.

오른쪽에 곡선형 디스플레이가 있는 Android Automotive OS 기기의 다이어그램
그림 1: 오른쪽에 곡선형 디스플레이가 있는 Android Automotive OS 기기 녹색 영역은 곡선 디스플레이 컷아웃의 경계 상자와 겹치지 않는 안전한 직사각형입니다.

앱이 더 넓은 화면으로 렌더링되지 않으면 안전 영역 내에서 렌더링하기 위해 아무것도 할 필요가 없습니다.

앱이 더 넓은 화면으로 렌더링되는 경우 디스플레이 컷아웃과 관련하여 앱이 동작하는 방식을 선택할 수 있습니다. 앱의 테마android:windowLayoutInDisplayCutoutMode 속성을 설정하거나 런타임에 창의 layoutInDisplayCutoutMode 속성을 수정하여 리소스를 사용하면 됩니다.

Android Automotive OS 기기에 있는 디스플레이 컷아웃 유형은 휴대기기의 디스플레이 컷아웃 유형과 다르므로 휴대기기에서 볼 수 있는 컷아웃에 최적화된 동작이 있는 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 또는 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES를 사용하지 마세요. 대신 LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 또는 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS를 사용하여 항상 컷아웃을 피하거나 항상 컷아웃에 들어가세요. 후자를 선택하는 경우 디스플레이 컷아웃과 관련된 API에 관한 자세한 내용은 디스플레이 컷아웃 지원을 참고하세요.

앱이 디스플레이 컷아웃 영역으로 렌더링되고 Android Automotive OS와 모바일 간에 다른 동작을 적용하려면 앱이 런타임에 이 동작을 설정하는 경우 기능 사용 중지를 참고하고, 앱에서 리소스 파일을 사용하여 이 동작을 설정하는 경우에는 대체 리소스 사용을 참고하세요.

기능 사용 중지

기존 모바일 앱을 Android Automotive OS에서 사용 가능하도록 만들 때 일부 기능은 관련이 없거나 사용할 수 없을 수도 있습니다. 예를 들어 자동차는 일반적으로 카메라 액세스를 제공하지 않습니다. 또한 Android Automotive OS에서는 Google Play 서비스 중 일부만 사용할 수 있습니다. 자세한 내용은 자동차용 Google Play 서비스를 참고하세요.

FEATURE_AUTOMOTIVE 기능을 확인하여 Android Automotive OS에서 앱이 실행되는지 감지하려면 다음 예에서 보는 바와 같이 PackageManager.hasSystemFeature API를 사용하면 됩니다.

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

또는 앱에 Android Auto 구성요소도 있다면 자동차용 Android 앱 라이브러리CarConnection API를 사용하여 앱이 Android Automotive OS나 Android Auto에서 실행 중인지 또는 자동차에 전혀 연결되어 있지 않은지 확인할 수 있습니다.

PIP 모드의 경우 설정된 권장사항에 따라 기능을 사용할 수 있는지 확인하고 적절하게 대응합니다.

오프라인 시나리오 처리

자동차의 인터넷 연결이 증가하고 있지만 앱은 다음과 같은 경우 인터넷 연결 없이 실행을 처리하는 것이 좋습니다.

  • 사용자는 자동차 제조업체에서 구독 패키지의 일부로 제공하는 모바일 데이터를 선택 해제할 수 있습니다.
  • 특정 지역에서는 모바일 데이터에 대한 액세스가 제한될 수 있습니다.
  • Wi-Fi 무선 기능이 있는 자동차가 Wi-Fi 범위를 벗어나거나 OEM에서 모바일 네트워크를 위해 Wi-Fi를 사용 중지할 수도 있습니다.

인터넷 액세스에 의존하는 기능의 성능을 단계적으로 저하하여 앱에서 이러한 시나리오를 처리할 수 있도록 준비해야 합니다(예: 오프라인 콘텐츠 제공). 자세한 내용은 네트워킹 최적화를 위한 권장사항을 참고하세요.

대체 리소스 사용

자동차에 맞게 앱을 조정하려면 Android Automotive OS 차량에서 실행할 때 대체 리소스를 제공하는 car 리소스 한정자를 사용하면 됩니다. 예를 들어 크기 리소스를 사용하여 패딩 값을 저장한다면 car 리소스 세트에 더 큰 값을 사용하여 터치 영역의 크기를 키울 수 있습니다.

앱 배포

관련 카테고리의 자동차 앱 품질 가이드라인에 따라 앱을 테스트하고 카테고리에 필요한 변경사항을 적용하여 Android Automotive OS 빌드를 만든 후에는 Play 스토어의 Automotive OS 폼 팩터 트랙에 게시할 수 있습니다. 게시 절차에 관한 자세한 내용은 자동차용 Android 앱 배포를 참고하세요.

주차 앱에 대한 의견 보내기

Android Automotive OS용 주차 앱을 개발하는 중에 문제가 발생하거나 기능 요청이 있다면 Google Issue Tracker를 사용하여 신고할 수 있습니다. 문제 템플릿에 요청된 모든 정보를 작성해야 합니다. 새로운 문제를 신고하기 전에 해당 문제가 문제 목록에 이미 신고되어 있는지 확인하세요. Tracker에서 문제에 있는 별표를 클릭하여 문제를 구독하고 투표할 수 있습니다. 자세한 내용은 문제 구독을 참고하세요.

새로운 문제 제출하기