APP启动过程

从点击桌面图标到app启动,背后到底发生了什么?系统做了哪些工作?

此文为过程简述,省略大量细节,有兴趣者可以阅读源码。首先,来了解一下进程Zygote , 字面意思受精卵,说到受精卵,就想到分裂孵化。

《道德经》有云:道生一,一生二,二生三,三生万物。

我们把Zygote视为一,至于Zygote的父进程“道”,属于Android 系统架构Native层中的Init进程,不属于该文章的介绍范围,暂且不表。
好,下面开始分裂,首先要知道在Android系统架构中Framework层,所有的java进程(C++管不着)都起源于Zygote。就问你怕不怕。第一次分裂出的进程叫做system_serverLuncher,(注意Zygote进程一直还在啊,并不是分裂了就没有了,这点不同受精卵真实过程),前者看着名字就知道是系统服务相关的,没错,我们常用的ActivityManagerService(以下简称AMS)、WindowManagerService和PackageManagerService等等各种服务,都是system_server这个进程启动的,而Luncher进程就是桌面App,就是我们看到的手机开机完成后桌面,它本质上是一个App(其实安装卸载啊等好多系统功能,其实本质都是一个App)。其他应用比如浏览器、相机、邮件、电话、微信、淘宝等等,都是Zygote孵化而来。为什么要孵化,因为从头创建消耗太大,从0到1难呐,万事开头难,这样孵化效率较高。


了解了这些概念,好了,我们可以进入精彩部分了。注意了啊。
启动正式开始!开始啦!喜大普奔啊!咳咳,肃静!好戏开场。

  1. 当你点击了App的桌面图标时,Luncher进程收到你的操作。启动开始。
  2. Luncher进程启动远程进程,通过Binder发消息给system_server。
  3. system_server 中AMS经过一系列复杂操作,最终调用 Process.start(android.app.ActivityThread) , 然后通过socket通知Zygote进程。
  4. Zygote进程收到通知,fork出app进程,并执行ActivityThread.main()方法。
  5. ActivityThread.main()主要干了两件事:
    一准备主线程Looper , 这个大家应该很熟悉了,主线程靠它撑着呢。
    二是通过ActivityThread.attch()将主线程ApplicationThread绑定到AMS上。
  6. AMS绑定后,经过一系列复杂调用,执行到realStartActivityLocked()方法。
  7. 上一步方法会调用到ApplicationThread的scheduleLaunchActivity(),而该方法又调用ActicityThread的handleLaunchActivity(),创建application对象,并调用onCreate()方法,获取启动Activity并调用onCreate()方法。
  8. 启动完成。


    流程图.PNG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容