第一次启动
- Dalvik虚拟机在app第一次启动时,会对dex文件进行dex2opt操作,对dex进行验证和优化,并生成odex文件,之后的启动都会基于这idex文件启动,所以Dalvik虚拟机在第一次启动app时会很慢。
流程
![](https://img.haomeiwen.com/i5115554/2320905c9701f994.png)
- 点击桌面APP图标时,Launcher的startActivity()方法,通过Binder通信,调用system_server进程中AMS服务的startActivity方法,发起启动请求
- system_server进程接收到请求后,向Zygote进程发送创建进程的请求
- Zygote进程fork出App进程,并执行ActivityThread的main方法,创建ActivityThread线程,初始化MainLooper,主线程Handler,同时初始化ApplicationThread用于和AMS通信交互
- App进程,通过Binder向sytem_server进程发起attachApplication请求,这里实际上就是APP进程通过Binder调用sytem_server进程中AMS的attachApplication方法,上面我们已经分析过,AMS的attachApplication方法的作用是将ApplicationThread对象与AMS绑定
- system_server进程在收到attachApplication的请求,进行一些准备工作后,再通过binder IPC向App进程发送handleBindApplication请求(初始化Application并调用onCreate方法)和scheduleLaunchActivity请求(创建启动Activity)
- App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送BIND_APPLICATION和LAUNCH_ACTIVITY消息,这里注意的是AMS和主线程并不直接通信,而是AMS和主线程的内部类ApplicationThread通过Binder通信,ApplicationThread再和主线程通过Handler消息交互。 ( 这里猜测这样的设计意图可能是为了统一管理主线程与AMS的通信,并且不向AMS暴露主线程中的其他公开方法,大神可以来解析下)
- 主线程在收到Message后,创建Application并调用onCreate方法,再通过反射机制创建目标Activity,并回调Activity.onCreate()等方法
- 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染后显示APP主界面 APP启动过程的部分代码思考
Instrumentation
冷启动优化
参考
[启动流程简析] https://www.jianshu.com/p/910df9643d8c [ActivityThread的理解和APP的启动过程] https://blog.csdn.net/hzwailll/article/details/85339714
网友评论