Ajouter la prise en charge d'Android Automotive OS à votre application conçue à partir d'un modèle

Android Automotive OS permet aux utilisateurs d'installer des applications dans leur voiture. Pour atteindre les utilisateurs de cette plate-forme, vous devez proposer une application optimisée pour la conduite et compatible avec Android Automotive OS. Vous pouvez réutiliser la quasi-totalité du code et des ressources de votre application Android Auto, mais vous devrez créer un build distinct qui répond aux exigences décrites sur cette page.

Pour exécuter votre application automobile sur Android Automotive OS, vous devez disposer de la dernière version de l'hôte de modèles, qui est disponible en tant qu'application système.

Présentation du développement

La prise en charge d'Android Automotive OS ne nécessite que quelques étapes, comme décrit dans les sections de cette page :

  1. Créer un module automobile
  2. Déclarer la prise en charge d'Android Automotive OS
  3. Déclarer vos CarAppService et CarAppActivity
  4. Mettre à jour vos dépendances Gradle

Utilisez Android Studio Bumblebee ou une version ultérieure pour vous assurer que toutes les fonctionnalités d'Automotive OS sont activées.

Créer un module automobile

Certains composants d'Android Automotive OS, tels que le fichier manifeste, ont des exigences spécifiques à la plate-forme. Créez un module capable de séparer le code de ces composants des autres codes de votre projet, tels que celui utilisé pour votre application pour téléphone.

Pour ajouter un module automobile à un projet existant, procédez comme suit :

  1. Dans Android Studio, cliquez sur File > New > New Module (Fichier > Nouveau > Nouveau module).
  2. Sélectionnez Automotive Module (Module automobile), puis cliquez sur Next (Suivant).
  3. Indiquez un nom d'application/de bibliothèque dans Application/Library name. Il s'agit du nom que les utilisateurs voient pour votre application sur Android Automotive OS.
  4. Indiquez un nom de module dans Module name.
  5. Modifiez le nom du package pour qu'il corresponde à votre application existante.
  6. Sélectionnez API 29 : Android 10 (Q) pour le Minimum SDK, puis cliquez sur Next (Suivant). Toutes les voitures compatibles avec la bibliothèque d'applications pour voitures sur Android Automotive OS s'exécutent sur Android version 10 (niveau 29 d'API) ou ultérieure. La sélection de cette valeur cible donc toutes les voitures compatibles.

  7. Sélectionnez Add No Activity (N'ajouter aucune activité), puis cliquez sur Finish (Terminer).

Si vous démarrez un nouveau projet :

  1. Dans Android Studio, cliquez sur File > New > New Project (Fichier > Nouveau > Nouveau projet).
  2. Dans Project Type (Type de projet), sélectionnez Automotive (Automobile).
  3. Sélectionnez No Activity (Aucune activité), puis cliquez sur Next (Suivant).
  4. Attribuez un Name (Nom) à votre projet. Il s'agit du nom que les utilisateurs voient pour votre application sur Android Automotive OS.
  5. Saisissez un nom de package. Consultez la section Noms des packages pour en savoir plus sur la sélection d'un nom de package.
  6. Sélectionnez API 29 : Android 10 (Q) pour le Minimum SDK, puis cliquez sur Next (Suivant).

    Toutes les voitures compatibles avec la bibliothèque d'applications pour voitures sur Android Automotive OS s'exécutent sur Android version 10 (niveau 29 d'API) ou ultérieure. La sélection de cette valeur cible donc toutes les voitures compatibles.

Après avoir créé votre module dans Android Studio, ouvrez le fichier AndroidManifest.xml dans le nouveau module automobile :

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

L'élément application contient des informations sur l'application standard, ainsi qu'un élément uses-feature qui déclare la prise en charge d'Android Automotive OS. Notez qu'aucune activité n'a été déclarée dans le fichier manifeste.

Ajoutez ensuite les éléments uses-feature suivants à votre fichier manifeste :

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

Le premier élément uses-feature déclare que votre application utilise l'hôte de modèles pour s'exécuter. En définissant de manière explicite les quatre autres éléments uses-feature sur required="false", vous vous assurez que votre application n'entre pas en conflit avec les fonctionnalités matérielles disponibles sur les appareils Android Automotive OS.

Mettre à jour vos dépendances Gradle

Dans votre module automobile, vous devez ajouter une dépendance à l'artefact androidx.car.app:app-automotive, qui inclut l'implémentation CarAppActivity requise pour que votre application s'exécute sur Android Automotive OS.

Si vous développez votre application pour qu'elle soit compatible avec Android Auto et Android Automotive OS, nous vous recommandons de conserver votre CarAppService dans un module distinct que vous partagerez entre vos modules mobiles et automobiles. Si vous utilisez cette approche, vous devez mettre à jour votre module automobile pour l'inclure à l'aide des dépendances du projet Gradle, comme indiqué dans l'extrait de code suivant:

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"))
    }
}

Déclarer la prise en charge d'Android Automotive OS

Utilisez l'entrée de fichier manifeste suivante pour déclarer que votre application prend en charge Android Automotive OS :

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

Cette entrée du fichier manifeste fait référence à un fichier XML qui déclare les fonctionnalités automobiles prises en charge par votre application.

Pour indiquer que vous disposez d'une application Car App Library, ajoutez un fichier XML nommé automotive_app_desc.xml au répertoire res/xml/ de votre module Android Automotive OS. Ce fichier doit inclure le contenu suivant :

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

Déclarer vos CarAppService et CarAppActivity

Comme avec Android Auto, Android Automotive OS utilise votre implémentation CarAppService pour exécuter votre application. Consultez les sections Créer votre CarAppService et Session et Déclarer votre CarAppService pour savoir comment implémenter et déclarer votre CarAppService.

Contrairement à Android Auto, vous devez inclure un composant d'application supplémentaire, CarAppActivity, qui servira de point d'entrée pour votre application Android Automotive OS. L'implémentation de cette activité est incluse dans l'artefact androidx.car.app:app-automotive et permet de communiquer avec le modèle d'application hôte pour afficher l'UI de votre application. Vous ne devez avoir qu'une seule instance de cette activité dans votre fichier manifeste. Elle doit être déclarée comme suit :

<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 est défini sur le nom complet de la classe CarAppActivity de l'artefact app-automotive.
  • android:exported est défini sur true, car l'activité doit pouvoir être lancée par une autre application (à savoir, le lanceur d'applications).
  • android:launchMode est défini sur singleTask afin que l'utilisateur puisse revenir à la même instance de l'activité à partir du lanceur d'applications s'il quitte la page.
  • android:theme est défini sur @android:style/Theme.DeviceDefault.NoActionBar pour que l'application occupe tout l'espace en plein écran disponible.
  • Le filtre d'intent indique qu'il s'agit de l'activité du lanceur d'applications pour l'application.
  • Un élément <meta-data> indique à l'OS que l'application peut être utilisée lorsque des restrictions de l'expérience utilisateur sont en place, par exemple lorsque le véhicule est en mouvement.

Pour les applications de navigation, quelques autres entrées de fichier manifeste sont requises pour CarAppActivity, comme illustré dans l'extrait suivant :

<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>
  • La catégorie supplémentaire android.intent.category.APP_MAPS indique au système que votre application est en mesure d'afficher la position de l'utilisateur.
  • Le filtre d'intent androidx.car.app.action.NAVIGATE garantit que les utilisateurs ont la possibilité d'utiliser votre application lorsqu'ils gèrent un intent de navigation implicite à partir d'une autre application pour voitures.

Autres points à prendre en compte

Gardez à l'esprit les points suivants lorsque vous développez votre application Android Automotive OS :

Noms des packages

Étant donné que vous distribuez un APK (Android Package Kit) distinct pour Android Automotive OS, vous pouvez réutiliser le nom du package depuis votre application mobile ou en créer un autre. Si vous utilisez un nom de package différent, votre application possède deux fiches Play Store distinctes. Si vous réutilisez le nom de votre package actuel, votre application possède une seule fiche sur les deux plates-formes.

C'est avant tout une décision opérationnelle. Par exemple, si une équipe travaille sur l'application mobile et une autre sur l'application Android Automotive OS, il peut être judicieux d'avoir des noms de package distincts et de laisser chaque équipe gérer sa propre fiche Play Store. Quelle que soit votre approche, les efforts techniques sont relativement similaires.

Le tableau suivant récapitule quelques-unes des autres différences clés entre la conservation du nom de package actuel ou l'utilisation d'un nouveau nom :

Fonctionnalité Nom de package identique Nouveau nom de package
Fiche Play Store Une seule Plusieurs
Installation en miroir Oui : réinstallation rapide de l'application dans l'assistant de configuration Non
Processus d'examen du Play Store Blocage des examens : si l'examen échoue pour un APK, les autres APK envoyés dans la même version sont bloqués Examens individuels
Statistiques, métriques et indicateurs clés Combinés : vous pouvez filtrer par nom d'appareil pour obtenir des données automobiles. Séparés
Référencement et classement dans les résultats de recherche Basé sur la position actuelle Pas de report
Intégration à d'autres applications Il est très probable qu'aucune modification ne soit nécessaire si le code média est partagé entre les deux APK. Vous devrez peut-être mettre à jour l'application correspondante (par exemple, pour la lecture de l'URI avec l'Assistant Google).

Contenu hors connexion

Le cas échéant, activez le mode hors connexion dans votre application. Les voitures avec Android Automotive OS doivent disposer de leur propre connexion de données, c'est-à-dire un forfait Internet soit inclus dans le coût du véhicule, soit payé par l'utilisateur. Toutefois, la connectivité des voitures devrait être plus variable que celle des appareils mobiles.

Quelques points à garder en tête si vous envisagez d'utiliser le mode hors connexion :

  • Le meilleur moment pour télécharger du contenu est lorsque votre application est utilisée.
  • Ne partez pas du principe que le Wi-Fi est disponible. Il se peut qu'une voiture ne soit jamais à portée d'un réseau Wi-Fi ou que fabricant d'équipement d'origine (OEM) ait désactivé le réseau Wi-Fi au profit d'un réseau mobile.
  • Bien qu'il soit acceptable de mettre en cache intelligemment le contenu que les utilisateurs pourraient utiliser, nous vous recommandons de leur donner la possibilité de modifier ce comportement.
  • L'espace disque des voitures peut varier. Vous devez donc permettre aux utilisateurs de supprimer le contenu hors connexion.

Questions fréquentes

Consultez les sections suivantes pour obtenir des réponses aux questions fréquentes concernant Android Automotive OS.

Existe-t-il des restrictions ou des recommandations concernant l'utilisation de bibliothèques et de SDK tiers ?

Il n'existe aucune consigne spécifique concernant l'utilisation de bibliothèques et de SDK tiers. Si vous choisissez d'utiliser des bibliothèques et des SDK tiers, vous devez toujours respecter toutes les exigences de qualité des applications de voiture.

Comment publier mon application Android Automotive OS à l'aide de la Google Play Console ?

Le processus de publication de l'application est semblable à celui utilisé pour publier votre application pour téléphone, mais vous vous servirez d'un facteur de forme différent. Pour autoriser votre application à utiliser le type de version d'Android Automotive OS, procédez comme suit :

  1. Ouvrez la Play Console.
  2. Sélectionnez votre application.
  3. Dans le menu de gauche, sélectionnez Release > Setup > Advanced settings > Form factors (Version > Configuration > Paramètres avancés > Facteurs de forme).
  4. Sélectionnez Add form factor > Android Automotive OS (Ajouter un facteur de forme > Android Automotive OS), puis suivez les instructions dans la Play Console.

Dépannage

Consultez les sections suivantes pour obtenir des conseils de dépannage pour Android Automotive OS.

  • Même après avoir désinstallé une application de la bibliothèque Car App à partir des paramètres système, un message d'erreur s'affiche lorsque j'essaie d'installer une nouvelle version.

    Pour vous assurer que l'application est désinstallée, utilisez la commande adb uninstall app.package.name.