集成未捆绑应用

拨号器、媒体、车载设备界面库和短信等应用被视为未捆绑应用(即,这些应用未与 Android 平台捆绑)。此类应用包含用于从汽车端手机配套应用和用户体验接收数据的逻辑,其中包括关联和功能注册设置。通过未捆绑代码构建的 APK 可在多个版本的平台上使用。

检出代码

如需检出未捆绑的代码,请运行以下命令:

repo init -u https://android.googlesource.com/platform/manifest -b ub-automotive-master
repo sync -cq -j4

如需详细了解如何使用 AOSP 源代码,请参阅初始化 Repo 客户端

构建代码

您可以使用 Android Studio 或通过命令行构建代码。

Android Studio

如需在 Android Studio 中构建代码,请执行以下操作:

  1. 在 Android Studio 中,导入以下 build 文件:

    packages/apps/Car/libs/aaos-apps-gradle-project/build.gradle
    
  2. 确保 Gradle JDK 已设置为版本 11 或更高版本:

    版本 11

    图 1. 在 Android Studio 中将 Gradle JDK 设为版本 11。

命令行

如需从命令行构建代码,请执行以下操作:

  1. 使用以下方法之一设置 Android SDK 位置:

    • 创建 packages/apps/Car/libs/aaos-apps-gradle-project/local.properties,然后设置其包含的 sdk.dir 属性。打开项目时,Android Studio 可以自动执行此操作。例如,使用 sdk.dir=/Users/MY-USERNAME/Library/Android/sdk

    • 使用指向 Android SDK 的路径设置 ANDROID_SDK_ROOT 环境变量。

  2. 打开命令提示符或 shell 窗口。

  3. 前往“packages/apps/Car/libs/aaos-apps-gradle-project”。

  4. 运行以下命令:

    ./gradlew assemble

所需的最低 API 级别

每个未捆绑应用都可以在版本不低于其 minSdkVersion 的 Android 平台上运行。下表列出了每个应用支持的最低 API 版本:

应用 最低 API 级别
日历 29
车载设备界面库 29
CompanionDevice 29
Dialer 31
媒体 30
Messenger(短信) 30
AOSP 主机 29

将预构建 build 集成到系统映像中

如果应用支持相应 Android 平台版本(请参阅上一部分中的表格),您可以将 APK 添加到系统映像中。不过,集成步骤因 Android 平台版本而异。

Android 13 及更高版本

Android 13 及更高版本不包含未捆绑应用的源代码,但您可以在平台 build 中添加预构建的 APK,以用于 CDD 合规性测试或配置特权应用等用例。如需指定 APK,请使用 android_app_import Soong 规则,如以下示例所示:

android_app_import {
    name: "CarMediaApp",
    apk: "CarMediaApp.apk",
    privileged: true,
    certificate: "platform", // Media must be signed by the platform
    required: ["allowed_privapp_com.android.car.media"],
}

Android 12 及更低版本

Android 12 及更低版本包含未捆绑应用的源代码,但您仍然可以指定要包含的预构建 APK。由于 Soong 默认会为源代码提供高于预构建的优先级,因此需要在 android_app_import 规则内将 prefer 标志设为 true,如以下示例所示:

android_app_import {
    name: "CarDialerApp",
    apk: "CarDialerApp.apk",
    privileged: true,
    presigned: true, // Dialer can have its own signature
    required: ["allowed_privapp_com.android.car.dialer"],
    overrides: ["Dialer"],
    prefer: true, // The prebuilt replaces a source target with the same name
    }

未捆绑应用的详细信息

应用/分发 特权未捆绑
系统签名
特权未捆绑
非系统签名
未捆绑
无需在系统分区中
应用 - 日历 X
应用 - CompanionDeviceSupport X
应用 - 拨号器 X
应用 - AOSP 主机 X
应用 - 媒体 X
应用 - Messenger(短信) X
更新分发 OTA OTA 或 Google Play OTA 或 Google Play