在文章MTK 唤醒时间分析中分析了内核中的主要的亮屏重要阶段,此篇文章结合上层的log一起来分析下整个系统的亮屏流程。整个流程可以分为如下几个部分:
(1)power键(home键)产生并上报(在input子系统中已经介绍);
(2)上层接收到到键值,PowerManagerService执行相关处理;
(3)PMS更新全局电源状态,并开始唤醒屏幕和背光,并通知各个模块(如图形绘制Keyguard);
(4)调用surfaceflinger开始执行屏幕的和背光的操作;
(5)调用到驱动中的late_resume(在MTK 唤醒时间分析中已经介绍);
一、PMS接收键值过程及更新全局状态:
当PowerMangerService接收到power键值后,会打印出调用的堆栈信息如下:
01-01 20:08:44.042224 981 1162 D PowerManagerService: |----com.android.server.power.PowerManagerService.wakeUpNoUpdateLocked(PowerManagerService.java:1750)
01-01 20:08:44.042242 981 995 D NetworkPolicy: no need to update restrict data rules for uid 1000
01-01 20:08:44.042271 981 1162 D PowerManagerService: |----com.android.server.power.PowerManagerService.wakeUpInternal(PowerManagerService.java:1741)
01-01 20:08:44.042282 981 995 D NetworkPolicy: no need to update restrict power rules for uid 1000
01-01 20:08:44.042374 981 1162 D PowerManagerService: |----com.android.server.power.PowerManagerService.-wrap43(PowerManagerService.java)
01-01 20:08:44.042415 981 1162 D PowerManagerService: |----com.android.server.power.PowerManagerService$BinderService.wakeUp(PowerManagerService.java:4261)
01-01 20:08:44.042458 981 1162 D PowerManagerService: |----android.os.PowerManager.wakeUp(PowerManager.java:769)
01-01 20:08:44.042505 981 1162 D PowerManagerService: |----com.android.server.policy.PhoneWindowManager.wakeUp(PhoneWindowManager.java:7421)
01-01 20:08:44.042548 981 1162 D PowerManagerService: |----com.android.server.policy.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:6874)
01-01 20:08:44.042579 981 1162 D PowerManagerService: |----com.android.server.wm.InputMonitor.interceptKeyBeforeQueueing(InputMonitor.java:465)
01-01 20:08:44.042609 981 1162 D PowerManagerService: |----com.android.server.input.InputManagerService.interceptKeyBeforeQueueing(InputManagerService.java:1897)
从上面的log中可以清晰的看到键值被InputManagerService.java的interceptKeyBeforeQueueing方法接收到:
private WindowManagerCallbacks mWindowManagerCallbacks;
private int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
return mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);
}
interceptKeyBeforeQueueing会调用到PhoneManagerService(PhoneWindowManager.java)中相同的方法如下:
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
case KeyEvent.KEYCODE_V