亮屏流程
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