テンプレート アプリに 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 依存関係を更新する

Android Studio Bumblebee 以降を使用して、Automotive OS のすべての機能を有効にします。

自動車モジュールを作成する

Android Automotive OS の一部のコンポーネント(マニフェストなど)では、プラットフォーム固有の要件が適用されます。そのようなコンポーネント用のコードを、プロジェクト内の他のコード(スマートフォン アプリに使用するコードなど)から分離できるように、モジュールを作成します。

既存のプロジェクトの場合は、次の手順で自動車モジュールをプロジェクトに追加します。

  1. Android Studio で、[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 Studio で、[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 Studio 内でモジュールを作成したら、新しい自動車モジュール内で 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 要素は標準的なアプリ情報を格納し、uses-feature 要素は Android Automotive OS のサポートを宣言しています。この段階では、マニフェスト内で宣言されているアクティビティはありません。

次に、以下の 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 要素は、アプリの実行にテンプレート ホストが使用されることを宣言しています。残りの 4 つの uses-feature 要素を required="false" と設定することで、Android Automotive OS デバイスで使用可能なハードウェア機能とアプリが競合しないようにします。

Gradle 依存関係を更新する

自動車モジュール内で、androidx.car.app:app-automotive アーティファクトへの依存関係を追加する必要があります。このアーティファクトには、Android Automotive OS でアプリを実行するために必要な CarAppActivity の実装が含まれています。

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 をレンダリングします。マニフェストにはこのアクティビティのインスタンスを 1 つだけ含め、次のように宣言する必要があります。

<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:name は、app-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)を配布する際、モバイルアプリのパッケージ名を再利用することも、新しいパッケージ名を作成することもできます。異なるパッケージ名を使用した場合、2 つの別個の Play ストアの掲載情報が使用されます。現在のパッケージ名を再利用した場合、両方のプラットフォームで 1 つの掲載情報が共有されます。

どちらを選択するかは、主にビジネス上の判断となります。たとえば、あるチームがモバイルアプリを担当し、別のチームが Android Automotive OS アプリを担当している場合、パッケージ名を別々にして、各チームがそれぞれの Play ストアの掲載情報を管理するのが合理的です。どちらの方法を使用する場合でも、必要とされる技術的作業に大きな違いはありません。

現在のパッケージ名を維持する場合と新しいパッケージ名を使用する場合のその他の主な違いについて、次の表にまとめます。

機能 同じパッケージ名 新しいパッケージ名
ストアの掲載情報 単一 複数
インストールのミラーリング 可: セットアップ ウィザードでアプリの高速再インストールを実行します。 不可
Play ストアの審査プロセス 審査のブロック: ある APK が審査に不合格となった場合、同じリリースで送信された他の APK もブロックされます。 個別審査
統計情報と各種指標 統合: 自動車固有のデータについては、デバイス名でフィルタできます。 個別
インデックス登録と検索ランキング 現在の状態を基に作成されます。 状態は引き継がれません。
他のアプリとの統合 両方の APK 間でメディアコードが共有されていれば、ほとんどの場合で変更は不要です。 Google アシスタントでの URI 再生など、対応するアプリの更新が必要になる場合があります。

オフライン コンテンツ

必要に応じて、アプリにオフライン サポートを実装してください。Android Automotive OS を搭載した自動車は、独自のデータ接続を備えていることが想定されます。つまり、データプランは車両の代金に含まれるか、ユーザーが支払いを行います。一方で、車内での接続はモバイル デバイスに比べて不安定であることも考慮する必要があります。

オフライン サポート戦略を立てる際に留意すべき点がいくつかあります。

  • コンテンツをダウンロードする最適なタイミングは、アプリを使用しているときです。
  • Wi-Fi が利用できるとは限りません。車が Wi-Fi の通信範囲に入らない場合や、相手先ブランド製品製造企業(OEM)がモバイル ネットワークを優先して Wi-Fi を無効にしている場合もあります。
  • ユーザーが使用すると想定されるコンテンツをキャッシュしてもかまいませんが、この動作を変更できるようにすることをおすすめします。
  • 車によってディスク容量は異なるため、ユーザーがオフライン コンテンツを削除できるようにしてください。

よくある質問

Android Automotive OS に関するよくある質問とその回答については、次のセクションをご覧ください。

サードパーティの SDK やライブラリの使用に関して制限事項や推奨事項はありますか?

サードパーティの SDK やライブラリの使用については特別なガイドラインはありません。サードパーティの SDK やライブラリを使用する場合でも、自動車向けアプリの品質に関するすべての要件を遵守する必要があります。

Google Play Console を使用して Android Automotive OS アプリを公開するにはどうすればよいですか?

アプリの公開プロセスはスマートフォン アプリの公開と似ていますが、別のフォーム ファクタを使用します。Android Automotive OS リリースタイプを使用するようにアプリをオプトインするには、次の手順に従います。

  1. Play Console を開きます。
  2. アプリを選択します。
  3. 左側のメニューで、[リリース] > [設定] > [詳細設定] > [フォーム ファクタ] を選択します。
  4. [フォーム ファクタを追加] > [Android Automotive OS] を選択し、Google Play Console の指示に沿って操作します。

トラブルシューティング

Android Automotive OS の一般的なトラブルシューティングのシナリオについては、以下のセクションをご覧ください。

  • システム設定から自動車向けアプリ ライブラリ アプリをアンインストールしても、新しいバージョンをインストールしようとするとエラーが発生します。

    アプリを確実にアンインストールするために、adb uninstall app.package.name コマンドを使用してください。