调试 VHAL

本文介绍了如何在开发 VHAL 时获取调试信息:

  • 转储 VHAL 的当前状况。
  • 在 dumpstate 中添加 VHAL 进程转储。

如果这两种方法均采用,adb bugreport 会同时包含二者。

此外,还可通过注册到汽车监控定时器来检索状况不佳的运行时 VHAL。

转储 VHAL 调试信息

实现对 IVehicle.hal 的调试

调用 lshal debug <interface> <options> 时,系统会调用 IVehicle::debug。您可以转储 VHAL 的内部状况,也可以根据选项对 VHAL 执行所需的操作。

Return<void> VehicleHal::debug(const hidl_handle& handle, const hidl_vec<hidl_string>& options) {
    if (handle.getNativeHandle() == nullptr || handle->numFds < 1) {
        ALOGE("Invalid parameters passed to debug()");
        return Void();
    }

    int fd = handle->data[0];

    // Process options
    if (options.size() == 0) {
        dump_VHAL_state(fd);
        return Void();
    }
    std::string option = options[0];
    if (EqualsIgnoreCase(option, "--help")) {
        print_out_help(fd);
    } else if (EqualsIgnoreCase(option, "--whateveroption")) {
        do_whatever_needed(fd, option);
    } else {
        dprintf(fd, "Invalid option: %s\n", option.c_str());
    }

    return Void();
}

转储 VHAL

使用 lshal 转储 VHAL。需要具有系统特权。

shell$ adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle

在 dumpstate 中添加 HAL 进程转储

在 Android 10 QPR2 版本中,可在启动 dumpstate(或 bugreport)时将 HAL 包含在进程转储中。

设置配置

配置 SELinux 政策

dumpstate.te 中添加 dump_extra_hal(hal_server_domain)。如果 vendorsepolicy 文件夹中没有 dumpstate.te,请创建 dumpstate.te

shell$ cat dumpstate.te
dump_extra_hal(hal_vendor_special_control)
dump_extra_hal(hal_vendor_display_power)

列出 HAL 接口

将 HAL 接口名称添加到系统属性 ro.dump.hals.extra 中。名称有多个时,请将其以英文逗号分隔。Android.mk 或产品 makefile 是存储这些名称的最佳位置。

shell$ % cat vendor_product.mk
PRODUCT_PROPERTY_OVERRIDES += \
ro.dump.hals.extra=vendor.company.hardware.special.control@1.0::ISpecialControl,vendor.company.hardware.power.displaypower@1.0::IDisplayPower

转储 HAL 进程

要获取系统 statusCall,请调用 adb shell dumpstateadb bugreport。输出会包含特定 HAL 接口的进程转储。

启用汽车监控定时器以监控 VHAL 的运行状况

汽车监控定时器可监控已注册客户端的运行状况,并在已注册客户端的运行状况不佳时将其转储或终止。如需将 VHAL 注册到汽车监控定时器,请参阅汽车监控定时器