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的联系