調試 VHAL

本文介紹瞭如何在開發 VHAL 時獲取調試信息:

  • 轉儲 VHAL 的當前狀態。
  • 在 dumpstate 中包含 VHAL 進程轉儲。

當兩者都啟用時,每個項目都包含在adb bugreport中。

此外,通過註冊汽車看門狗,如果狀態不佳,可以檢索運行時 VHAL 狀態。

轉儲 VHAL 調試信息

為 IVehicle.hal 實現調試

IVehicle::debug在調用lshal debug <interface> <options>時被調用。您可以轉儲 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) 。如果vendor dumpstate.te文件夾中不存在 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 進程

要捕獲系統狀態調用,請調用adb shell dumpstate statusCall adb bugreport 。輸出將包含指定 HAL 接口的進程轉儲。

啟用汽車看門狗來監控 VHAL 運行狀況

Car watchdog 監控註冊客戶端的健康狀態,並在註冊客戶端變得不健康時轉儲或終止註冊客戶端。要將 VHAL 註冊到汽車看門狗,請參閱汽車看門狗