android kitkat activity launch flow charles_liu 2014.09.24

Post on 16-Jan-2016

229 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Android KitKat Activity Launch Flow

charles_liu

2014.09.24

- 2 -

Table

• Data Structure

• AMS Flow

• WMS Flow

• Q&A

- 3 -

Data Structure

• Data Structure1.Activity

An activity is a single, focused thing that the user can do.

它是与用户交互的基本单元。

2.ActivityThread

This manages the execution of the main thread in an application process, scheduling and executing activities, broadcasts, and other operations on it as the activity manager requests. 每一个 App 进程有一个主线程,它由 ActivityThread 描述。它负责这个 App 进程中各个 Activity 的调度和执行,以及响应AMS 的操作请求等。

- 4 -

Data Structure

• Data Structure3.ApplicationThread

AMS 和 Activity 通过它进行通信。对于 AMS 而言, ApplicationThread代表了 App 的主线程。简而言之,它是 AMS 与 ActivityThread 进行交互的接口。注意 ActivityThread 和 ApplicationThread 之间的关系并不像 Activity 与 Application 。后者的关系是 Application 中包含了多个Activity ,而前者 ActivityThread 和 ApplicationThread 是同一个东西的两种 "View" , ApplicationThread 是在 AMS 眼中的 ActivityThread 。4. ViewRootImpl

The top of a view hierarchy, implementing the needed protocol between Viewand the WindowManager. This is for the most part an internal implementation detail of {@link WindowManagerGlobal}. 主要责任包括创建 Surface ,和 WMS 的交互和 App 端的 UI 布局和渲染。同时负责把一些事件发往 Activity 以便 Activity 可以截获事件。每一个添加到 WMS 中的窗口对应一个 ViewRootImpl ,通过WindowManagerGlobal 向 WMS 添加窗口时创建。大多数情况下,它管理 Activity 顶层视图 DecorView 。

- 5 -

Data Structure

• Data Structure5.ViewRootImpl::W

用于向 WMS 提供接口,让 WMS 控制 App 端的窗口。它可看作是个代理,很多时候会调用 ViewRootImpl 中的功能。6. WindowManagerImpl

Provides low-level communication with the system window manager for operations that are bound to a particular context, display or parent window.Instances of this object are sensitive to the compatibility info associatedwith the running application. Activity 中与窗口管理系统通信的代理类,实现类是WindowManagerGlobal 。 WindowManagerGlobal 是 App 中全局的窗口管理模块,因此是个 Singleton 。其中管理着该 App 中的ViewRootImpl , DecorView 等结构。

- 6 -

Data Structure

• Data Structure7.AMS ( ActivityManagerService)Activity 的管理者。其实除了 Activity , AMS 也管 Service 等组件信息,另外 AMS 还管理 Process 信息。8. ActivityRecord

An entry in the history stack, representing an activity

描述单个 Activity , Activity 堆栈中的基本单元。9. ActivityRecord::Token

对应 ActivityRecord 的 IBinder 对象,可以看作远程对象的本地句柄。10. ProcessRecord

Full information about a particular process that is currently running

描述一个 App 进程,包含了该进程中的 Activity 和 Service 列表。

- 7 -

Data Structure

• Data Structure11. TaskRecord

TaskRecord 中的 mActivities 是 ActivityRecord 的列表,它们是按照历史顺序排序的。12. ActivityStack

State and management of a single stack of activities

Activity 堆栈,其中的 ActivityRecord 是通过 TaskRecord 这一层间接地被管理着。13. ActivityStackSupervisor

ActivityStackSupervisor 是 ActivityStack 的总管。 4.4 中默认引入了两个 ActivityStack ,一个叫 Home stack ,放 Launcher 和 systemui , id为 0 ;另一个是 Applicationstack ,放 App 的 Activity , id 可能是任意值。

- 8 -

Data Structure

• Data Structure14. WMS(WindowManagerService)

窗口的管理者。 WMS 主要责任是维护窗口堆栈,计算每个窗口的layer 信息交给 SF ,替 App 申请和调整绘图 Surface ,当窗口显示状态变化了还要通知其它模块,另外还要处理系统输入 .

15. WindowState

A window in the window manager.WMS 中最基本的元素,描述 WMS中的一个窗口。它既可以是由 App 添加过来的 View ,也可以是系统创建的系统窗口。16. Session

This class represents an active client session. There is generally one

Session object per process that is interacting with the window manager向 App 提供 IWindowSession 接口让其可以和 WMS 通信。每个 App在 WMS 有一个 Session 对象, App 就是通过这个 Session 来向 WMS发出窗口管理申请的。

- 9 -

Data Structure

• Data Structure17. Surface

Handle onto a raw buffer that is being managed by the screen compositor.是在 App 端管理图形缓冲区的类 , 其中最重要的是图形缓冲区队列。经由 WMS 从 SF 中得到 IGraphicBufferProducer 接口对象BufferQueue 后, Surface 便可以从该队列中 queue 和 dequeue 图形缓冲区。

18. SurfaceSession

An instance of this class represents a connection to the surface flinger, from which you can create one or more Surface instances that will be composited to the screen. WMS 和 SF 之间的会话。每个 App 会在 WMS 中有一个对应的 SurfaceSession ,也会有一个相应的 SurfaceComposerClient。用于向 SF 申请和设置图形缓冲区等。

- 10 -

Data Structure

• Data Structure19. WindowToken

Container of a set of related windows in the window manager. Often this is an AppWindowToken, which is the handle for an Activity that it uses to display windows. For nested windows, there is a WindowToken created for the parent window to manage its children

描述 WM中一组相关的窗口,这些 Window对应的 WindowState放在其成员 windows里。其主要继承类 AppWindowToken,它是针对 App的 WindowToken结

构。 WindowState中的 mAppToken指向所属的 AppWindowToken,如果是系统窗口

, mAppToken为空, mToken指向 WindowToken对象。18. AppWindowToken

每个 App 的 Activity 对应一个 AppWindowToken 。其中的 appToken 为IApplicationToken 类型,连接着对应的 AMS 中的 ActivityRecord::Token 对象,有了它就可以顺着 AppWindowToken 找到 AMS 中相应的 ActivityRecord 。

其中 allAppWindows 是一个无序的列表,包含该 Activity 中所有的窗口。

- 11 -

App应用窗口交互接口

- 12 -

WindowManagerGlobal示例

• 管理两个 activity 的数据结构

- 13 -

ActivityRecord管理结构

- 14 -

AMS FLOW

1.Activity startactivity

- 15 -

AMS FLOW

2. Instrumentation#execStartActivity

- 16 -

AMS FLOW

3. AMS#StartActivity

- 17 -

AMS FLOW

4. ActivityStackSupervisor#StartActivityMayWait

- 18 -

AMS FLOW

5. ActivityStackSupervisor#StartActivityLocked

- 19 -

AMS FLOW

6. ActivityStackSupervisor#StartActivityUncheckedLocked

- 20 -

AMS FLOW

7. ActivityStackSupervisor#adjustStackFocus

- 21 -

AMS FLOW

8. WMS#createStack

- 22 -

AMS FLOW

- 23 -

AMS FLOW

9. ActivityStack#createTaskRecord

- 24 -

AMS FLOW

10. ActivityStack#startActivityLocked

- 25 -

AMS FLOW

11. ActivityStack#startActivityLocked

- 26 -

AMS FLOW

12. WMS#addAppToken

- 27 -

AMS FLOW

13. ActivityStack#startActivityLocked

- 28 -

AMS FLOW

14. ActivityStackSupervisor#resumeTopActivitiesLocked

- 29 -

AMS FLOW

15. ActivityStack#resumeTopActivitiesLocked

- 30 -

AMS FLOW

17. ActivityStack#startPausingLocked

- 31 -

AMS FLOW

17( 续 ). ActivityStack#startPausingLocked

- 32 -

AMS FLOW

18. ApplicationThread#schedulePauseActivity

- 33 -

AMS FLOW

19. ApplicationThread#H

- 34 -

AMS FLOW

20. ApplicationThread#handlePauseActivity

- 35 -

AMS FLOW

21. ApplicationThread#performPauseActivity

- 36 -

AMS FLOW

22. Instrumentation#callActivityOnPause

- 37 -

AMS FLOW

23. Activity#performPause

- 38 -

AMS FLOW

24. AMS#activityPaused

- 39 -

AMS FLOW

25. ActivityStack#activityPausedLocked

- 40 -

AMS FLOW

26. ActivityStack#completePauseLocked

- 41 -

AMS FLOW

- 42 -

AMS FLOW

27. ActivityStackSupervisor#resumeTopActivitiesLocked

- 43 -

AMS FLOW

28. ActivityStack#resumeTopActivitiesLocked

- 44 -

AMS FLOW

29. ActivityStackSupervisor#startSpecificActivityLocked

- 45 -

AMS FLOW

30. AMS#startProcessLocked

- 46 -

AMS FLOW

31. AMS#newProcessRecordLocked

- 47 -

AMS FLOW

32. ProcessRecord #ProcessRecord

- 48 -

AMS FLOW

33. AMS#startProcessLocked

- 49 -

AMS FLOW

34. Process#start

- 50 -

AMS FLOW

35. ActivityThread#main

- 51 -

AMS FLOW

36. ActivityThread#ActivityThread

- 52 -

AMS FLOW

37. ActivityThread#attach

- 53 -

AMS FLOW

38. WMS#attachApplicationLocked

- 54 -

AMS FLOW

39. ApplicationThread#bindApplication

- 55 -

AMS FLOW

40. ActivityThread#H

- 56 -

AMS FLOW

41. ActivityThread#handleBindApplication

- 57 -

AMS FLOW

42. ActivityStackSupervisor#attachApplicationLocked

- 58 -

AMS FLOW

43. ActivityStackSupervisor#realStartActivityLocked

- 59 -

AMS FLOW

- 60 -

AMS FLOW

44. ApplicationThread#scheduleLaunchActivity

- 61 -

AMS FLOW

45. ActivityThread#H

- 62 -

AMS FLOW

46. ActivityThread#handleLaunchActivity

- 63 -

AMS FLOW

47. ActivityThread#performLaunchActivity

- 64 -

AMS FLOW

47( 续 ). ActivityThread#performLaunchActivity

- 65 -

AMS FLOW

48. Instrumentation#newActivity

Application

- 66 -

AMS FLOW

49. Application#Application

Application

- 67 -

AMS FLOW

50. Activity#attach

- 68 -

AMS FLOW

51. Policy#makeNewWindow

- 69 -

AMS FLOW

52. PhoneWindow#PhoneWindow

- 70 -

AMS FLOW

53. Window#set get

- 71 -

AMS FLOW

54. Instrumentation#callActivityOnCreate

- 72 -

AMS FLOW

55. Activity#performCreate

- 73 -

AMS FLOW

56. Activity#onCreatesetContentView

- 74 -

AMS FLOW

57. PhoneWindow#setContentView

- 75 -

AMS FLOW

58. PhoneWindow#installDecor

- 76 -

AMS FLOW

- 77 -

AMS FLOW

59. ActivityThread#handleResumeActivity

- 78 -

AMS FLOW

60. ActivityThread#performResumeActivity

- 79 -

AMS FLOW

61. Activity#performResume

- 80 -

AMS FLOW

62. Activity#performRestart

- 81 -

AMS FLOW

63. Instrumentation#callActivityOnResume

- 82 -

AMS FLOW

64. WindowManagerImpl#addView

- 83 -

AMS FLOW

- 84 -

WMS FLOW

65. WindowManagerGlobal#addView

- 85 -

WMS FLOW

66. ViewRootImpl#ViewRootImpl

- 86 -

WMS FLOW

67. WindowManagerGlobal#getWindowSession

- 87 -

WMS FLOW

68. WMS#openSession

- 88 -

WMS FLOW

69. Session#Session

- 89 -

WMS FLOW

- 90 -

WMS FLOW

70. ViewRootImpl#setView

- 91 -

WMS FLOW

71. Session#addToDisplay

- 92 -

WMS FLOW

72. WMS#addWindow

- 93 -

WMS FLOW

73. WMS#getDisplayContentLocked

- 94 -

WMS FLOW

74. WindowState#WindowState

- 95 -

WMS FLOW

75. PhoneWindow#adjustWindowParamsLw

- 96 -

WMS FLOW

76. PhoneWindow#prepareAddWindowLw

- 97 -

- 98 -

WMS FLOW

77. WMS#addWindow( 续 )

- 99 -

WMS FLOW

78. WindowState#attach

- 100 -

WMS FLOW

79. Session#windowAddedLocked

- 101 -

WMS FLOW

80. SurfaceSession#SurfaceSession

- 102 -

- 103 -

WMS FLOW

81. ViewRootImpl#requestLayout

- 104 -

WMS FLOW

82. ViewRootImpl#scheduleTraversals

- 105 -

WMS FLOW

83. ViewRootImpl#TraversalRunnable

- 106 -

WMS FLOW

84. ViewRootImpl#TraversalRunnable

- 107 -

WMS FLOW

85. ViewRootImpl#doTraversal

- 108 -

WMS FLOW

86. ViewRootImpl#performTraversals

- 109 -

WMS FLOW

86( 续 ). ViewRootImpl#performTraversals

- 110 -

WMS FLOW

87. ViewRootImpl#relayoutWindow

- 111 -

WMS FLOW

88. Session#relayout

- 112 -

WMS FLOW

89. WMS#relayoutWindow

- 113 -

WMS FLOW

90. WindowStateAnimator#createSurfaceLocked

- 114 -

WMS FLOW

SurfaceLocked

SurfaceControl 是 Android4.3 新引入的类, Google 从之前的 Surface类中拆出来部分接口,定义成 SurfaceControl 。这样做的目的是要使结构更清晰, wms 只能对 SurfaceControl 进行控制,但并不能更新Surface 里面的内容。主要控制 Surface 的创建、销毁、 Zorder 、透明度、显示隐藏等。真正更新途径是, View 通过 Canvas 的接口将内容画到 Surface 上。当然 View 操作的 Surface 也是通过SurfaceControl 来实现的, SurfaceControl 会被转换成 Surface 对象,然后回传给 ViewRootImpl ,这样前面创建的空的 Surface 就有了实质的内容。

- 115 -

WMS FLOW

91. WMS#performLayoutAndPlaceSurfacesLocked

- 116 -

WMS FLOW

92. WMS#performLayoutAndPlaceSurfacesLockedLoop

- 117 -

WMS FLOW

93. WMS#performLayoutAndPlaceSurfacesLockedInner

- 118 -

WMS FLOW

94. WMS#performLayoutLockedInner

- 119 -

WMS FLOW

95. PhoneWindowManager#beginLayoutLw

- 120 -

WMS FLOW

96. PhoneWindowManager#layoutWindowLw

- 121 -

WMS FLOW

97. WindowState#computeFrameLw

- 122 -

WMS FLOW

98. PhoneWindowManager#finishLayoutLw

- 123 -

WMS FLOW

- 124 -

WMS FLOW

- 125 -

WMS FLOW

99. ViewRootImpl#performMeasure

- 126 -

WMS FLOW

100. View#Measure

- 127 -

WMS FLOW

100( 续 ). View#Measure

- 128 -

WMS FLOW

101. FrameLayout#onMeasure

- 129 -

- 130 -

WMS FLOW

102. performMeasureAndroid 系统希望程序员能够理解画布( Canvas )是没有边界的,即无穷大。程序员可以在画布上绘制任意多任意大的东西(只要内存足够)。我们在配置视图布局的时候可以配置具体的值(比如 xxdp ),可以配置相对值(比如WRAP_CONTENT 、 MATCH_PARENT ) ,measure 过程就是把视图布局中的相对值转换为具体值,最后保存在 mMeasuredWidth 和 mMeasureHeight 中。measure 过程中一个关键调用就是 View.measure ,该方法是 final 的,因此不能被重载,该函数会回调 onMeasure 方法 .DecorView 继承 FrameLayout 是一个 View 的子类,则执行 FrameLayout 的 onMeasure , FrameLayout 是一个 ViewGroup 的对象则在重写 onMeasure 方法的时候需要调用 ViewGroup 的 measureChildWithMargins 来对它的子视图进行计算。

- 131 -

WMS FLOW

103. ViewRootImpl#performLayout

- 132 -

- 133 -

WMS FLOW

104. performLayoutView.layout的目的就是父视图按照子视图的大小和布局参数,将子图放置到合适的位置上。布局过程主要是通过调用 View.layout实现的。1. 调用 setFrame将位置的参数保存起来。如果这些值跟以前的相同则什么也不做,如果不同则进行重新赋值,并在赋值前,会给 mPrivateFlags添加PFLAG_DRAWN的标识,同时调用 invalidate告诉系统 View视图原先占用的位置需要重绘。2. 回调 onLayout , View本身的 onLayout什么也不做,提供此方法是为了方便 ViewGroup进行重写来对它的子视图进行布局3.DecorView类是通过 FrameLayout类来间接继承 View类的,并且它的成员函数 onLayout是从 FrameLayout类继承下来的,因此调用 FrameLayout类的成员函数 onLayout的实现子视图布局

- 134 -

WMS FLOW

105. ViewRootImpl#performDraw

- 135 -

WMS FLOW

106. ViewRootImpl#Draw

判断是否开启了硬件加速。如果开启了硬件加速,会调用attachInfo.mHardwareRenderer.draw 函数。 AttachInfo 是 View 的内部类,当 View 被Attach 到窗口上的时候,会实例化该类。HardwareRenderer 是个抽象类,具体实现在类 GLES20Renderer 中。 (HardwareRenderer, GLRenderer , GLES20Renderer 三个类都在 core\java\android\view\HardwareRenderer.java 里 )

- 136 -

WMS FLOW

106( 续 ). ViewRootImpl#Draw

- 137 -

WMS FLOW

107. GLRenderer#Draw

- 138 -

WMS FLOW

108. GLRenderer#Draw• HardwareRenderer 的 draw 函数主要做了三件事:• 1.buildDisplayList ,将绘制操作录制到 DisplayList 中的过程;• 2.drawDisplayList ,绘制 displaylist ,也就是真正执行绘制操作

的过程;• 3.swapBuffers , Android 有多缓冲机制,所以要交换缓冲区

- 139 -

WMS FLOW

109. ViewRootImpl#drawSoftware

- 140 -

WMS FLOW

109( 续 ). ViewRootImpl#drawSoftware

- 141 -

WMS FLOW

110. Surface#lockCanvas

- 142 -

WMS FLOW

111. android_view_Surface#nativeLockCanvas

- 143 -

WMS FLOW

112. DecorView#draw

- 144 -

WMS FLOW

113. FrameLayout#draw

FrameLayout 类的成员函数 draw 首先调用父类 View 的成员函数 draw 来绘制它的 UI 内容,然后再检查它是否设置了一个前景图,即成员变量 mForeground 的值是否等于 null 。如果不等于 null 的话,那么就会先设置这个前景图的大小和位置,然后再调用用成员变量 mForeground 所指向的一个 Drawable 对象的成员函数 draw 来在画布 canvas上绘制这个前景图

- 145 -

WMS FLOW114. View#draw

1. 绘制当前视图的背景。2. 保存当前画布的堆栈状态,并且在在当前画布上创建额外的图层,以便接下来可以用来绘制当前视图在滑动时的边框渐变效果。3. 绘制当前视图的内容。4. 绘制当前视图的子视图的内容。5. 绘制当前视图在滑动时的边框渐变效果。6. 绘制当前视图的滚动条。

- 146 -

WMS FLOW114(续 ). View#draw

绘制当前视图的背景

- 147 -

WMS FLOW114(续2). View#draw

- 148 -

WMS FLOW114(续3). View#draw

- 149 -

WMS FLOW114(续4). View#draw

- 150 -

WMS FLOW114(续5). View#draw

- 151 -

WMS FLOW115. View#onDraw

- 152 -

WMS FLOW116. ViewGroup#dispatchDraw

- 153 -

WMS FLOW117. View#onDrawScrollBars 绘制当前视图的滚动条

- 154 -

- 155 -

WMS FLOW118. Surface#unlockCanvasAndPost

- 156 -

WMS FLOW

119. android_view_Surface#nativeUnlockCanvasAndPost

- 157 -

Q&A

• Question?

top related