亮屏流程
PowerManagerService
updatePowerStateLocked--->updateDisplayPowerStateLocked-->
DisplayPowerController
-->requestPowerState-->updatePowerState->animateScreenStateChange->
-->setScreenState -->PhoneWindowManager.{screenTurningOff
(),screenTurnedOff(),screenTurningOn(),screenTurnedOn()}
//animateScreenBrightness设置流程
animateScreenBrightness -->
mScreenBrightnessRampAnimator.animateTo -->
mProperty.setValue(mObject, target)-->
DisplayPowerState. SCREEN_BRIGHTNESS. setValue --> DisplayPowerState.setScreenBrightness -->
scheduleScreenUpdate -->
postScreenUpdateThreadSafe.mScreenUpdateRunnable.run() -->
mPhotonicModulator.setState-->mLock.notifyAll() --> … -->
mBlanker.requestDisplayState(state, backlight)
/
setScreenState{
if(mPowerState.getColorFadeLevel() == 0.0f){
//ColorFade就是在手机屏幕的一层surface,当level为0是为一层黑帧,level为1.0时为透明)的值为0,表示屏幕还没有绘制好
//此时需要block screen直到window界面绘制完成。当需要亮屏时调用PhoneWindowManager的screenTurningOn函数,通知window屏幕就要点亮了,然后调用WMS中函数waitForAllWindowsDrawn函数等待将所有需要绘制的window绘制完成后回调回来,超时时间为1000ms。
//在WMS中获取需要绘制的window将其加入mWaitingForDrawn中等待绘制,通过检查mWaitingForDrawn是否为空来判断,window是否绘制完成。此时screenTurningOn函数就执行完了,剩下的就是等待windows绘制完成
blockScreenOn --> ..new ScreenOnUnblocker--
>WindowManagerPolicy.ScreenOnListener.onScreenOn[...<finishWindowDraw>.--
>.finishScreenTurningOn-->onScreenOn]-->H.MSG_SCREEN_ON_UNBLOCKED.---
>unblockScreenOn(Unblocked screen on after " + delay + " ms),updatePowerState
}else{
unblockScreenOn -->
}
}
///
/
PhoneWindowManager
state transition on -> turningOff -> off.
{screenTurningOff,screenTurnedOff,screenTurningOn,screenTurnedOn}
KeyguardServiceDelegate
{onScreenTurningOff,onScreenTurnedOff,onScreenTurningOn(锁屏绘制等操作),screenTurnedOn}
delay 1000ms
--->PhoneWindowManager.screenTurningOn-->PhoneWindowManager.finishKeyguardDrawn-->WAITING_FOR_DRAWN_TIMEOUT 1000ms
WindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback,WAITING_FOR_DRAWN_TIMEOUT) -->H.MSG_WINDOW_MANAGER_DRAWN_COMPLETE -->
PhoneWindowManager.finishWindowsDrawn --> PhoneWindowManager.finishScreenTurningOn-->{
ScreenOnListener listener;
listener.onScreenOn();
DisplayPowerController.onScreenOn---->unblockScreenOn,updatePowerState
WindowManagerService.enableScreenIfNeeded()
}
///
WindowManagerService.enableScreenIfNeeded()-->WindowManagerService.performEnableScreen{android.ui.ISurfaceComposer}
/
WindowManagerService.waitForAllWindowsDrawn--->
DisplayContent.waitForAllWindowsDrawn -->
传感器流程
android_hardware_SensorManager.dispatchSensorEvent-->SystemSensorManager.dispatchSensorEvent-->
SensorManager.onSensorChanged->
-->app调用,传感器注册流程
SensorManager.registerListener-->
SystemSensorManager.registerListenerImpl-->
SystemSensorManager$BaseEventQueue.addSensor-->
SystemSensorManager$BaseEventQueue.enableSensor-->
SystemSensorManager$BaseEventQueue.nativeEnableSensor-->
SensorEventQueue::enableSensor-->
SensorService::SensorEventConnection::enableDisable -->
SensorService::enable -->
SensorDevice::activate -->
ps_enable_nodata-->
ps_enable_and_batch-->
ps_store_active-->
dev_attr_store
Event log
# Application process has been started
am_proc_start
AMS.startProcessLocked -->{AMS.startProcess,Process.start,AMS.handleProcessStartedLocked-->ProcessList.handleProcessStartedLocked(am_proc_start)}
# Application process bound to work
am_proc_bound
//应用进程绑定,main()方法通过thread.attach(false)绑定应用进程
ActivityThread.main-->ActivityThread.attach-->AMS.attachApplication-->AMS.attachApplicationLocked(am_proc_bound)
# A new activity is being created in an existing task:
am_create_activity
ActivityStarter.startActivity-->ActivityStarter.startActivityUnchecked(am_create_activity)-->
->ActivityStackSupervisor.resumeFocusedStackTopActivityLocked
# An activity has been resumed into the foreground but was not already running:
am_restart_activity
ActivityStack.resumeTopActivityInnerLocked-->ActivityStackSupervisor.startSpecificActivityLocked-->
//另外如果进程不存在则创建进程mService.startProcessLocked,有则走realStartActivityLocked
-->ActivityStackSupervisor.realStartActivityLocked(am_restart_activity)
#Activity set to resumed
am_set_resumed_activity
ActivityStackSupervisor.startSpecificActivityLocked-->ActivityStackSupervisor.realStartActivityLocked-->ActivityStack.minimalResumeActivityLocked{
(am_set_resumed_activity) Event log TAG
completeResumeLocked
mStackSupervisor.getLaunchTimeTracker().setLaunchTime(r);
}
Exp:
am_set_resumed_activity: [0,com.facebook.katana/.gdp.ProxyAuthDialog,minimalResumeActivityLocked]
//其他已经启动过,resume恢复走的流程
am_set_resumed_activity: [0,com.android.launcher3/com.android.launcher3.Launcher,resumeTopActivityInnerLocked]
ActivityThread.Idler.queueIdle--->ActivityManagerService.activityIdle-->ActivityStackSupervisor.activityIdleInternalLocked(--->ActivityStack.stopActivityLocked
EventLogTags.writeAmStopActivity(r.userId, System.identityHashCode(r), r.shortComponentName);
Exp:
am_stop_activity: [0,199090439,com.android.settings/.Settings]
ActivityStack.resumeTopActivityInnerLocked--->ActivityStackSupervisor.pauseBackStacks--->ActivityStack.startPausingLocked
EventLogTags.writeAmPauseActivity(prev.userId, System.identityHashCode(prev),
prev.shortComponentName, "userLeaving=" + userLeaving);
Exp:
am_pause_activity:
[0,38527759,com.android.launcher3/com.android.launcher3.Launcher,userLeaving=true]
# The activity's onCreate has been called.
am_on_create_called 应用onCreate执行完才会打印
ActivityThread.handleLaunchActivity-->Instrumentation.callActivityOnCreate-->activity.performCreate(am_on_create_called)-->activity.onResume()
Activity.performResume-->Instrumentation.callActivityOnResume()-->activity.onResume();
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked --->
ActivityStack.resumeTopActivityInnerLocked --->
ActivityStackSupervisor.startSpecificActivityLocked-->
getLaunchTimeTracker().setLaunchTime(r);====>LaunchTimeTracker.setLaunchTime-->LaunchTimeTracker.Entry.setLaunchTime-->
-->
r.fullyDrawnStartTime = r.displayStartTime = SystemClock.uptimeMillis();
/
AppWindowToken.updateReportedVisibilityLocked-->这个函数会在WMS的多个地方调用,但凡有窗口变化必然会调用这个函数
AppWindowContainerController.H.handleMessage.NOTIFY_WINDOWS_DRAWN:mListener.onWindowsDrawn(msg.getWhen())-->
-->ActivityRecord.onWindowsDrawn--->ActivityRecord.reportLaunchTimeLocked
final long thisTime = curTime - displayStartTime;
final long totalTime = entry.mLaunchStartTime != 0? (curTime - entry.mLaunchStartTime) : thisTime;
curTime表示该函数调用的时间点.
displayStartTime表示一连串启动Activity中的最后一个Activity的启动时间点.
mLaunchStartTime表示一连串启动Activity中第一个Activity的启动时间点.
应用启动包括进程启动、走 Activity生命周期 onCreate/onResume 等。在第一次 onResume 时添加窗口到WMS中,然后
measure/layout/draw,窗口绘制完成后通知 WMS,WMS 在合适的时机控制界面开始显示(夹杂了界面切换动画逻辑)。记住是窗口界面显示出
来后,WMS 才调用reportLaunchTimeLocked() 通知 AMS Activity 启动完成
EventLog.writeEvent(AM_ACTIVITY_LAUNCH_TIME,userId, System.identityHashCode(this), shortComponentName,thisTime, totalTime);
在Activity的handleLaunchActivity中先后会调用Activity的onCreate和onResume函数,然后才是到WMS的addWindow创建窗口(窗口创建了
之后才会把所有和这个AppWindowToken的窗口置为一个准备显示的状态,这个时候就会去打印这个log,也会计算这个延时)并且最后的显示
界面还是靠VSync信号驱动的
App跟AMS通信,会建立Session连接到WMS,后续便通过IWindowSesson跟WMS通信;
WMS跟SF通信,WMS建立SurfaceComposerClient,然后会在SF中创建Client与之对应, 后续便通过ISurfaceComposerClient跟SF通信;
WindowManagerService.openSession(new Session())--->
Session.relayout-->WindowManagerService.relayoutWindow-->
WindowSurfacePlacer.performSurfacePlacement(loopCount = 6)-->WindowSurfacePlacer.performSurfacePlacementLoop{WM:wmLayout}
///IWindowSession主要是App与WMS进行交互的类,它在ViewRootImpl中声明, 在ViewRootImpl构造函数中实例化
WindowManagerImpl.addView-->WindowManagerGlobal.addView -->
ViewRootImpl.setView-->IWindowSession.addToDisplay--->WMS.addWindow{new
WindowToken,new WindowState}
///
ActivityStack.startPausingLocked -->ActivityStack.schedulePauseTimeout-->post(PAUSE_TIMEOUT_MSG),delay PAUSE_TIMEOUT
(500ms)
onResume之后ViewRootImpl.setView之后再relayout,打印的部分堆栈.
08-13 12:02:42.527 20372 20372 I am_on_start_called: [0,com.cyin.himgr.ads.SplashActivity,handleStartActivity]
08-13 12:02:42.534 20372 20372 I am_on_resume_called: [0,com.cyin.himgr.ads.SplashActivity,RESUME_ACTIVITY]
//
08-13 12:02:42.565 20372 20372 D ViewRootImpl: SPD setView,
08-13 12:02:42.565 20372 20372 D ViewRootImpl: java.lang.Throwable: SPD
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.view.ViewRootImpl.setView(ViewRootImpl.java:895)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:384)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3999)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
08-13 12:02:42.565 20372 20372 D ViewRootImpl: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1861)
///
08-13 12:02:42.565 20372 20372 V PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@5d45da5, this = DecorView@292557a[SplashActivity]
08-13 12:02:42.586 1068 1250 V WindowManager: SPD Relayout Window{76fbad2 u0 com.android.master/com.cyin.himgr.ads.SplashActivity}: viewVisibility=0 req=720x1548 {(0,0)(fillxfill) sim=
{adjust=pan forwardNavigation} ty=BASE_APPLICATION wanim=0x10302f8
08-13 12:02:42.586 1068 1250 V WindowManager: java.lang.Throwable
08-13 12:02:42.586 1068 1250 V WindowManager: at com.android.server.wm.WindowManagerService.relayoutWindow(WindowManagerService.java:2072)
08-13 12:02:42.586 1068 1250 V WindowManager: at com.android.server.wm.Session.relayout(Session.java:245)
08-13 12:02:42.586 1068 1250 V WindowManager: at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:309)
08-13 12:02:42.586 1068 1250 V WindowManager: at com.android.server.wm.Session.onTransact(Session.java:165)
/
wm是ViewManager,ViewManager是个接口,而WindowManager继承了ViewManager,WindowManagerImpl实现了WindowManager
ActivityThead.handleResumeActivity-->wm.addView-->
WindowManagerImpl.addView()--->
WindowManagerGlobal.addView-->{new ViewRootImpl(),}
ViewRootImpl.setView-->
{
1.requestLayout;
2.new InputChannel();
3.mWindowSession.addToDisplay;
4.new InputQueue();
5.mInputQueueCallback.onInputQueueCreated(mInputQueue);
6.new WindowInputEventReceiver(mInputChannel,Looper.myLooper());
}
1.-->scheduleTraversals{
mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
scheduleConsumeBatchedInput();
notifyRendererOfFramePending();
pokeDrawLockIfNeeded();
....
}
3.-->Session.addToDisplay-->
WindowManagerService.addWindow{new WindowState();updateFocusedWindowLocked()}-->
{new WindowState()->new WindowStateAnimator()}
-->WindowState.attach()-->
Session.windowAddedLocked(){new SurfaceSession()}-->
android_view_SurfaceSession.cpp{new SurfaceComposerClient()}-->
/
WMS.updateFocusedWindowLocked-->computeFocusedWindowLocked-->findFocusedWindowLocked-->performLayoutLockedInner
WMS.addWindow-->{
....
updateFocusedWindowLocked,
InputMonitor.setInputFocusLw,
InputMonitor.updateInputWindowsLw
....
}
APP创建部分流程
ActivityThread.main-->
{
new ActivityThread;
ActivityThread.attach(false)
}
-->ActivityThread.attach-->
{
1.AMS.attachApplication;
new Instrumentation()
}
1.-->AMS.attachApplicationLocked-->ActivityThread.bindApplication-->H.BIND_APPLICATION-->ActivityThread.handleBindApplication-->
{
installContentProviders-->AMS.publishContentProviders
1.data.info.makeApplication;
2.mInstrumentation.onCreate
3.mInstrumentation.callApplicationOnCreate(app);
}
1.-->LoadedAPK.makeApplication{mActivityThread.mInstrumentation.newApplication}-->Instrumentation.newApplication
{
Application app.attach(context);
}
2.-->
3.-->Application.onCreate()
ANR dump流程
ANR dump
ActivityManagerService.inputDispatchingTimedOut{mAppErrors.appNotResponding}-->
AppErrors.appNotResponding{mService.mAnrManager.startAnrDump}--->
ANRManagerImpl.startAnrDump-->
{startAnrDump}
ANRManagerService.startAnrDump-->ANRManagerService.dumpAnrDebugInfo-->ANRManagerService.dumpAnrDebugInfoLocked-->
{dumpStackTraces begin!}
ActivityManagerService.dumpStackTraces--->
{
(// We must complete all stack dumps within 20 seconds. every function)
dumpJavaTracesTombstoned
dumpWithTimeout
dumpNativeBacktraceToFileTimeout
}
{dumpStackTraces end!}
//then log out ANR in........
info.append("ANR in ").append(dumpRecord.mProcessName);
...
Slog.i(TAG, info.toString());
-->
frameworks/base/services/core/java/com/android/server/am/AppErrors.java
void appNotResponding(....){
...
// Log the ANR to the event log.
EventLog.writeEvent(EventLogTags.AM_ANR, app.userId, app.pid,
app.processName, app.info.flags, annotation);
...
}
destorySurface 调用流程:
Activity切后台onPause 后没有执行onStop方法,所以在onStop里执行finish也是执行不到的;
没有执行onStop原因,是P上的新的算法:
当切后台后 执行onPause后如果 mian线程还有message没有处理完 是不会执行onStop方法的。 理由:系统在resume的时候 会注册一个idle的 message在 app mian线程的loop最后面, 只要main looper有消息 就不会执行 idle的message 。这个idle的mesage就是去执行onstop方法的。
frameworks/base/core/java/android/app/ActivityThread.java
handleResumeActivity()
//方法最后一行 :
Looper.myQueue().addIdleHandler(new Idler());
completePauseLocked -->
addToStopping -->
mStackSupervisor.scheduleIdleLocked-->
mHandler.sendEmptyMessage(IDLE_NOW_MSG);-->
activityIdleInternal -->
activityIdleInternalLocked -->
stack.stopActivityLocked(r); -->
mService.getLifecycleManager().scheduleTransaction -->
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); -->
mTransactionExecutor.execute(transaction); -->
executeCallbacks(transaction); -->
item.postExecute(mTransactionHandler, token, mPendingActions); -->
PendingTransactionActions$StopInfo.run -->
ActivityManagerService.activityStopped -->
ActivityRecord.activityStoppedLocked -->
AppWindowContainerController.notifyAppStopped -->
AppWindowToken.notifyAppStopped -->
AppWindowToken.destroySurfaces