템플릿 앱에 Android Automotive OS 지원 추가

Android Automotive OS를 사용하면 사용자가 자동차에 앱을 설치할 수 있습니다. 이 플랫폼의 사용자에게 다가가려면 Android Automotive OS와 호환되며 운전자에 최적화된 앱을 배포해야 합니다. Android Auto 앱의 거의 모든 코드와 리소스를 재사용할 수 있지만, 이 페이지에 설명된 요구사항을 충족하는 별도의 빌드를 만들어야 합니다.

Android Automotive OS에서 자동차 앱을 실행하려면 시스템 앱으로 제공되는 최신 템플릿 호스트가 있어야 합니다.

개발 개요

Android Automotive OS 지원을 추가하려면 이 페이지의 섹션에 설명된 대로 몇 단계만 거치면 됩니다.

  1. 자동차 모듈 만들기
  2. Android Automotive OS 지원 선언
  3. CarAppServiceCarAppActivity 선언
  4. Gradle 종속 항목 업데이트

모든 Automotive OS 기능을 사용 설정하려면 Android 스튜디오 Bumblebee 이상을 사용하세요.

자동차 모듈 만들기

매니페스트와 같은 Android Automotive OS의 일부 구성요소에는 플랫폼별 요구사항이 있습니다. 이러한 구성요소의 코드를 프로젝트의 다른 코드(예: 전화 앱에 사용되는 코드)와 별도로 유지할 수 있는 모듈을 만듭니다.

기존 프로젝트의 경우 프로젝트에 자동차 모듈을 추가하려면 다음 단계를 따르세요.

  1. Android 스튜디오에서 File > New > New Module을 클릭합니다.
  2. Automotive Module을 선택하고 Next를 클릭합니다.
  3. Application/Library name을 입력합니다. 이는 Android Automotive OS에서 사용자에게 표시되는 앱의 이름입니다.
  4. Module name을 입력합니다.
  5. Package name이 기존 앱과 일치하도록 수정합니다.
  6. Minimum SDK에서 API 29: Android 10 (Q)를 선택하고 Next를 클릭합니다. Android Automotive OS에서 자동차 앱 라이브러리를 지원하는 모든 자동차는 Android 10 API 수준 29 이상에서 실행되므로 이 값을 선택하면 호환되는 모든 자동차에 적용됩니다.

  7. Add No Activity를 클릭한 다음 Finish를 클릭합니다.

새 프로젝트를 시작하는 경우 다음 단계를 따르세요.

  1. Android 스튜디오에서 File > New > New Project를 클릭합니다.
  2. Project Type에서 Automotive를 선택합니다.
  3. No Activity를 선택하고 Next를 클릭합니다.
  4. Name에서 프로젝트 이름을 지정합니다. 이는 Android Automotive OS에서 사용자에게 표시되는 앱의 이름입니다.
  5. Package name을 입력합니다. 패키지 이름 선택에 관한 자세한 내용은 패키지 이름 섹션을 참고하세요.
  6. Minimum SDK에서 API 29: Android 10 (Q)를 선택하고 Next를 클릭합니다.

    Android Automotive OS에서 자동차 앱 라이브러리를 지원하는 모든 자동차는 Android 10 API 수준 29 이상에서 실행되므로 이 값을 선택하면 호환되는 모든 자동차에 적용됩니다.

Android 스튜디오에서 모듈을 만든 후 새 자동차 모듈에서 AndroidManifest.xml 파일을 엽니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.car.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

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

</manifest>

application 요소에는 일부 표준 앱 정보와 Android Automotive OS 지원을 선언하는 uses-feature 요소가 있습니다. 매니페스트에 선언된 활동은 없습니다.

다음으로 매니페스트에 아래의 uses-feature 요소를 추가합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.car.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

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

    <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" />
    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

</manifest>

첫 번째 uses-feature 요소는 앱이 템플릿 호스트를 사용하여 실행한다고 선언합니다. 나머지 네 개 uses-feature 요소를 required="false"로 명시적으로 설정하면 앱이 Android Automotive OS 기기에서 사용할 수 있는 하드웨어 기능과 충돌하지 않습니다.

Gradle 종속 항목 업데이트

자동차 모듈 내에서 앱을 Android Automotive OS에서 실행하는 데 필요한 CarAppActivity 구현을 포함하는 androidx.car.app:app-automotive 아티팩트의 종속 항목을 추가해야 합니다.

Android Auto와 Android Automotive OS를 모두 지원하는 앱을 개발한다면 모바일 모듈과 자동차 모듈 간에 공유하는 별도의 모듈에 CarAppService를 유지하는 것이 좋습니다. 이 방법을 사용한다면 다음 스니펫과 같이 Gradle의 프로젝트 종속 항목을 사용하여 공유 모듈을 포함하도록 자동차 모듈을 업데이트해야 합니다.

Groovy

buildscript {
    ...
    dependencies {
        ...
        implementation "androidx.car.app:app-automotive:car_app_library_version"
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation("androidx.car.app:app-automotive:car_app_library_version")
        implementation(project(":shared_module_name"))
    }
}

Android Automotive OS 지원 선언

다음 매니페스트 항목을 사용하여 앱에서 Android Automotive OS를 지원한다고 선언합니다.

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

이 매니페스트 항목은 앱에서 지원하는 자동차 기능을 선언하는 XML 파일을 참조합니다.

자동차 앱 라이브러리 앱이 있음을 나타내려면 automotive_app_desc.xml이라는 XML 파일을 Android Automotive OS 모듈의 res/xml/ 디렉터리에 추가합니다. 이 파일에는 다음 내용이 포함되어야 합니다.

<automotiveApp>
    <uses name="template"/>
</automotiveApp>

CarAppService 및 CarAppActivity 선언

Android Auto와 마찬가지로 Android Automotive OS는 CarAppService 구현을 사용하여 앱을 실행합니다. CarAppService 구현 및 선언에 관한 안내는 CarAppService 및 세션 만들기CarAppService 선언을 참고하세요.

Android Auto와 달리 Android Automotive OS 앱의 진입점 역할을 하는 추가 애플리케이션 구성요소인 CarAppActivity를 포함해야 합니다. 이 활동의 구현은 androidx.car.app:app-automotive 아티팩트에 포함되며 템플릿 호스트 애플리케이션과 통신하여 앱의 UI를 렌더링합니다. 매니페스트에는 이 활동의 인스턴스가 하나만 있어야 하며 다음과 같이 선언해야 합니다.

<activity
    android:exported="true"
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
    android:name="androidx.car.app.activity.CarAppActivity"
    android:launchMode="singleTask"
    android:label="Your app name">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

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

</activity>
  • android:nameapp-automotive 아티팩트에서 CarAppActivity 클래스의 정규화된 클래스 이름으로 설정됩니다.
  • 활동은 그 자체가 아닌 앱 (즉, 런처)에서 시작할 수 있어야 하므로 android:exportedtrue로 설정됩니다.
  • 사용자가 다른 곳으로 이동하는 경우 런처에서 활동의 동일한 인스턴스로 돌아갈 수 있도록 android:launchModesingleTask로 설정됩니다.
  • android:theme@android:style/Theme.DeviceDefault.NoActionBar로 설정하여 앱이 사용할 수 있는 전체 화면 공간을 차지합니다.
  • 인텐트 필터는 이것이 앱의 런처 활동임을 나타냅니다.
  • 차량이 이동할 때와 같이 UX 제한이 있는 동안 앱을 사용할 수 있음을 OS에 나타내는 <meta-data> 요소가 있습니다.

내비게이션 앱의 경우 다음 스니펫과 같이 CarAppActivity의 필수 매니페스트 항목이 몇 가지 더 있습니다.

<activity
    android:exported="true"
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
    android:name="androidx.car.app.activity.CarAppActivity"
    android:launchMode="singleTask"
    android:label="Your app name">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!-- Include the category below ONLY for navigation apps -->
        <category android:name="android.intent.category.APP_MAPS" />
    </intent-filter>

    <!-- Include the intent-filter below ONLY for navigation apps -->
    <intent-filter>
        <action android:name="androidx.car.app.action.NAVIGATE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="geo" />
    </intent-filter>

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

</activity>
  • 추가 android.intent.category.APP_MAPS 카테고리는 앱이 사용자의 위치를 표시할 수 있음을 시스템에 알립니다.
  • androidx.car.app.action.NAVIGATE 인텐트 필터는 사용자가 다른 자동차 앱의 암시적 내비게이션 인텐트를 처리할 때 앱을 사용할 수 있도록 합니다.

기타 고려사항

Android Automotive OS 앱을 개발할 때 다음과 같은 기타 고려사항에 유의하세요.

패키지 이름

Android Automotive OS용 Android Package Kit(APK)가 별도로 배포되므로 모바일 앱의 패키지 이름을 재사용하거나 새 패키지 이름을 만들 수 있습니다. 다른 패키지 이름을 사용하면 앱은 서로 다른 두 개의 Play 스토어 등록정보를 갖게 되며, 현재 패키지 이름을 재사용하면 앱은 두 플랫폼에서 하나의 등록정보를 갖게 됩니다.

이는 주로 비즈니스를 고려해 결정하게 되는 사항입니다. 예를 들어 한 팀에서 모바일 앱을 담당하고 다른 팀에서 Android Automotive OS 앱을 담당한다면 서로 다른 패키지 이름을 만들어 각 팀에서 자체 Play 스토어 등록정보를 관리하도록 하는 것이 좋을 수 있습니다. 두 접근 방식을 사용하는 데 필요한 기술적 작업에는 큰 차이가 없습니다.

다음 표는 현재 패키지 이름을 유지하는 경우와 새 패키지 이름을 사용하는 경우의 주요 차이점을 요약하여 보여줍니다.

기능 동일한 패키지 이름 새 패키지 이름
스토어 등록정보 한 개 여러 개
미러링 설치 가능 여부 예: 설정 마법사에서 빠른 앱 재설치 아니요
Play 스토어 검토 절차 검토 차단: 하나의 APK에 관한 검토가 실패하면 동일한 버전에 제출된 다른 APK가 차단됨 개별 검토
통계, 측정항목, vitals 결합됨: 자동차 관련 데이터를 기기 이름으로 필터링할 수 있음 별도
색인 생성 및 검색 순위 현재 순위에서 빌드 이월 없음
다른 앱과 통합 두 APK 간에 미디어 코드가 공유된다고 가정하면 대부분 변경이 필요하지 않음 Google 어시스턴트로 URI를 재생하는 경우와 같이 상응하는 앱을 업데이트해야 할 수 있음

오프라인 콘텐츠

해당하는 경우 앱에서 오프라인 작동을 구현합니다. Android Automotive OS가 적용된 자동차의 경우, 자체적인 데이터 연결(데이터 요금제가 차량 비용에 포함되어 있거나 사용자가 비용을 지불하는 방식)이 가능한 한편, 휴대기기보다 연결성이 더 다양할 것으로 예상됩니다.

다음은 오프라인 작동 전략을 고려할 때 유의해야 할 사항입니다.

  • 콘텐츠를 다운로드할 가장 좋은 때는 앱을 사용하고 있는 동안입니다.
  • Wi-Fi를 사용할 수 있다고 가정하지 않습니다. 자동차가 Wi-Fi 범위로 들어오지 않거나 OEM에서 셀룰러 네트워크를 위해 Wi-Fi를 사용 중지했을 수 있습니다.
  • 사용자가 사용할 것으로 예상되는 콘텐츠를 스마트하게 캐시하는 것도 괜찮지만 사용자가 이 동작을 변경하도록 허용하는 것이 좋습니다.
  • 자동차의 디스크 공간은 다양하므로 사용자에게 오프라인 콘텐츠를 삭제하는 방법을 제공합니다.

자주 묻는 질문(FAQ)

Android Automotive OS에 관한 자주 묻는 질문(FAQ)의 답변은 다음 섹션을 참고하세요.

서드 파티 SDK 및 라이브러리 사용에 관한 제한사항이나 권장사항이 있나요?

서드 파티 SDK 및 라이브러리 사용에 관한 특정 가이드라인은 없습니다. 서드 파티 SDK 및 라이브러리를 사용하기로 한 경우에도 모든 자동차 앱 품질 요구사항을 준수해야 합니다.

Google Play Console을 사용하여 Android Automotive OS 앱을 게시하려면 어떻게 해야 하나요?

앱 게시 프로세스는 휴대전화 앱을 게시하는 것과 비슷하지만 다른 폼 팩터를 사용합니다. 앱에서 Android Automotive OS 출시 유형을 사용하도록 선택하려면 다음 단계를 따르세요.

  1. Play Console을 엽니다.
  2. 앱을 선택합니다.
  3. 왼쪽 메뉴에서 출시 > 설정 > 고급 설정 > 폼 팩터를 선택합니다.
  4. 폼 팩터 추가 > Android Automotive OS를 선택하고 Play Console의 안내를 따릅니다.

문제 해결

Android Automotive OS의 일반적인 문제 해결 시나리오에 관한 도움말은 다음을 참고하세요.

  • 시스템 설정에서 자동차 앱 라이브러리 앱을 제거한 후에도 새 버전을 설치하려고 하면 오류가 발생합니다.

    앱이 제거되었는지 확인하려면 adb uninstall app.package.name 명령어를 사용합니다.