1 概述
VehicleHal是AOSP中车辆服务相关的hal层服务。它主要定义了与汽车硬件交互的标准化接口和属性管理,是一个独立的进程。
2 进程启动
VehicleHal相关代码在源码树中的hardware/interfaces/automotive
目录下
首先看下Android.bp文件:
cc_binary {
name: "android.hardware.automotive.vehicle@2.0-service",
defaults: ["vhal_v2_0_target_defaults"],
vintf_fragments: [
"android.hardware.automotive.vehicle@2.0-service.xml",
],
init_rc: ["android.hardware.automotive.vehicle@2.0-service.rc"],
vendor: true,
relative_install_path: "hw",
srcs: ["VehicleService.cpp"],
shared_libs: [
"libbase",
"libjsoncpp",
"libprotobuf-cpp-lite",
],
static_libs: [
"android.hardware.automotive.vehicle@2.0-manager-lib",
"android.hardware.automotive.vehicle@2.0-default-impl-lib",
"android.hardware.automotive.vehicle@2.0-libproto-native",
"libqemu_pipe",
],
}
标准的hal服务层定义,入口在VehicleService.cpp,其他依赖文件在static_libs中定义。服务的可执行文件编译完成之后的名称是android.hardware.automotive.vehicle@2.0-service。
进程是hal服务进程,由init通过解析rc文件进行拉起
service vendor.vehicle-hal-2.0 /vendor/bin/hw/android.hardware.automotive.vehicle@2.0-service
class hal
user vehicle_network
group system inet
进程名vendor.vehicle-hal-2.0,执行的就是/vendor/bin/hw/android.hardware.automotive.vehicle@2.0-service这个可执行文件,class为hal,用户是vehicle_network,用户组是system和inet。
在init中class_start hal的时候启动该hal进程。
3 VHAL初始化
VHAL进程的入口在VehicleService.cpp中的main函数
hardware/interfaces/automotive/vehicle/2.0/default/VehicleService.cpp
// xy:VHAL的入口函数,由init进程启动
int main(int /* argc */, char* /* argv */ []) {
// xy:缓存属性值的地方
auto store = std::make_unique<VehiclePropertyStore>();
// xy:模拟与真实车辆的连接
auto connector = std::make_unique<impl::EmulatedVehicleConnector>();
// xy:模拟Hal,Hal的具体实现
auto hal = std::make_unique<impl::EmulatedVehicleHal>(store.get(), connector.get());
// xy:汽车模拟类,模拟车辆信号
auto emulator = std::make_unique<impl::VehicleEmulator>(hal.get());
// xy:VHAL的服务实现入口
auto service = std::make_unique<VehicleHalManager>(hal.get());
// xy:设置存储属性值的池子,便于重复使用
connector->setValuePool(hal->getValuePool());
// xy:设置binder线程数量
configureRpcThreadpool(4, false /* callerWillJoin */);
ALOGI("Registering as service...");
// xy:将当前服务注册到HwServiceManager中
status_t status = service->registerAsService();
if (status != OK) {
ALOGE("Unable to register vehicle service (%d)", status);
return 1;
}
// Setup a binder thread pool to be a car watchdog client.
// xy:watchDog设置
ABinderProcess_setThreadPoolMaxThreadCount(1);
ABinderProcess_startThreadPool();
sp<Looper> looper(Looper::prepare(0 /* opts */));
std::shared_ptr<WatchdogClient> watchdogClient =
ndk::SharedRefBase::make<WatchdogClient>(looper, service.get());
// The current health check is done in the main thread, so it falls short of capturing the real
// situation. Checking through HAL binder thread should be considered.
if (!watchdogClient->initialize()) {
ALOGE("Failed to initialize car watchdog client");
return 1;
}
ALOGI("Ready");
while (true) {
looper->pollAll(-1 /* timeoutMillis */);
}
return 1;
}
接下来逐步解析各个模块的初始化
3.1 VehiclePropertyStore初始化
VehiclePropertyStore类的主要职责是缓存车辆数据,采用默认构造函数,构造函数中没有初始化逻辑。
using PropertyMap = std::map<RecordId, VehiclePropValue>;
std::unordered_map<int32_t /* VehicleProperty */, RecordConfig> mConfigs;
PropertyMap mPropertyValues; // Sorted map of RecordId : VehiclePropValue.
主要初始化了这两个数据对象,其中mConfigs用于存储属性配置,mPropertyValues用于存储属性值。
3.2 EmulatedVehicleConnector初始化
也是采用无参构造,初始化了一个对象
EmulatedUserHal mEmulatedUserHal;
3.3 EmulatedVehicleHal初始化
EmulatedVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client,
EmulatedUserHal* emulatedUserHal = nullptr);
这个类只有一个三个参数的构造函数,第三个参数有默认值,其实现如下:
EmulatedVehicleHal::EmulatedVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client,
EmulatedUserHal* emulatedUserHal)
: mPropStore(propStore),
mHvacPowerProps(std::begin(kHvacPowerProperties), std::end(kHvacPowerProperties)),
mRecurrentTimer(std::bind(&EmulatedVehicleHal::onContinuousPropertyTimer, this,
std::placeholders::_1)),
mVehicleClient(client),
mEmulatedUserHal(emulatedUserHal) {
initStaticConfig();
for (size_t i = 0; i < arraysize(kVehicleProperties); i++) {
mPropStore->registerProperty(kVehicleProperties[i]