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:
- Cómo crear un módulo de Automotive
- Cómo declarar la compatibilidad con el SO Android Automotive
- Declara tu
CarAppService
yCarAppActivity
- 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, por lo que deberás crear 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 app para teléfonos.
En un proyecto existente, sigue estos pasos para agregar un módulo de Automotive a tu proyecto:
- En Android Studio, haz clic en File > New > New Project.
- Selecciona Automotive Module y, luego, haz clic en Next.
- Proporciona la información de Application/Library name. Se trata del nombre que los usuarios ven para tu app en el SO Android Automotive.
- Proporciona un nombre de módulo en Module name.
- Ajusta el valor de Package name para que coincida con tu app.
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.
Selecciona Add No Activity y haz clic en Finish.
Si estás comenzando un proyecto nuevo:
- En Android Studio, haz clic en File > New > New Project.
- En Project Type, selecciona Automotive.
- Selecciona No Activity y, luego, haz clic en Next.
- Proporciona un nombre para tu proyecto en Name. Se trata del nombre que los usuarios ven para tu app en el SO Android Automotive.
- 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.
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 admitir 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 de Automotive 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 la implementación de CarAppService
para ejecutar tu app. Consulta Cómo crear tu CarAppService y Session y Cómo declarar tu CarAppService para obtener instrucciones para implementar y declarar tu CarAppService
.
A diferencia de Android Auto, debes incluir un componente de aplicación adicional, 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 alojada de la plantilla 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 claseCarAppActivity
del artefactoapp-automotive
.android:exported
se establece entrue
, ya que otra app (el selector) debe poder iniciar la actividad.android:launchMode
se establece ensingleTask
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.
- Hay un elemento
<meta-data>
que le indica al SO que la app se puede usar mientras hay restricciones de UX vigentes, por ejemplo, cuando el vehículo está en movimiento.
Requisitos adicionales para las apps de navegación
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?
Para obtener más información sobre cómo publicar tu app para el SO Android Automotive con Google Play Console, consulta Cómo distribuir apps para vehículos.
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
.