APP启动流程

1. Launcher 调用startActivity

Launcher 向AMS请求创建根Activity
调用startActivitySafely,里面调用Instrumentation的execStartActivity方法,最终通过ASM的代理类调用AMS的startActivity。

2. AMS 向Zygote请求创建进程

AMS判断根Activity是否存在并启动,不存在就会向Zygote进程请求创建应用程序进程

3. Zygote fork 进程

创建应用程序进程通过动态代理的方式去调用ActivityThread.main()

4. ActivityThread main()

Zygote进程里通过动态代理的方式去调用

4.1启动主Looper

Looper.prepareMainLooper();

4.2. ActivityThread attach:

  • 获取ActivityManagerService的代理对象IActivityManager
  • 通过代理对象调用attachApplication(),获取启动application所需信息(应用进程相关数据)
  • 执行Application的attach方法,里面执行attachBaseContext绑定Context

4.3. installContentProviders

启动ContentProviders

4.4. Application onCreate

  • Application创建完毕
  • ActivityThread 进入loop循环

5. ActivityThread main()执行完毕后通知AMS启动完成

Launcher启动的时候需要启动的信息保存为一个ActivityRecord,main执行完后AMS通过ActivityRecord找到需要启动的根Activity,启动根Activity。

6. AMS与ApplicationThread交互

ApplicationThread是应用程序与ASM所在进程的通信桥梁,AMS最终调用ApplicationThread的scheduleLaunchActivity方法;
然后调用H(H是ActivityThread的内部类,继承自Handler)的handleLaunchActivity;然后调用performLaunchActivity()。
ApplicationThread.scheduleLaunchActivity() → H.handleLaunchActivity() → ActivityThread.performLaunchActivity()

7. ActivityThread.performLaunchActivity()

(1)创建ContextImpl

ContextImpl appContext = createBaseContextForActivity()

(2)用类加载器加载Activity实例

(3)初始化Activity

执行Activity.attach()方法

  • 创建PhoneWindow(mWindow = new PhoneWindow())
  • 关联WindowManager(mWindow.setWindowManager())

(4)调用Instrumentation.callActivityOnCreate()方法启动Activity

  • 里面会调用Activity的onCreate()方法

(5)onCreate() → setContentView()

  • 初始化DecorView(继承自FrameLayout)
  • 通过LayoutInflater.inflate把布局文件解析后塞到DecorView中

8. 至此create流程结束,回到ActivityRecord开始resume流程

  • onStart是在resume流程里调用的Activity.performResume()→performRestart()→performStart()
  • 执行handleResumeActivity()

9. handleResumeActivity()

(1). ActivityThread 启动过程中调用handleResumeActivity

(2). 调用WindowManagerImpl.addView方法

把DecorView传进去

(3). WindowManagerGlobal.addView方法

  • 这里会new一个ViewRootImpl
  • ViewRootImpl的构造函数里会通过WindowManagerGlobal获取IWindowSession实例

(4). ViewRootImpl.setView方法

  • ViewRootImpl和DecorView绑定,至此window,ViewRootImpl,DecorView就关联起来了

(5). ViewRootImpl.requestLayout方法

(6). ViewRootImpl.scheduleTraversals方法(添加同步屏障,mChoreographer注册CallBack,里面执行下一步),至此requestLayout执行完毕,等待VSYNC信号回调

(7). mWindowSession.addToDisplayAsUser把Window添加进Activity

  • WindowSession在这里通过addToDisplya和WMS交互
  • ViewRootImpl是通过 IWindowSession和WindowManagerService进行交互的
  • WMS为每个Window关联一个WindowStatus
  • WindowStatus里创建SurfaceSession,它是与SurfaceFlinger沟通的桥梁

(8). 收到mChoreographer的CallBack回调,ViewRootImpl.doTraversal方法(移除同步屏障)

(9). ViewRootImpl.performTraversals方法

(10). performTraversals里调用 relayoutWindow 通过 WindowSession 与 WMS 进行交互,建立Surface的联系