android kitkat activity launch flow charles_liu 2014.09.24

157
Android KitKat Activity Launch Flow charles_liu 2014.09.24

Upload: rudolph-cain

Post on 16-Jan-2016

229 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Android KitKat Activity Launch Flow charles_liu 2014.09.24

Android KitKat Activity Launch Flow

charles_liu

2014.09.24

Page 2: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 2 -

Table

• Data Structure

• AMS Flow

• WMS Flow

• Q&A

Page 3: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 的操作请求等。

Page 4: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 。

Page 5: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 等结构。

Page 6: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 列表。

Page 7: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 可能是任意值。

Page 8: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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发出窗口管理申请的。

Page 9: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 申请和设置图形缓冲区等。

Page 10: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 中所有的窗口。

Page 11: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 11 -

App应用窗口交互接口

Page 12: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 12 -

WindowManagerGlobal示例

• 管理两个 activity 的数据结构

Page 13: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 13 -

ActivityRecord管理结构

Page 14: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 14 -

AMS FLOW

1.Activity startactivity

Page 15: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 15 -

AMS FLOW

2. Instrumentation#execStartActivity

Page 16: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 16 -

AMS FLOW

3. AMS#StartActivity

Page 17: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 17 -

AMS FLOW

4. ActivityStackSupervisor#StartActivityMayWait

Page 18: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 18 -

AMS FLOW

5. ActivityStackSupervisor#StartActivityLocked

Page 19: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 19 -

AMS FLOW

6. ActivityStackSupervisor#StartActivityUncheckedLocked

Page 20: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 20 -

AMS FLOW

7. ActivityStackSupervisor#adjustStackFocus

Page 21: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 21 -

AMS FLOW

8. WMS#createStack

Page 22: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 22 -

AMS FLOW

Page 23: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 23 -

AMS FLOW

9. ActivityStack#createTaskRecord

Page 24: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 24 -

AMS FLOW

10. ActivityStack#startActivityLocked

Page 25: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 25 -

AMS FLOW

11. ActivityStack#startActivityLocked

Page 26: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 26 -

AMS FLOW

12. WMS#addAppToken

Page 27: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 27 -

AMS FLOW

13. ActivityStack#startActivityLocked

Page 28: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 28 -

AMS FLOW

14. ActivityStackSupervisor#resumeTopActivitiesLocked

Page 29: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 29 -

AMS FLOW

15. ActivityStack#resumeTopActivitiesLocked

Page 30: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 30 -

AMS FLOW

17. ActivityStack#startPausingLocked

Page 31: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 31 -

AMS FLOW

17( 续 ). ActivityStack#startPausingLocked

Page 32: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 32 -

AMS FLOW

18. ApplicationThread#schedulePauseActivity

Page 33: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 33 -

AMS FLOW

19. ApplicationThread#H

Page 34: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 34 -

AMS FLOW

20. ApplicationThread#handlePauseActivity

Page 35: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 35 -

AMS FLOW

21. ApplicationThread#performPauseActivity

Page 36: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 36 -

AMS FLOW

22. Instrumentation#callActivityOnPause

Page 37: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 37 -

AMS FLOW

23. Activity#performPause

Page 38: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 38 -

AMS FLOW

24. AMS#activityPaused

Page 39: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 39 -

AMS FLOW

25. ActivityStack#activityPausedLocked

Page 40: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 40 -

AMS FLOW

26. ActivityStack#completePauseLocked

Page 41: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 41 -

AMS FLOW

Page 42: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 42 -

AMS FLOW

27. ActivityStackSupervisor#resumeTopActivitiesLocked

Page 43: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 43 -

AMS FLOW

28. ActivityStack#resumeTopActivitiesLocked

Page 44: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 44 -

AMS FLOW

29. ActivityStackSupervisor#startSpecificActivityLocked

Page 45: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 45 -

AMS FLOW

30. AMS#startProcessLocked

Page 46: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 46 -

AMS FLOW

31. AMS#newProcessRecordLocked

Page 47: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 47 -

AMS FLOW

32. ProcessRecord #ProcessRecord

Page 48: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 48 -

AMS FLOW

33. AMS#startProcessLocked

Page 49: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 49 -

AMS FLOW

34. Process#start

Page 50: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 50 -

AMS FLOW

35. ActivityThread#main

Page 51: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 51 -

AMS FLOW

36. ActivityThread#ActivityThread

Page 52: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 52 -

AMS FLOW

37. ActivityThread#attach

Page 53: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 53 -

AMS FLOW

38. WMS#attachApplicationLocked

Page 54: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 54 -

AMS FLOW

39. ApplicationThread#bindApplication

Page 55: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 55 -

AMS FLOW

40. ActivityThread#H

Page 56: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 56 -

AMS FLOW

41. ActivityThread#handleBindApplication

Page 57: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 57 -

AMS FLOW

42. ActivityStackSupervisor#attachApplicationLocked

Page 58: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 58 -

AMS FLOW

43. ActivityStackSupervisor#realStartActivityLocked

Page 59: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 59 -

AMS FLOW

Page 60: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 60 -

AMS FLOW

44. ApplicationThread#scheduleLaunchActivity

Page 61: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 61 -

AMS FLOW

45. ActivityThread#H

Page 62: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 62 -

AMS FLOW

46. ActivityThread#handleLaunchActivity

Page 63: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 63 -

AMS FLOW

47. ActivityThread#performLaunchActivity

Page 64: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 64 -

AMS FLOW

47( 续 ). ActivityThread#performLaunchActivity

Page 65: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 65 -

AMS FLOW

48. Instrumentation#newActivity

Application

Page 66: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 66 -

AMS FLOW

49. Application#Application

Application

Page 67: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 67 -

AMS FLOW

50. Activity#attach

Page 68: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 68 -

AMS FLOW

51. Policy#makeNewWindow

Page 69: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 69 -

AMS FLOW

52. PhoneWindow#PhoneWindow

Page 70: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 70 -

AMS FLOW

53. Window#set get

Page 71: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 71 -

AMS FLOW

54. Instrumentation#callActivityOnCreate

Page 72: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 72 -

AMS FLOW

55. Activity#performCreate

Page 73: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 73 -

AMS FLOW

56. Activity#onCreatesetContentView

Page 74: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 74 -

AMS FLOW

57. PhoneWindow#setContentView

Page 75: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 75 -

AMS FLOW

58. PhoneWindow#installDecor

Page 76: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 76 -

AMS FLOW

Page 77: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 77 -

AMS FLOW

59. ActivityThread#handleResumeActivity

Page 78: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 78 -

AMS FLOW

60. ActivityThread#performResumeActivity

Page 79: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 79 -

AMS FLOW

61. Activity#performResume

Page 80: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 80 -

AMS FLOW

62. Activity#performRestart

Page 81: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 81 -

AMS FLOW

63. Instrumentation#callActivityOnResume

Page 82: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 82 -

AMS FLOW

64. WindowManagerImpl#addView

Page 83: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 83 -

AMS FLOW

Page 84: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 84 -

WMS FLOW

65. WindowManagerGlobal#addView

Page 85: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 85 -

WMS FLOW

66. ViewRootImpl#ViewRootImpl

Page 86: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 86 -

WMS FLOW

67. WindowManagerGlobal#getWindowSession

Page 87: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 87 -

WMS FLOW

68. WMS#openSession

Page 88: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 88 -

WMS FLOW

69. Session#Session

Page 89: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 89 -

WMS FLOW

Page 90: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 90 -

WMS FLOW

70. ViewRootImpl#setView

Page 91: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 91 -

WMS FLOW

71. Session#addToDisplay

Page 92: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 92 -

WMS FLOW

72. WMS#addWindow

Page 93: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 93 -

WMS FLOW

73. WMS#getDisplayContentLocked

Page 94: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 94 -

WMS FLOW

74. WindowState#WindowState

Page 95: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 95 -

WMS FLOW

75. PhoneWindow#adjustWindowParamsLw

Page 96: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 96 -

WMS FLOW

76. PhoneWindow#prepareAddWindowLw

Page 97: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 97 -

Page 98: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 98 -

WMS FLOW

77. WMS#addWindow( 续 )

Page 99: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 99 -

WMS FLOW

78. WindowState#attach

Page 100: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 100 -

WMS FLOW

79. Session#windowAddedLocked

Page 101: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 101 -

WMS FLOW

80. SurfaceSession#SurfaceSession

Page 102: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 102 -

Page 103: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 103 -

WMS FLOW

81. ViewRootImpl#requestLayout

Page 104: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 104 -

WMS FLOW

82. ViewRootImpl#scheduleTraversals

Page 105: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 105 -

WMS FLOW

83. ViewRootImpl#TraversalRunnable

Page 106: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 106 -

WMS FLOW

84. ViewRootImpl#TraversalRunnable

Page 107: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 107 -

WMS FLOW

85. ViewRootImpl#doTraversal

Page 108: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 108 -

WMS FLOW

86. ViewRootImpl#performTraversals

Page 109: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 109 -

WMS FLOW

86( 续 ). ViewRootImpl#performTraversals

Page 110: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 110 -

WMS FLOW

87. ViewRootImpl#relayoutWindow

Page 111: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 111 -

WMS FLOW

88. Session#relayout

Page 112: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 112 -

WMS FLOW

89. WMS#relayoutWindow

Page 113: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 113 -

WMS FLOW

90. WindowStateAnimator#createSurfaceLocked

Page 114: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 就有了实质的内容。

Page 115: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 115 -

WMS FLOW

91. WMS#performLayoutAndPlaceSurfacesLocked

Page 116: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 116 -

WMS FLOW

92. WMS#performLayoutAndPlaceSurfacesLockedLoop

Page 117: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 117 -

WMS FLOW

93. WMS#performLayoutAndPlaceSurfacesLockedInner

Page 118: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 118 -

WMS FLOW

94. WMS#performLayoutLockedInner

Page 119: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 119 -

WMS FLOW

95. PhoneWindowManager#beginLayoutLw

Page 120: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 120 -

WMS FLOW

96. PhoneWindowManager#layoutWindowLw

Page 121: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 121 -

WMS FLOW

97. WindowState#computeFrameLw

Page 122: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 122 -

WMS FLOW

98. PhoneWindowManager#finishLayoutLw

Page 123: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 123 -

WMS FLOW

Page 124: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 124 -

WMS FLOW

Page 125: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 125 -

WMS FLOW

99. ViewRootImpl#performMeasure

Page 126: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 126 -

WMS FLOW

100. View#Measure

Page 127: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 127 -

WMS FLOW

100( 续 ). View#Measure

Page 128: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 128 -

WMS FLOW

101. FrameLayout#onMeasure

Page 129: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 129 -

Page 130: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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 来对它的子视图进行计算。

Page 131: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 131 -

WMS FLOW

103. ViewRootImpl#performLayout

Page 132: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 132 -

Page 133: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 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的实现子视图布局

Page 134: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 134 -

WMS FLOW

105. ViewRootImpl#performDraw

Page 135: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 135 -

WMS FLOW

106. ViewRootImpl#Draw

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

Page 136: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 136 -

WMS FLOW

106( 续 ). ViewRootImpl#Draw

Page 137: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 137 -

WMS FLOW

107. GLRenderer#Draw

Page 138: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 138 -

WMS FLOW

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

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

Page 139: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 139 -

WMS FLOW

109. ViewRootImpl#drawSoftware

Page 140: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 140 -

WMS FLOW

109( 续 ). ViewRootImpl#drawSoftware

Page 141: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 141 -

WMS FLOW

110. Surface#lockCanvas

Page 142: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 142 -

WMS FLOW

111. android_view_Surface#nativeLockCanvas

Page 143: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 143 -

WMS FLOW

112. DecorView#draw

Page 144: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 144 -

WMS FLOW

113. FrameLayout#draw

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

Page 145: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 145 -

WMS FLOW114. View#draw

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

Page 146: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 146 -

WMS FLOW114(续 ). View#draw

绘制当前视图的背景

Page 147: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 147 -

WMS FLOW114(续2). View#draw

Page 148: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 148 -

WMS FLOW114(续3). View#draw

Page 149: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 149 -

WMS FLOW114(续4). View#draw

Page 150: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 150 -

WMS FLOW114(续5). View#draw

Page 151: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 151 -

WMS FLOW115. View#onDraw

Page 152: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 152 -

WMS FLOW116. ViewGroup#dispatchDraw

Page 153: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 153 -

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

Page 154: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 154 -

Page 155: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 155 -

WMS FLOW118. Surface#unlockCanvasAndPost

Page 156: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 156 -

WMS FLOW

119. android_view_Surface#nativeUnlockCanvasAndPost

Page 157: Android KitKat Activity Launch Flow charles_liu 2014.09.24

- 157 -

Q&A

• Question?