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 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值