拨号器、媒体、车载设备界面库和短信等应用被视为未捆绑应用(即,这些应用未与 Android 平台捆绑)。此类应用包含用于从汽车端手机配套应用和用户体验接收数据的逻辑,其中包括关联和功能注册设置。通过未捆绑代码构建的 APK 可在多个版本的平台上使用。
检出代码
如需检出未捆绑的代码,请运行以下命令:
repo init -u https://android.googlesource.com/platform/manifest -b ub-automotive-masterrepo sync -cq -j4
如需详细了解如何使用 AOSP 源代码,请参阅初始化 Repo 客户端。
构建代码
您可以使用 Android Studio 或通过命令行构建代码。
Android Studio
如需在 Android Studio 中构建代码,请执行以下操作:
- 在 Android Studio 中,导入以下 build 文件: - packages/apps/Car/libs/aaos-apps-gradle-project/build.gradle
- 确保 Gradle JDK 已设置为版本 11 或更高版本:   - 图 1. 在 Android Studio 中将 Gradle JDK 设为版本 11。 
命令行
如需从命令行构建代码,请执行以下操作:
- 使用以下方法之一设置 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环境变量。
 
- 打开命令提示符或 shell 窗口。 
- 前往“ - packages/apps/Car/libs/aaos-apps-gradle-project”。
- 运行以下命令: - ./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 | ||
| 应用 - Dialer | X | ||
| 应用 - AOSP 主机 | X | ||
| 应用 - 媒体 | X | ||
| 应用 - Messenger(短信) | X | ||
| 更新分发 | OTA | OTA 或 Google Play | OTA 或 Google Play | 
