アプリに 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 デバイスで使用可能なハードウェア機能とアプリが競合しないようにします。

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 Automotive OS は、CarAppService の実装と CarAppActivity の宣言を使用してアプリを起動します。CarAppService の実装と宣言の手順については、CarAppService とセッションを作成するCarAppService を宣言するをご覧ください。

Android Automotive OS では、Screen は自動車向けアプリ ライブラリに含まれている Activity にレンダリングされます。ただし、マニフェストで次の activity 要素を使用して宣言する必要があります。

<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>

Gradle 依存関係を更新する

CarAppService は、スマートフォン アプリと自動車モジュールで共有する独立したモジュール内に格納することをおすすめします。このアプローチを採用する場合は、その共有モジュールを組み込むように、自動車モジュールを更新する必要があります。次のスニペットをご覧ください。

my-automotive-os-module/build.gradle

Groovy

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

その他の注意事項

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] を選択し、Play Console の指示に沿って操作します。

トラブルシューティング

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

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

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