车控信号测试联调
车控(信号)相关功能在开发完成后可以在App<——>Framework两层之间进行小范围闭环验证测试,主要有以下三种方式:
- 结合代码设置及接收信号的关键log确认信号的上下行是否正常;
- 使用mock信号的测试app测试;
- 使用adb命令直接模拟车控信号上报(上行);
一、通过logcat查看信号上下行
如settings app在通过CarPropertyManager设置信号值以及监听信号上报的位置均有打印关键日志,可以通过查看这些日志对车控信号的上下行进行基础检查是否正常调用和反馈。
// 设置车控信号值(下行)日志打印位于VehicleControlManager
public void setIntProperty(int propertyId, int propVal) {
try {
mCarPropertyManager.setIntProperty(propertyId, AREA_ID, propVal);
MLog.tab(1).d(">>> Done set property value: %d to propId: %d", propVal, propertyId);
} catch (IllegalArgumentException ile) {
MLog.e("CarPropertyManager cannot set value: %d to property: %d.", propVal, propertyId);
ile.printStackTrace();
}
}
// 监听车控信号上报(上行)日志打印 位于CarPropertyMgrPreferenceController中默认的CarPropertyEventCallback
protected class CarPropertyEventCallback implements CarPropertyManager.CarPropertyEventCallback {
@Override
public void onChangeEvent(CarPropertyValue carPropertyValue) {
//...略
propertySupporter.logPropertyOnChange(carPropertyValue);
}
}
//=======> CarPropertyControlSupport
fun logPropertyOnChange(property: CarPropertyValue<*>?) {
MLog.e("%s#onChangeEvent() with Property => %s", getInvokeClzName(), VehiclePropertyUtil.stringFormat(property))
}二、adb 命令获取、设置车控信号
车控信号可以使用adb命令进行查看以及模拟信号上报(上行),以便检查UI层对于信号上报时做出的状态响应是否符合预期。
- adb 命令获取当前车控信号(propertyid必须使用十六进制)
- 指令模板:adb shell dumpsys car_service get-property-value <property_id> <area_id>
// 获取车控信号值,property id必须是十六进制数值,且不能包含0x
// 234214234 是property_id; 1 是area_id
adb shell dumpsys car_service get-property-value 234214234 1- adb命令模拟信号上报
- 指令模板:adb shell dumpsys car_service inject-vhal-event <property_Id> <area_id> <property_val>
// 设置车控信号值 propertyid 可以是十六进制也可以是十进制
// 0x61408105是property_Id;0是area_id; 6 是property_val
adb shell dumpsys car_service inject-vhal-event 0x61408105 0 6查看Carservice信号
adb shell dumpsys car_service [| grep your_target]三、车控信号mock App
Mock车控信号Apk提供了车控信号mock的能力,可以借助该APP对车控信号进行模拟上报,查看Settings对应车控信号UI状态切换是否符合预期。随着车控功能的迭代,该App支持的车控信号mock内容也会同步增加。

mock app界面如下:
inject-vhal-event 0x11600207 30
四、IDEA 插件模拟信号上报
五、对接联调
Settings以及Hvac两个模块的测试均可参考上述几种方式,其依赖的车控信号定义位于ASOP工程的micar/packages/services/MiCarConfig目录,App中的引用方式如下:
//in build.gradle
implementation 'mi.car:vehicle.support:0.0.7-SNAPSHOT'
//in Android.bp
static_libs: [
"mi-car-support-api",
],截图为Framework定义的车控信号列表, App引用的车控信号皆出于此:
📷 截图
六、其他说明
打开Framework 车控信号mock功能
App层对车控信号的设置会在Framework层MiVehicleService.apk中进行第一层的处理,在中间
件和framework没有打通的情况下,可以将该Apk的mock能力打开,在mock打开的情况下App对车控信号的设置会直接反馈,即app层会立即收到车控信号设置成功的上报,回调CarPropertyCallback的onChangeEvent(CarPropertyValue value), 打开该mock方法如下:
# 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车控信号异常Case Mock
在进行车控功能开发的时候还需要关注一下异常的场景,比如设置车控信号失败、信号上报不可用以及信号超时上报,对于这种场景的模拟,Settings app中均提供了mock的能力,具体开启方式参考如下:
- 信号设置失败
adb shell settings put system mock_vehicle_property_env 1 // 1为打开mock,其他值表示关闭信号上报超时
adb shell settings put system mock_vehicle_property_env 2 // 2为打开mock,其他值表示关闭- 信号上报状态不可用
adb shell settings put system mock_vehicle_property_env 4 // 4为打开mock,其他值表示关闭七、APK替换安装
Settings 车控apk
// Push 方式
adb root
adb remount
adb push local_path_to_carsettings.apk /system/priv-app/CarSettings/CarSettings.apk
adb reboot
// install方式
adb install [-t] XxxSettings.apk //可以先执行一下uninstall
// uninstall
adb uninstall com.android.car.settingshvac 空调apk
adb root
adb remount // 有些8295可能remount会挂掉
adb reboot
adb root
adb remount
#注意路径大小写,改为prebuilt方式集成之后空调apk路径有变化,如下:
adb push path_to_CarHvac.apk /system/priv-app/MiCarHvacApp/MiCarHvacApp.apk
#重启进程
adb shell pkill -9 hvac
或者
adb reboot