向您的模板应用添加对Android Automotive OS的支持

Android Automotive OS允许用户在车载系统中安装应用。为了在这个平台上覆盖用户,您需要分发一个针对驾驶员优化的、与Android Automotive OS兼容的应用。您可以重复使用Android Auto应用中几乎所有代码和资源,但是您必须创建一个满足此页面中描述的要求的单独构建。

要在Android Automotive OS上运行您的车载应用,您需要最新的Templates Host,它作为一个系统应用提供。

开发概述

添加Android Automotive OS支持只需要几个步骤,如本页面各节所述

  1. 创建汽车模块
  2. 声明对Android Automotive OS的支持
  3. 声明您的CarAppServiceCarAppActivity
  4. 更新您的Gradle依赖项

使用Android Studio Bumblebee或更高版本以确保启用所有Automotive OS功能。

创建汽车模块

Android Automotive OS 的某些组件(例如清单)具有特定于平台的要求。创建一个模块,可以将这些组件的代码与项目中的其他代码(例如用于手机应用的代码)分开。

对于现有项目,请按照以下步骤将汽车模块添加到您的项目中

  1. 在Android Studio中,点击文件>新建>新建模块
  2. 选择汽车模块,然后点击下一步
  3. 提供应用/库名称。这是用户在Android Automotive OS上看到的应用名称。
  4. 输入模块名称
  5. 编辑包名以匹配您的现有应用。
  6. 最小SDK选择API 29: Android 10 (Q),然后点击下一步。所有在Android Automotive OS上支持Car App Library的汽车都运行在Android 10 API级别29或更高版本上,因此选择此值可覆盖所有兼容的汽车。

  7. 选择添加无活动,然后点击完成

如果您正在启动一个新项目

  1. 在Android Studio中,点击文件>新建>新建项目
  2. 项目类型选择汽车
  3. 选择无活动,然后点击下一步
  4. 为您的项目提供一个名称。这是用户在Android Automotive OS上看到的应用名称。
  5. 输入包名。有关选择包名的更多详细信息,请参阅包名部分。
  6. 最小SDK选择API 29: Android 10 (Q),然后点击下一步

    所有在Android Automotive OS上支持Car App Library的汽车都运行在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元素声明您的应用使用模板主机运行。将其余四个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文件,该文件声明您的应用支持的汽车功能。

要指示您拥有Car App Library应用,请将名为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不同,您必须包含一个附加的应用程序组件CarAppActivity,作为Android Automotive OS应用的入口点。此活动的实现包含在androidx.car.app:app-automotive构件中,并负责与模板主机应用程序通信以呈现您的应用的UI。您在清单中只能有一个此活动的实例,并且必须按如下方式声明:

<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:exported设置为true,因为该活动必须可由自身以外的应用(即启动器)启动。
  • android:launchMode设置为singleTask,以便用户如果离开该活动,可以从启动器返回到该活动的同一实例。
  • android:theme设置为@android:style/Theme.DeviceDefault.NoActionBar,以便应用占用可用的整个屏幕空间。
  • 意图过滤器指示这是应用的启动器活动。
  • 有一个<meta-data>元素指示操作系统该应用可以在存在UX限制的情况下使用,例如车辆行驶时。

对于导航应用,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软件包工具包(APK),所以您可以重用移动应用的包名,也可以创建一个新的包名。如果您使用不同的包名,您的应用将有两个单独的Play商店列表。如果您重用当前的包名,您的应用将在两个平台上只有一个列表。

这主要是一个业务决策。例如,如果您有一个团队负责移动应用,另一个团队负责Android Automotive OS应用,那么拥有单独的包名并让每个团队管理自己的Play商店列表可能更有意义。使用这两种方法所需的的技术工作量差别不大。

下表总结了保留当前包名或使用新包名的一些其他关键区别

功能 相同的包名 新的包名
商店列表 单个 多个
镜像安装 是:在设置向导期间快速重新安装应用
Play商店审核流程 阻止审核:如果一个APK的审核失败,则在同一版本中提交的其他APK也会被阻止 单独审核
统计数据、指标和重要指标 组合:您可以按设备名称筛选汽车专用数据。 单独的
索引和搜索排名 基于当前排名 无延续
与其他应用集成 可能不需要更改,假设媒体代码在两个APK之间共享 可能必须更新相应的应用,例如用于与Google智能助理的URI播放

离线内容

如果适用,请在您的应用中实现离线支持。使用Android Automotive OS的汽车预计将拥有自己的数据连接,这意味着数据计划包含在车辆成本中或由用户付费。但是,汽车的连接性也预计比移动设备更不稳定。

在考虑离线支持策略时,请记住以下几点

  • 下载内容的最佳时间是在您的应用正在使用时。
  • 不要假设有WiFi可用。汽车可能永远不会进入WiFi范围,或者原始设备制造商(OEM)可能已禁用WiFi而改用蜂窝网络。
  • 虽然缓存您预计用户会使用的内容是可以的,但我们建议您允许用户更改此行为。
  • 汽车上的磁盘空间各不相同,因此请为用户提供删除离线内容的方法。

常见问题

请参阅以下部分,了解有关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上一些常见故障排除方案的帮助,请参阅以下内容。

  • 即使从系统设置中卸载了Car App Library应用,尝试安装新版本时也会出现错误。

    要确保应用已卸载,请使用命令adb uninstall app.package.name