前言
上一篇文章中从整体角度描述了 Android Automotive 模块。本篇文章将对 Android Automotive 中的 APP 以及 API 部分展开描述。
上一篇:AndroidAutomotive模块介绍(一)整体介绍
下一篇:AndroidAutomotive模块介绍(三)CarService服务
正文
1、CarServiceApp
Android Automotive 为系统定制了一些专门适用车载系统的应用,以代替传统的手机应用模块。
1.1 代码路径
代码路径为:/android/packages/apps/Car
1.2 应用
代码路径应用如下所示:
ubuntu16-017:/android/packages/apps/Car$ ls -l
total 76
drwxrwxr-x 6 domain users 4096 Nov 9 2022 Cluster
drwxrwxr-x 6 domain users 4096 Nov 9 2022 Dialer
drwxrwxr-x 3 domain users 4096 Jun 7 2022 externallibs
drwxrwxr-x 5 domain users 4096 Nov 9 2022 Hvac
drwxrwxr-x 5 domain users 4096 Nov 9 2022 LatinIME
drwxrwxr-x 5 domain users 4096 Nov 9 2022 Launcher
drwxrwxr-x 5 domain users 4096 Nov 9 2022 LensPicker
drwxrwxr-x 18 domain users 4096 Nov 9 2022 libs
drwxrwxr-x 5 domain users 4096 Nov 9 2022 LinkViewer
drwxrwxr-x 6 domain users 4096 Nov 9 2022 LocalMediaPlayer
drwxrwxr-x 5 domain users 4096 Nov 9 2022 Media
drwxrwxr-x 6 domain users 4096 Nov 9 2022 Messenger
drwxrwxr-x 6 domain users 4096 Nov 9 2022 Notification
drwxrwxr-x 3 domain users 4096 Jun 7 2022 Overview
drwxrwxr-x 5 domain users 4096 Nov 9 2022 Radio
drwxrwxr-x 6 domain users 4096 Nov 9 2022 Settings
drwxrwxr-x 3 domain users 4096 Jun 7 2022 Stream
drwxrwxr-x 5 domain users 4096 May 11 2023 SystemUpdater
drwxrwxr-x 5 domain users 4096 Nov 9 2022 tests
原生提供了许多应用,介绍如下:
应用 | 描述 |
---|---|
Cluster | 仪表板 |
Dialer | 电话 |
Hvac | 空调 |
LatinIME | 输入法 |
Launcher | 桌面 |
LensPicker | 活动窗口选择应用(Launcher) |
LinkViewer | 二维码 |
LocalMediaPlayer | 本地播放器 |
Media | 媒体应用 |
Messenger | 消息管理应用(消息及TTS) |
Notification | 通知 |
Overview | 音源声卡选择应用 |
Radio | 收音机 |
Settings | 设置 |
Stream | 音源管理应用 |
SystemUpdater | 系统升级 |
test | 测试 |
libs | 支持库 |
2、CarServiceApi
2.1 代码路径
CarServiceApi 代码路径为 /android/packages/services/Car/car-lib。
ubuntu16-017:/android/packages/services/Car/car-lib$ ls -l
total 32
-rw-r--r-- 1 domain users 7494 Nov 9 2022 Android.bp
-rw-r--r-- 1 domain users 932 Nov 9 2022 AndroidManifest.xml
-rw-r--r-- 1 domain users 1535 Nov 9 2022 Android.mk
drwxrwxr-x 4 domain users 4096 Nov 9 2022 api
drwxrwxr-x 4 domain users 4096 Jun 7 2022 native
drwxrwxr-x 4 domain users 4096 Jun 7 2022 src
drwxrwxr-x 3 domain users 4096 Jun 7 2022 src_feature_future
如上所示,Android.bp 是 car-lib 的编译文件;AndroidManifest.xml 是编译配置文件;Android.mk 描述了添加 car-lib 到系统编译中;api 文件夹中描述了 car-lib 所支持的接口描述 txt 文件;native 文件夹中保存了 car-lib 所需的 libcarpowermanager 库,关于 CarPower 模块的回调信息;src 中描述了 car-lib 提供的接口代码;src_feature_future 文件夹下主要保存 FeatureConfiguration.java 文件,以静态变量的方式保存有关 feature 的默认状态。
2.2 Api 介绍
2.2.1 编译
2.2.1.1 编译命令
编译 Carlib 有三种不同的指令
2.2.1.1.1 make android.car
android.car 编译出的 Carlib 库包含 Car API 中定义的所有方法和实现细节。
编译结果保存到:/out/target/common/obj/JAVA_LIBRARIES/android.car_intermediates 路径下。
2.2.1.1.2 make android.car-system-stubs
android.car-system-stubs 包含了 Car 服务端的 API 接口定义,但不包含实际的实现代码。主要用于在开发 Car 服务时进行编译和链接,以便在编译时检查代码的正确性。确保 Car 服务与 Car 应用之间的通信接口正确对接。
2.2.1.1.3 make android.car-stubs
make android.car-stubs 包含了 Car 应用的 API 接口定义,但并不包含实际的实现代码。主要用于在开发 Car 应用时进行编译和链接,以便在编译时检查代码的正确性。确保 Car 应用与 Car 服务之间的通信接口正确对接。
2.2.1.2 编译文件
下面通过 Android.bp 文件分析下 car-lib 编译逻辑:
// 编译 libcarpowermanager 静态库,主要编译文件是 native 目录下的 CarPowerManager 相关文件
cc_library {
name: "libcarpowermanager",
aidl: {
export_aidl_headers: true,
local_include_dirs: [
"src",
],
},
cflags: [
"-Wall",
"-Werror",
"-Wextra",
"-Wno-unused-parameter",
],
include_dirs: [
"packages/services/Car/car-lib/native/include",
],
shared_libs: [
"libbinder",
"liblog",
"libutils",
],
srcs: [
"src/android/car/ICar.aidl",
"src/android/car/hardware/power/ICarPower.aidl",
"src/android/car/hardware/power/ICarPowerStateListener.aidl",
"native/CarPowerManager/CarPowerManager.cpp",
],
}
java_library {
name: "android.car.cluster.navigation",
proto: {
type: "lite",
},
static_libs: ["libprotobuf-java-lite"],
srcs: ["src/android/car/navigation/navigation_state.proto"]
}
// android.car 库,是 Carlib API 库
java_library {
name: "android.car",
srcs: [
"src/**/*.java",
"src_feature_future/**/*.java",
"src/**/I*.aidl",
],
static_libs: ["android.hardware.automotive.YFvehicle-V2.0-java"],
aidl: {
include_dirs: [
"system/bt/binder",
],
},
exclude_srcs: [
"src/android/car/storagemonitoring/IoStats.aidl",
"src/android/car/storagemonitoring/IoStatsEntry.aidl",
],
product_variables: {
pdk: {
enabled: false,
},
},
installable: true,
}
// android.car-stubs 库,Car 应用端的 API 接口定义,不包含实现代码逻辑。
java_library_static {
name: "android.car-stubs",
srcs: [
":android.car-stub-docs",
],
libs: [
"android.car",
],
product_variables: {
pdk: {
enabled: false,
},
},
compile_dex: true,
dist: {
targets: ["dist_files"],
}
}
// android.car-system-stubs 库。Car 服务端 API 接口定义,不包含实现代码逻辑。
java_library_static {
name: "android.car-system-stubs",
srcs: [
":android.car-system-stubs-docs",
],
libs: [
"android.car",
],
product_variables: {
pdk: {
enabled: false,
},
},
compile_dex: true,
dist: {
targets: ["dist_files"],
}
}
在源码中添加 AndroidAutomotive 相关编译,包括 APP、Jar 包、CarService 服务等,编译文件在 /android/packages/services/Car/car_product/build/car.mk 文件中。
# Automotive specific packages 添加 Automotive 应用编译
PRODUCT_PACKAGES += \
CarFrameworkPackageStubs \
CarService \
CarDialerApp \
OverviewApp \
CarLauncher \
CarSystemUI \
LocalMediaPlayer \
CarMediaApp \
CarMapsPlaceholder \
CarSettings \
android.car \
car-frameworks-service \
com.android.car.procfsinspector \
libcar-framework-service-jni \
CarHvacApp \
# should add to BOOT_JARS only once 添加 Carlib Jar 包编译
ifeq (,$(INCLUDED_ANDROID_CAR_TO_PRODUCT_BOOT_JARS))
PRODUCT_BOOT_JARS += \
android.car
PRODUCT_HIDDENAPI_STUBS := \
android.car-stubs
PRODUCT_HIDDENAPI_STUBS_SYSTEM := \
android.car-system-stubs
PRODUCT_HIDDENAPI_STUBS_TEST := \
android.car-test-stubs
2.2.2 Api 分类
Android Automotive 的 ca