Cómo agregar compatibilidad con el SO Android Automotive a tu app con plantilla

El SO Android Automotive permite a los usuarios instalar apps en un automóvil. Para llegar a los usuarios en esta plataforma, debes distribuir una app optimizada para conductores que sea compatible con el SO Android Automotive. Puedes volver a usar casi todo el código y los recursos de la app de Android Auto, pero debes crear una compilación independiente que cumpla con los requisitos de esta página.

Para ejecutar tu app para vehículos en el SO Android Automotive, necesitas la versión más reciente de Templates Host, que se incluye como una app del sistema.

Descripción general del desarrollo

Para agregar compatibilidad con el SO Android Automotive, solo debes seguir algunos pasos, como se describe en las secciones de esta página:

  1. Cómo crear un módulo de Automotive
  2. Cómo declarar la compatibilidad con el SO Android Automotive
  3. Declara tu CarAppService y CarAppActivity
  4. Cómo actualizar tus dependencias de Gradle

Usa Android Studio Bumblebee o versiones posteriores para asegurarte de que todas las funciones de Automotive OS estén habilitadas.

Cómo crear un módulo de Automotive

Algunos componentes del SO Android Automotive, como el manifiesto, tienen requisitos específicos de la plataforma. Crea un módulo que pueda mantener el código de esos componentes separado de otro código del proyecto, como el que se usa en la aplicación para teléfonos.

En un proyecto existente, sigue estos pasos para agregar un módulo de Automotive a tu proyecto:

  1. En Android Studio, haz clic en File > New > New Project.
  2. Selecciona Automotive Module y, luego, haz clic en Next.
  3. Proporciona la información de Application/Library name. Se trata del nombre que los usuarios ven para tu app en el SO Android Automotive.
  4. Proporciona un nombre de módulo en Module name.
  5. Ajusta el valor de Package name para que coincida con tu app.
  6. Selecciona API 29: Android 10 (Q) para el SDK mínimo y, luego, haz clic en Next. Todos los vehículos compatibles con la biblioteca de Car App en el SO Android Automotive se ejecutan en Android 10 (nivel de API 29) o versiones posteriores. Por lo tanto, si seleccionas este valor, se orientará a todos los vehículos compatibles.

  7. Selecciona Add No Activity y haz clic en Finish.

Si estás comenzando un proyecto nuevo:

  1. En Android Studio, haz clic en File > New > New Project.
  2. En Project Type, selecciona Automotive.
  3. Selecciona No Activity y, luego, haz clic en Next.
  4. Proporciona un nombre para tu proyecto en Name. Se trata del nombre que los usuarios ven para tu app en el SO Android Automotive.
  5. Ingresa un nombre de paquete. Consulta la sección Nombres de los paquetes para obtener más información sobre la selección de un nombre de paquete.
  6. Selecciona API 29: Android 10 (Q) para el SDK mínimo y, luego, haz clic en Next.

    Todos los vehículos compatibles con la biblioteca de Car App en el SO Android Automotive se ejecutan en Android 10 (nivel de API 29) o versiones posteriores. Por lo tanto, si seleccionas este valor, se orientará a todos los vehículos compatibles.

Después de crear tu módulo en Android Studio, abre el archivo AndroidManifest.xml en tu nuevo módulo de Automotive.

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

El elemento application tiene información estándar de la app y un elemento uses-feature que declara compatibilidad con el SO Android Automotive. Observa que no hay actividades declaradas en el manifiesto.

A continuación, agrega los siguientes elementos uses-feature a tu manifiesto:

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

El primer elemento uses-feature declara que tu app usa el Templates Host para ejecutarse. Configurar de forma explícita los cuatro elementos uses-feature restantes como required="false" garantiza que tu app no entre en conflicto con las funciones de hardware disponibles en dispositivos con el SO Android Automotive.

Cómo actualizar tus dependencias de Gradle

Dentro de tu módulo de Automotive, debes agregar una dependencia en el artefacto androidx.car.app:app-automotive, que incluye la implementación de CarAppActivity necesaria para que tu app se ejecute en el SO Android Automotive.

Si desarrollas tu app para que sea compatible con Android Auto y el SO Android Automotive, te recomendamos que mantengas tu CarAppService en un módulo separado compartido entre los módulos móviles y de Automotive. Si usas este enfoque, deberás actualizar tu módulo automotor para incluir el módulo compartido usando las dependencias del proyecto de Gradle, como se muestra en el siguiente fragmento:

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

Cómo declarar la compatibilidad con el SO Android Automotive

Usa la siguiente entrada del manifiesto para declarar que tu app es compatible con el SO Android Automotive:

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

Esta entrada de manifiesto hace referencia a un archivo en formato XML que declara qué capacidades de Automotive admite tu app.

Para indicar que tienes una app de la biblioteca de Car App, agrega un archivo en formato XML llamado automotive_app_desc.xml al directorio res/xml/ del módulo del SO Android Automotive. Este archivo debe incluir el siguiente contenido:

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

Cómo declarar tu CarAppService y CarAppActivity

Al igual que con Android Auto, el SO Android Automotive usa tu implementación de CarAppService para ejecutar tu app. Consulta Cómo crear tu CarAppService y Session y Cómo declarar tu CarAppService si quieres obtener instrucciones para implementar y declarar tu CarAppService.

A diferencia de Android Auto, debes incluir un componente de aplicación adicional, el CarAppActivity, para que funcione como punto de entrada de tu app del SO Android Automotive. La implementación de esta actividad se incluye en el artefacto androidx.car.app:app-automotive y es responsable de comunicarse con la aplicación host de plantillas para renderizar la IU de tu app. Solo deberías tener una instancia de esta actividad en tu manifiesto, que debe declararse de la siguiente manera:

<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 se configura como el nombre de clase completamente calificado de la clase CarAppActivity del artefacto app-automotive.
  • android:exported se establece en true, ya que una app distinta de ella (es decir, el selector) debe poder iniciar la actividad.
  • android:launchMode se configura como singleTask para que el usuario pueda volver a la misma instancia de la actividad desde el selector si sale de ella.
  • android:theme se configura como @android:style/Theme.DeviceDefault.NoActionBar para que la app ocupe todo el espacio de pantalla disponible.
  • El filtro de intents indica que esta es la actividad iniciadora de la app.
  • Existe un elemento <meta-data> que le indica al SO que la app puede usarse mientras existen restricciones de UX, como cuando el vehículo está en movimiento.

En el caso de las apps de navegación, hay algunas entradas más obligatorias del manifiesto para CarAppActivity, como se muestra en el siguiente fragmento:

<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 categoría android.intent.category.APP_MAPS adicional informa al sistema que tu app puede mostrar la ubicación del usuario.
  • El filtro de intents androidx.car.app.action.NAVIGATE garantiza que los usuarios tengan la opción de usar tu app cuando manejen un intent de navegación implícito de otra app para vehículos.

Otros factores que considerar

Ten en cuenta estas otras consideraciones cuando desarrolles tu app para el SO Android Automotive:

Nombres de los paquetes

Debido a que distribuyes un kit de paquete de Android (APK) independiente para el SO Android Automotive, puedes volver a usar el nombre del paquete de tu app para dispositivos móviles o crear uno nuevo. Si usas un nombre de paquete diferente, tu app tiene dos fichas de Play Store separadas. Si reutilizas el nombre actual de tu paquete, tu app tiene una sola ficha en ambas plataformas.

Esto es, en esencia, una decisión comercial. Por ejemplo, si tienes un equipo que trabaja en la app para dispositivos móviles y otro equipo separado que trabaja en tu app del SO Android Automotive, podría tener sentido tener nombres de paquetes independientes y permitir que cada uno administre su propia ficha de Play Store. No hay una gran diferencia en términos del esfuerzo técnico necesario para usar cualquiera de los enfoques.

En la siguiente tabla, se resumen algunas otras diferencias clave entre mantener tu nombre de paquete actual o usar uno nuevo:

Función Mismo nombre de paquete Nuevo nombre de paquete
Ficha de Play Store Individual Múltiples
Instalación duplicada Sí: "Reinstalación rápida de app" durante el asistente de configuración No
Proceso de revisión de Play Store Bloqueo de revisiones: Si la revisión falla en un APK, se bloquearán otros APKs enviados de la misma versión Revisiones individuales
Estadísticas, métricas e indicadores esenciales Combinado: Puedes filtrar por nombre de dispositivo para obtener datos específicos de la industria automotriz. Separado
Indexación y clasificación en la búsqueda Clasificación actual del punto de partida Sin remanente
Integración con otras apps Lo más probable es que no se necesiten cambios, suponiendo que el código multimedia se comparte entre ambos APKs Es posible que debas actualizar la app correspondiente, por ejemplo, para la reproducción de URI con Asistente de Google

Contenido sin conexión

Si corresponde, implementa el soporte sin conexión en tu app. Se espera que los vehículos con el SO Android Automotive tengan su propia conexión de datos; es decir, un plan de datos incluido en el costo del vehículo o que el usuario paga. Sin embargo, también se espera que los vehículos tengan una conectividad más variable que los dispositivos móviles.

A continuación, se incluyen algunos aspectos que debes tener en cuenta a la hora de analizar la estrategia de soporte sin conexión:

  • El mejor momento para descargar contenido es mientras tu app está en uso.
  • No des por sentado que la conexión Wi-Fi está disponible. Es posible que un automóvil nunca llegue a estar dentro del rango de conexión Wi-Fi o que el fabricante del equipo original (OEM) haya inhabilitado esa conexión para priorizar una red móvil.
  • Aunque está bien almacenar en caché de forma inteligente el contenido que crees que los usuarios podrían utilizar, te recomendamos que permitas al usuario cambiar este comportamiento.
  • El espacio en disco de los vehículos puede variar, por lo que debes asegurarte de que los usuarios tengan una forma de borrar el contenido sin conexión.

Preguntas frecuentes

Consulta las secciones siguientes para obtener respuestas a algunas preguntas frecuentes sobre el SO Android Automotive.

¿Hay restricciones o recomendaciones para usar SDKs y bibliotecas de terceros?

No tenemos lineamientos específicos sobre el uso de SDKs y bibliotecas de terceros. Si eliges usar bibliotecas y SDKs de terceros, serás responsable de cumplir con todos los requisitos de calidad de la app para vehículos.

¿Cómo publico mi app para el SO Android Automotive con Google Play Console?

El proceso de publicación de apps es similar al de una app para teléfonos, pero con un factor de forma diferente. Para habilitar tu app y poder usar el tipo de versión del SO Android Automotive, sigue estos pasos:

  1. Abre Play Console.
  2. Selecciona tu app.
  3. En el menú de la izquierda, selecciona Versión > Configuración > Configuración avanzada > Factores de forma.
  4. Selecciona Agregar factor de forma > SO Android Automotive y sigue las instrucciones de Play Console.

Solución de problemas

Consulta las siguientes secciones para obtener ayuda en relación con algunas situaciones comunes de solución de problemas en el SO Android Automotive.

  • Incluso después de desinstalar una app de la biblioteca de Car App en la configuración del sistema, recibo un error cuando intento instalar una nueva versión.

    Para asegurarte de que la app se desinstale, usa el comando adb uninstall app.package.name.