启动优化中的一些黑科技,了解一下~启动速度优化是 android 开发中的常见需求,除了一些常规的手段之外,也有一些黑科 - 掘金
安卓锁屏灭屏流程解析-CSDN博客
安卓锁屏亮屏流程解析-CSDN博客
相关的类
PhoneWindowManager类实现接口WindowManagerPolicy,接口中提供相关函数如下:
startedGoingToSleep :开始睡眠操作
finishedGoingToSleep:完成睡眠操作
startedWakingUp:开始唤醒操作
finishedWakingUp:完成唤醒操作(此时屏幕已经亮起)
Android framework中屏幕熄灭及亮起时添加操作(以屏蔽按键未例)_phonewindowmanager 屏灭 收不到按键消息-CSDN博客
KeyguardViewMeditor:整个锁屏的调度类,相当于锁屏的大脑,控制着整个锁屏。
KeyguardService:负责锁屏模块和PWM(PhoneWindowManageer.java)和PMS(PowerManagerService.java)之间的沟通。
KeyguardUpdateMonitor:负责将锁屏的状态传递下去
StatusBarKeyguardViewManager:负责View的管理
KeyguardBouncer:专门负责Bouncer界面也就是安全锁界面的管理。
注意点:对于锁屏来说,灭屏时,锁屏就会进行加载,并且加载完成,之后在亮屏时进行显示。
Power灭屏关联函数
PWM中的finishedGoingToSleep()、startedGoingToSleep()方法
./frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java// Called on the PowerManager's Notifier thread.@Overridepublic void startedGoingToSleep(int displayGroupId,@PowerManager.GoToSleepReason int pmSleepReason) {if (DEBUG_WAKEUP) {Slog.i(TAG, "Started going to sleep... (groupId=" + displayGroupId + " why="+ WindowManagerPolicyConstants.offReasonToString(WindowManagerPolicyConstants.translateSleepReasonToOffReason(pmSleepReason)) + ")");}if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {return;}mRequestedOrSleepingDefaultDisplay = true;mIsGoingToSleepDefaultDisplay = true;// In case startedGoingToSleep is called after screenTurnedOff (the source caller is in// order but the methods run on different threads) and updateScreenOffSleepToken was// skipped. Then acquire sleep token if screen was off.if (!mDefaultDisplayPolicy.isScreenOnFully() && !mDefaultDisplayPolicy.isScreenOnEarly()&& com.android.window.flags.Flags.skipSleepingWhenSwitchingDisplay()) {updateScreenOffSleepToken(true /* acquire */, false /* isSwappingDisplay */);}if (mKeyguardDelegate != null) {mKeyguardDelegate.onStartedGoingToSleep(pmSleepReason);}} // Called on the PowerManager's Notifier thread.@Overridepublic void finishedGoingToSleep(int displayGroupId,@PowerManager.GoToSleepReason int pmSleepReason) {if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {return;}EventLogTags.writeScreenToggled(0);if (DEBUG_WAKEUP) {Slog.i(TAG, "Finished going to sleep... (groupId=" + displayGroupId + " why="+ WindowManagerPolicyConstants.offReasonToString(WindowManagerPolicyConstants.translateSleepReasonToOffReason(pmSleepReason)) + ")");}MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000);mRequestedOrSleepingDefaultDisplay = false;mIsGoingToSleepDefaultDisplay = false;mDefaultDisplayPolicy.setAwake(false);// We must get this work done here because the power manager will drop// the wake lock and let the system suspend once this function returns.synchronized (mLock) {updateWakeGestureListenerLp();updateLockScreenTimeout();}mDefaultDisplayRotation.updateOrientationListener();if (mKeyguardDelegate != null) {//此处调用的是KeyguardServiceDelegate类中的onFinishedGoingToSleep方法,// 此类中直接调用的KeyguardService中的方法,所以直接看KeyGuardSeervice.mKeyguardDelegate.onFinishedGoingToSleep(pmSleepReason,mCameraGestureTriggeredDuringGoingToSleep);// Unisoc bug 2526717: adapt screen off and on quickly by power button (1/2)if (pmSleepReason == PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON&& !mCameraGestureTriggeredDuringGoingToSleep) {setFinishedGoingToSleepByPowerButtonIfNeed();}}if (mDisplayFoldController != null) {mDisplayFoldController.finishedGoingToSleep();}mCameraGestureTriggeredDuringGoingToSleep = false;mCameraGestureTriggered = false;}
Power亮屏关联函数
亮屏时,KeyguardService先后会调用以下方法:onStartedWakeUp(),onScreenTurningOn(),onScreenTurnedOn(),锁屏亮屏显示布局的主要操作就在onScreenTurningOn()。
首先onScreenTurningOn在PWM中被调起,开始进行亮屏流程。
./frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java// Called on the DisplayManager's DisplayPowerController thread.//在 DisplayManager 的 DisplayPowerController 线程上调用。@Overridepublic void screenTurningOn(int displayId, final ScreenOnListener screenOnListener) {if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turning on...");reportScreenTurningOnToWallpaper(displayId);if (displayId == DEFAULT_DISPLAY) {Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn",0 /* cookie */);updateScreenOffSleepToken(false /* acquire */, false /* isSwappingDisplay */);mDefaultDisplayPolicy.screenTurningOn(screenOnListener);mBootAnimationDismissable = false;synchronized (mLock) {if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) {mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);//移除掉消息队列中的绘制超时消息 mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT,getKeyguardDrawnTimeout());//获取绘制时长后,发送绘制超时消息,完成绘制 mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);//调用KeyguardServiceDelegate.onScreenTurningOn()方法} else {if (DEBUG_WAKEUP) Slog.d(TAG,"null mKeyguardDelegate: setting mKeyguardDrawComplete.");mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE);}}} else {mScreenOnListeners.put(displayId, screenOnListener);Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, displayId /* cookie */);mWindowManagerInternal.waitForAllWindowsDrawn(mHandler.obtainMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE, displayId, 0),WAITING_FOR_DRAWN_TIMEOUT, displayId);}}// Called on the DisplayManager's DisplayPowerController thread.@Overridepublic void screenTurnedOn(int displayId) {if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turned on...");// Unisoc: Notifies the window manager that screen is being turned On.// SR: SR.695.001864.006623, SR.695.000988.002914.// Bug: 2585814, 2586728 @{mWindowManagerFuncs.screenTurnedOn(displayId);// @}reportScreenTurnedOnToWallpaper(displayId);if (displayId != DEFAULT_DISPLAY) {return;}synchronized (mLock) {if (mKeyguardDelegate != null) {mKeyguardDelegate.onScreenTurnedOn();}}mDefaultDisplayPolicy.screenTurnedOn();reportScreenStateToVrManager(true);}@Overridepublic void screenTurningOff(int displayId, ScreenOffListener screenOffListener) {mWindowManagerFuncs.screenTurningOff(displayId, screenOffListener);if (displayId != DEFAULT_DISPLAY) {return;}mRequestedOrSleepingDefaultDisplay = true;synchronized (mLock) {if (mKeyguardDelegate != null) {mKeyguardDelegate.onScreenTurningOff();}}}// Called on the PowerManager's Notifier thread.@Overridepublic void startedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) {if (DEBUG_WAKEUP) {Slog.i(TAG, "Started waking up... (groupId=" + displayGroupId + " why="+ WindowManagerPolicyConstants.onReasonToString(WindowManagerPolicyConstants.translateWakeReasonToOnReason(pmWakeReason)) + ")");}if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {return;}EventLogTags.writeScreenToggled(1);mIsGoingToSleepDefaultDisplay = false;mDefaultDisplayPolicy.setAwake(true);// Since goToSleep performs these functions synchronously, we must// do the same here. We cannot post this work to a handler because// that might cause it to become reordered with respect to what// may happen in a future call to goToSleep.synchronized (mLock) {updateWakeGestureListenerLp();updateLockScreenTimeout();}mDefaultDisplayRotation.updateOrientationListener();if (mKeyguardDelegate != null) {mKeyguardDelegate.onStartedWakingUp(pmWakeReason, mCameraGestureTriggered);}mCameraGestureTriggered = false;}// Called on the PowerManager's Notifier thread.@Overridepublic void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) {if (DEBUG_WAKEUP) {Slog.i(TAG, "Finished waking up... (groupId=" + displayGroupId + " why="+ WindowManagerPolicyConstants.onReasonToString(WindowManagerPolicyConstants.translateWakeReasonToOnReason(pmWakeReason)) + ")");}if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {return;}if (mKeyguardDelegate != null) {mKeyguardDelegate.onFinishedWakingUp();}if (mDisplayFoldController != null) {mDisplayFoldController.finishedWakingUp();}}
DisplayPolicy
Android系统中DisplayPolicy.java的updateSystemBarAttributes函数主要负责更新系统栏(状态栏和导航栏)的显示属性。根据搜索结果分析,该函数的主要作用包括:
- 管理系统栏的可见性:控制状态栏和导航栏的显示或隐藏状态
- 调整系统栏的颜色:设置状态栏和导航栏的背景颜色
- 适配焦点窗口变化:当窗口焦点发生变化时,更新系统栏的属性以适应新的焦点窗口
在Android系统中,DisplayPolicy是负责系统UI布局的关键组件,特别是导航栏和状态栏的布局管理。updateSystemBarAttributes函数作为其中的重要方法,确保了系统栏能够根据当前窗口状态和用户需求进行动态调整,提供更好的用户体验。
Android 12系统源码_SystemUI(七)DisplayPolicy构建状态栏和导航栏视图窗口区域坐标-CSDN博客