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 기기에 배포하도록 선택하면 호환되는 앱은 자동차에서 사용하기에 안전한지 확인하기 위해 수동 검토 절차를 거칩니다. 자세한 내용은 자동차에 배포를 참고하세요.
Android Automotive OS 필수 기능
자동차의 Play 스토어에 등록되려면 Android Automotive OS용으로 빌드된 앱의 android.hardware.type.automotive
기능에 관한 AndroidManifest.xml
파일에 <uses-feature>
요소를 포함해야 합니다.
<manifest ...> ... <!-- Depending on the track you choose to distribute your app, the android:required attribute can also be "false" or left unset. See Choose a track for Android Automotive OS. --> <uses-feature android:name="android.hardware.type.automotive" android:required="[true|false]" /> ... </manifest>
이전 코드 샘플에 표시된 요소 외에도 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를 호출해도 아무런 변화가 일어나지 않습니다. 앱이 인셋을 수정할 수 있는지 감지하는 방법에 관한 자세한 내용은 show
및 hide
문서를 참고하세요.
마찬가지로, 시스템 표시줄과 표시줄에 포함된 요소가 항상 명확히 표시되도록, 앱이 시스템 표시줄의 색상과 반투명도를 설정할 수 있는지 여부도 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: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
리소스 세트에 더 큰 값을 사용하여 터치 영역의 크기를 키울 수 있습니다.
앱 배포
관련 카테고리의 자동차 앱 품질 가이드라인에 따라 앱을 테스트한 후 Google Play를 사용하여 Google이 내장된 자동차에 배포할 수 있습니다. 게시 절차에 관한 자세한 내용은 자동차에 배포를 참고하세요.
주차 앱에 대한 의견 보내기
Android Automotive OS용 주차 앱을 개발하는 중에 문제가 발생하거나 기능 요청이 있다면 Google Issue Tracker를 사용하여 신고할 수 있습니다. 문제 템플릿에 요청된 모든 정보를 작성해야 합니다. 새로운 문제를 신고하기 전에 해당 문제가 문제 목록에 이미 신고되어 있는지 확인하세요. Tracker에서 문제에 있는 별표를 클릭하여 문제를 구독하고 투표할 수 있습니다. 자세한 내용은 문제 구독을 참고하세요.