Mark 部分流程(亮屏, Event log,傳感器,APP創建,ANR dump, destorySurface )

 亮屏流程


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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章