使用汽车监控定时器帮助调试 VHAL。汽车监控定时器可监控进程的运行状况并终止运行状况不佳的进程。如需通过汽车监控定时器监控某个进程,必须向汽车监控定时器注册该进程。当汽车监控定时器终止运行状况不佳的进程时,它会像其他“应用无响应”(ANR) 转储一样,将进程的状态写入 data/anr。这样做有助于执行调试过程。
本文将介绍供应商 HAL 和服务如何向汽车监控定时器注册进程。
供应商 HAL
通常,供应商 HAL 会使用 hwbinder 对应的线程池。但是,汽车监控定时器客户端会通过 binder(不同于 hwbinder)与汽车监控定时器守护程序通信。因此,供应商 HAL 会使用 binder 对应的线程池。
在 makefile 中指定汽车监控定时器 AIDL
在 shared_libs 中添加 carwatchdog_aidl_interface-ndk_platform:
Android.bp:
cc_defaults {
name: "vhal_v2_0_defaults",
shared_libs: [
"libbinder_ndk",
"libhidlbase",
"liblog",
"libutils",
"android.hardware.automotive.vehicle@2.0",
"carwatchdog_aidl_interface-ndk_platform",
],
cflags: [
"-Wall",
"-Wextra",
"-Werror",
],
}
添加 SELinux 政策
允许 system_server 终止您的 HAL。如果您没有 system_server.te,请创建一个。强烈建议您为每台设备添加一个 SELinux 政策。
允许供应商 HAL 使用 binder(binder_use 宏),并将供应商 HAL 添加到 carwatchdog 客户端域(carwatchdog_client_domain 宏)中。请参阅 systemserver.te 和 vehicle_default.te 的以下代码:
system_server.te
# Allow system_server to kill vehicle HAL
allow system_server hal_vehicle_server:process sigkill;
hal_vehicle_default.te
# Configuration for register VHAL to car watchdog
carwatchdog_client_domain(hal_vehicle_default)
binder_use(hal_vehicle_default)
通过继承 BnCarWatchdogClient 实现客户端类
在 checkIfAlive 中,执行运行状况检查。例如,发布到线程循环处理程序。如果运行状况良好,则调用 ICarWatchdog::tellClientAlive。
请参阅 WatchogClient.h 和 WatchogClient.cpp 的以下代码:
WatchogClient.h
class WatchdogClient : public aidl::android::automotive::watchdog::BnCarWatchdogClient {
public:
explicit WatchdogClient(const ::android::sp<::android::looper>& handlerLooper, VehicleHalManager* vhalManager);
ndk::ScopedAStatus checkIfAlive(int32_t sessionId, aidl::android::automotive::watchdog::TimeoutLength timeout) override;
ndk::ScopedAStatus prepareProcessTermination() override;
};
WatchogClient.cpp
nd