我想知道是否有办法将传感器事件直接注入Android框架。 所以我首先通过OnSensorChanged中的Thread.dumpstack()检查传感器事件流。 (SensorActivity是我为测试所做的一项活动)
java.lang.Throwable: stack dump at java.lang.Thread.dumpStack(Thread.java:489)
at com.test.sensor.SensorActivity.onSensorChanged(SensorActivity.java:64)
at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:469)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
据此,我可以知道传感器事件由MessageQueue和Looper处理。
所以我想如果我可以将假传感器事件消息排入MessageQueue,Android框架将像往常一样处理传感器事件。
但是,我不知道传感器事件消息的外观以及如何排队。
我的问题是这些:
我应该在MessageQueue中添加什么消息来生成虚假的传感器事件?以及如何?
有没有其他方法可以注入假传感器事件?
我正在修改Android框架层(4.4.4)中的源代码,而不是在App层中。
提前致谢!!
答案 0 :(得分:0)
我认为你应该研究一下SenserService https://android.googlesource.com/platform/frameworks/native/+/90ed3e8d7883d9c80fb8bf11b1c593bd8b2b39d0/services/sensorservice/SensorService.cpp
答案 1 :(得分:0)
为了将假事件注入Android框架,应该对传感器HAL进行更改,其中应该停止来自内核端的事件。 此外,假事件应通过HAL发送到框架。 这将要求您创建API以与HAL和注入框架连接。
例如,您可以将实际的传感器事件存储在一个文件中,其中包含以下详细信息:
" 传感器类型,传感器延迟,X数据,Y数据,Z数据"。
然后创建一个SensorService模式,在注入模式下启用,来自内核的事件将被停止。在这里,您将使用传感器中先前保存的事件进行解析,这些事件将被注入传感器HAL传递给框架。
此外,如果您可以停止来自HAL的实际事件并将假事件传递给框架,它也应该也一样。