信号接入指南

仅以 car-lib (android) 作为(Java)调用说明, 其他语言的数据结构、通信方式与此类似

Car-lib

Car-lib 使用方法

  • Gradle 编译 (参考 : Link)
apply plugin: 'com.android.application'
 
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
 
    defaultConfig {
        applicationId "com.example.xxx"
        minSdkVersion 28
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
    }
 
    // android.car exists since Android 10 (API level 29) Revision 5.
    useLibrary 'android.car'
}
 
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    // maven { url 'https://pkgs.d.xiaomi.net:443/artifactory/maven-snapshot-virtual/' }
    implementation 'mi.car:vehicle.support:0.2.2.9-SNAPSHOT'
}
  • bp 编译
android_app {
    name: "Xxxxx",
    srcs: ["src/**/*.java", "src/**/*.aidl"],
    libs: [
        "android.car"
    ],
    static_libs: [
        "mi-car-support-api",
    ],
}

车控信号定义

maven { url 'https://pkgs.d.xiaomi.net:443/artifactory/maven-snapshot-virtual/' }
implementation 'mi.car:vehicle.support:0.1.4-SNAPSHOT'
 
// https://pkgs.d.xiaomi.net/artifactory/webapp/#/artifacts/browse/tree/General/artifactory-snapshots/mi/car/vehicle.support
 
// 或者 release
 
maven { url 'https://pkgs.d.xiaomi.net:443/artifactory/maven-release-virtual/'  }
implementation 'mi.car:vehicle.support:0.1.4'
 
//https://pkgs.d.xiaomi.net/artifactory/webapp/#/artifacts/browse/tree/General/artifactory-releases/mi/car/vehicle.support
  • 信号声明
public class Hvac {
 
// .......
 
    @PropertyDef(
            permission = @RequiresPermission(Car.PERMISSION_CONTROL_CAR_CLIMATE),
            areaRef = VehicleAreaSeat.class,
            type = float.class,
            value = @ValueDef(range = @Range(floatFrom = 18.0, floatTo = 32.0)))
    public static final int TEMPERATURE = 0x10a
            | MiVehiclePropertyGroup.MI_CAR
            | MiVehicleArea.SEAT
            | VehiclePropertyType.FLOAT
            | MiVehicleZone.HVAC; /*0x6560410a*/
 
// .......
}

以空调温度信号为例

Mock

常见场景切换

分心模式
# 开启分心模式
 
adb root
# 切换档位至 DRIVE
adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle --mock_from_car 1631613445 i 3
# 模拟速度到 60
adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle --mock_from_car 1631613441 i 60
# 关闭分心模式
 
adb root
# 切换档位至 PARK
adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle --mock_from_car 1631613445 i 0
# 模拟速度到 0
adb shell lshal debug android.hardware.automotive.vehicle@2.0::IVehicle --mock_from_car 1631613441 i 0

模拟信号脚本

LogPropMonitor.py (4.7 KiB)

# 解析 log , 并执行模拟
python LogPropMonitor.py xxxx.log
 
# 将 log 中模拟命令转储为 cmd_list.sh 文件
python LogPropMonitor.py xxxx.log --save_only
 
# 将 log 中模拟命令转换为 cmd_list.sh 文件, 并执行
python LogPropMonitor.py xxxx.log --output output.sh --exec

辅助测试用 APP (代码仓库)

CarDemo4Test.apk (6.9 MiB)

车辆信号调试-Q&ACarService与VHAL

adb install -t -g CarDemo4Test.apk
 
# APP 中打开 Mock 时候点击, 和命令行注入等效
#注入雨刮速度为 间歇高速 (Body#WIPER_SPEED_MODE)
adb shell dumpsys car_service inject-vhal-event 0x63401301 1 2
#注入雨刮维修模式为 ON (Body#WIPER_SERVICE_MODE)
adb shell dumpsys car_service inject-vhal-event 0x63401302 1 1
  • 开发人员可以直接拉取代码,来更新App (代码仓库 更新vehicle.support 版本即可, 界面是依赖信号自动生成的)

CarDemo build.gradle 中 vehicle.support 依赖版本(第56行高亮)

其他

  • Mock 功能仅适用于信号通路完成前,debug 使用, 切勿在车辆设备上适用
  • 8295 上默认 Mock 关闭, pad 上默认开启
  • 目前所有设备在开机后会保持默认状态 (以防有人忘了清理配置) (提交 | 提交2)
# enable mock, 仅为在通路不可用时, 测试 APP 使用
adb shell settings put --user 0 GLOBAL vehicle_mock_data 1
# disable mock, 切换至正常模式
adb shell settings put --user 0 GLOBAL vehicle_mock_data 0

注意事项

权限

  • 部分信号所需权限级别是 dangerous , 需要运行时授予,或者添加 (system/vendor/xxx) /etc/default-permissions/xxxxxx.xml
android.car.permission.CAR_ENERGY
android.car.permission.CAR_SPEED

CarPropertyManager 相关异常

CarInternalErrorException,
PropertyAccessDeniedSecurityException,
PropertyNotAvailableException,
PropertyNotAvailableAndRetryException,
IllegalStateException,
IllegalArgumentException
  • CarPropertyManager#setProperty

    • 这里 App 可以处理部分异常, CarService 目前并不会在 setProperty 的时候抛出 ServiceSpecificException, 所以 App 也可以忽略处理
  • CarPropertyManager#getIntProperty, getFloatProperty, getBooleanProperty, getIntArrayProperty

    • 触发原因 : CarPropertyManager#handleNullAndPropertyStatus(source)
    • 这里需要 App 主动处理下异常, 因为 这部分代码是存在于 car-lib 中的, 而本地修改 car-lib 的代码并不能影响到所有 App, 而且由于这里的异常都是继承自 RuntimeException, 所以 IDE 也不会提示开发人员去主动处理, 是个很容易忽略的问题
// 建议方式 1
int value ;
try {
    value = mCarPropertyManager.getIntProperty(propId, areaId);
} catch (CarInternalErrorException
        | PropertyNotAvailableAndRetryException
        | PropertyNotAvailableException e1) {
    // can signal timeout ? hardware fatal ?
    value = -1 ;
} catch (PropertyAccessDeniedSecurityException | IllegalArgumentException e2) {
    // app cannot access or error call ?  应用可以解决逻辑问题,而不去处理异常
    value = -1;
}
 
 
// 建议方式 2, 这里在 CarService 中做了处理, getProperty 并不会抛出异常
CarPropertyValue<Integer> carProp = mCarPropertyManager.getProperty(Integer.class, propId, areaId);
int value = carProp != null ? carProp.getValue() : -1;
 
// 或者对其他车机系统也做兼容处理
 
int value;
try {
    CarPropertyValue<Integer> carProp = mCarPropertyManager.getProperty(Integer.class, propId, areaId);
    value = carProp != null /*&& carProp.getStatus() == CarPropertyValue.STATUS_AVAILABLE*/
            ? carProp.getValue() : -1;
} catch (CarInternalErrorException
        | PropertyNotAvailableAndRetryException
        | PropertyNotAvailableException e1) {
    // can signal timeout ? hardware fatal ?
    value = -1;
} catch (PropertyAccessDeniedSecurityException | IllegalArgumentException e2) {
    // app cannot access or error call ? 应用可以解决逻辑问题,而不去处理异常
    value = -1;
}
 
 
// 方式3
// 额外提供方法 TODO
MiCarPropertyManager#getIntPropertySafe(
        CarPropertyManager cpm,
        int prop,
        int area,
        int defaultValue)
 
MiCarPropertyManager#getIntPropertySafe(
        CarPropertyManager cpm,
        int prop,
        int area,
        boolean returnOriginIfUnavaliable/**default : true**/,
        int defaultValue)
  • CarPropertyManager#getProperty(java.lang.Class, int, int)

    • 同 setProperty, Service 端也不会主动抛出 ServiceSpecificException ,开发人员可以忽略此问题, 或者使用上述同样方法去处理

目前所有设备在开机后会Mock保持默认状态 (以防有人忘了清理配置) (提交)

Create Car ANR 警告

信号变更通知群

CarService SDK 信号变更通知群二维码(仅限团队内部成员)

相关链接

E3-SC : https://xiaomi.f.mioffice.cn/drive/folder/fldk4T2KFVJQaRNz9BOm9LkdRRh

E4-SC : https://xiaomi.f.mioffice.cn/drive/folder/fldk4ME4bI9xq0QhfjkBZ95LdQh

E4U-SC : https://xiaomi.f.mioffice.cn/drive/folder/fldk4Bdzf8Hvh3hBlFVlxh7sZec

车辆信号调试-Q&ACarService与VHAL

需特殊处理信号

Android 配置字接入指南

车机 Android 端方控实现方案

信号变更说明

DCD车辆数据服务

信号 Status 值扩展说明

DCD域内时钟同步策略

信号管理平台

TODO : Settings 接入信号列表