如何修改Android Sensor Framework以保留SensorEvent的多维度数据
高通骁龙888光传感器额外数据保留补丁位置及修改方案
核心问题定位
Android Sensor Framework 对默认光传感器(TYPE_LIGHT)的事件值长度做了硬编码限制,即便HAL推送了多组数据,框架层也会自动截断为仅保留Lux值(1个数据)。需要修改框架层的事件转换与传感器配置逻辑,以保留额外数据。
具体修改位置及步骤
1. 确认HAL层传感器配置(前置检查)
先确保HAL实现中注册的传感器结构体sensor_t字段配置正确:
- 修改
hardware/libhardware/include/hardware/sensors.h中对应传感器的values_count为实际推送的数据个数(比如RGB光传感器设为4,对应Lux+R+G+B)。 - 若使用自定义传感器类型,需在此处新增类型定义(如
SENSOR_TYPE_CUSTOM_LIGHT_WITH_RAW),否则可复用SENSOR_TYPE_LIGHT_RGB(若符合场景)。
2. JNI层事件转换逻辑修改
路径:frameworks/base/core/jni/android_hardware_SensorManager.cpp
找到convertSensorEvent函数,该函数负责将Native层sensor_event_t转换为Java层SensorEvent对象。原代码对TYPE_LIGHT的处理会强制截断为1个值,需修改:
// 原代码片段 case SENSOR_TYPE_LIGHT: count = 1; break; // 修改为 case SENSOR_TYPE_LIGHT: // 使用HAL上报的实际数据个数,或直接指定固定值(如4) count = event->sensor->values_count; break;
3. Java层Sensor类定义更新(可选)
路径:frameworks/base/core/java/android/hardware/Sensor.java
更新TYPE_LIGHT对应的数值长度说明,确保应用层能正确感知:
- 修改
getMaxValueCount()方法,使其返回HAL配置的values_count数值,而非硬编码的1。 - 同步更新注释,说明该传感器支持返回额外原始数据。
4. SensorService层数据转发验证
路径:frameworks/native/services/sensorservice/SensorService.cpp
检查processSensorEvent函数,确保没有针对TYPE_LIGHT的额外截断逻辑。若存在限制数据长度的判断,需调整为使用传感器自身的values_count作为上限。
验证方法
修改完成后重新编译AOSP,刷入设备:
- 在应用层
onSensorChanged回调中,打印SensorEvent.values的长度,确认已包含所有推送的原始数据。 - 通过
adb shell dumpsys sensorservice命令,查看传感器的values_count配置是否生效。
内容的提问来源于stack exchange,提问作者ayoubsvbri
相关产品推荐
相关产品推荐

