我们正在开发定制开发板,目前,我们正在 Android 7.1 上实现“传感器 HAL”。
我们已经根据 Android 传感器服务要求 (sensor.h) 实现了“传感器 HAL”API,并且能够为其构建 .so 文件。 (由于一些自定义修改,我们无法使用已经可用的 HAL。)
集成“Sensor HAL”后,我们看到 Android 进入挂起状态,直到 Android 锁定屏幕才能到达。
我们对 Android 传感器服务行为的观察
SensorService:nuSensorService 正在启动...
由传感器服务加载的“传感器 HAL”
“传感器HAL”开启调用成功
“传感器 HAL”get_sensor_list 调用成功
“传感器 HAL”轮询函数每次都调用成功。
Android 启动卡在“Bootanimation”屏幕
引用日志
01-01 00:58:48.258 1461 1461 D SensorService: nuSensorService starting...
01-01 00:58:48.260 1461 1461 D Sensor_HAL: OpenSensors: name=poll
01-01 00:58:48.260 1461 1461 D Sensor_HAL: Exiting... OpenSensors: name=poll
01-01 00:58:48.260 1461 1461 D Sensor_HAL: Entering @GetSensorList
01-01 00:58:48.260 1461 1461 D Sensor_HAL: Exiting @GetSensorList
01-01 00:58:48.261 1461 1461 D Sensor_HAL: Entering @SensorDeviceActivate, handle 0, enabled 0
01-01 00:58:48.261 1461 1461 D Sensor_HAL: Entering @SensorDeviceActivate, handle 1, enabled 0
01-01 00:58:48.262 1461 1461 D Sensor_HAL: Entering @SensorDeviceActivate, handle 2, enabled 0
01-01 00:58:48.262 1461 1461 D Sensor_HAL: Entering @GetSensorList
01-01 00:58:48.262 1461 1461 D Sensor_HAL: Exiting @GetSensorList
01-01 00:58:48.262 1461 1461 D Sensor_HAL: Entering @GetSensorList
01-01 00:58:48.262 1461 1461 D Sensor_HAL: Exiting @GetSensorList
01-01 00:58:48.264 1461 1463 D SensorService: nuSensorService thread starting...
01-01 00:58:49.953 1461 1462 D SensorService: new thread SensorEventAckReceiver
=> 以上调用了导致系统挂起的 poll 函数。
=> Android 启动卡在此处。
请注意,当前 poll() 命令的实现是将带有时间戳的虚拟加速度计事件返回给上层。返回值为复制的数据事件数。
如果您发现有什么遗漏或理解有误,请指正。
最佳答案
伙计们,
最后,我能够通过在同一函数中添加延迟来解决这个问题。
Poll() 函数正在线程中调用并将事件发送到系统客户端 (SensorManager)。由于我们是直接从函数返回,没有任何延迟,事件将以更快的速度推送,没有时间调度其他线程。
要完成此操作,需要考虑延迟量。
关于Android HAL 使系统卡在 poll() 函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46482127/