为了说明Android4.1和Android4.0在输入子系统这部分的变化,首先,我们来看两幅图:
Android4.1和Android4.0输入子系统的比较
从上面两幅图可以看出,Android4.1和Android4.0有如下不同点:
(1)系统进程向应用进程传输InputEvent的方式发生变化,Android4.0采用共享内存的方式,
而Android4.1采用socket套接字的方式;
(2) 应用进程接收到InputEvent后,对事件处理的方式发生变化,Android4.0采用FIFO的方式,将接收到的
InputEvent顺序的上发给应用层,即收一个,发一个;而Android4.1采用批量接收,批量存储的方式,将收
到的一批InputEvent中的第一个事件立即上报给应用层,剩余的事件全部暂存到缓冲区,等收到空消息后,
再去处理已经存到缓冲区里面的数据;
Android4.1输入子系统的性能改进分析
(1)使用socket套接字替代之前使用共享内存的方法,在传输效率上有提高。虽然共享内存较本机内socket套接
字传输速度快,但是多了两道加锁 (其中一道是共享内存的互斥访问加锁,另一道是进程间访问互斥锁)
和两道解锁,而每次接收消息都要去执行这四道加、解锁操作,会增加系统开 销,从而降低传输性能;TP
报点属于高频率事件,因此在高频率触发的条件下,从整体性能方面来讲,使用共享内存 会比使用socket
的整体效果差。
(2) 使用socket套接字替代之前使用共享内存的方法,在传输能力上有提高。此处的传输能力是指,在高频率
报点条件下,系统传输和接收InputEvent的能力。Android4.0采用共享内存按照FIFO的方式传输数据,接收
端收到一个数据后立即上报,这样会有局限性。假如TP报点率足够高,会使得发送InputEvent的频率很
高,若此时接收端处理不够快,那么后发送的数据有可能会去覆盖前面已发送但仍存在共享内存中的数
据,这样会造成丢点。而采用socket方式不会存在此问题,因为socket会在内核空间开辟两个缓冲区,一个
用来发送数据,另一个用来接收数据。当发送数据太快时,会暂存在发送缓冲区,而接收缓冲区用来接收
对端的数据,调用recv接口时,只是将内核缓冲区里面的数据拷贝到用户缓冲区,因此不会存在丢失数据的
情况,在传输能力方面会更强。
(3) Android4.1在响应UI速度方面有很大的改进。使用socket接收到批量数据后,会立即将第一个数据上传到应
用层,将其余数据全部存到缓冲区里面。待接收到空数据后,再去处理缓冲区里面的数据,而处理时间则
是和显示UI的VSYNC信号同步,即刷新画面时会去处理InputEvent。这样保证了UI响应的及时性和可靠
性。而Android4.0的Input事件处理和UI的显示处理没有任何关系,在响应效果方面不及4.1系统。
Android4.1输入子系统优、缺点总结
优点:
(1)传输InputEvent的速度更快
(2)传输InputEvent的能力(容量)更强
(3)响应UI变化的速度更快
缺点:
(1)中间层算法有漏洞,可能会造成TP划线不圆润的问题
(2)对TP的报点率要求更高,在选型上需特别注意