一、神图:
二、说明
笔者在下面博文内容的基础上,加上自己的理解,对图片稍加了一点点修改,启动流程文字部分也有所修改
参考:http://www.sohu.com/a/130814934_675634 (感谢楼主)
三、启动流程:
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;(startActivity()中调用ActivityManagerProxy.startActivity(),最终通过Binder执行system_server进程中的AMS中的startActivity()函数)
②system_server进程接收到请求后,向zygote进程发送创建进程的请求;(这一步AMS中startActivity()里面会调用startProcessLocked()函数,最终之行Process.start()函数,其最终调用了Zygote并通过socket通信的方式让Zygote进程fork除了一个新的进程,并根据我们刚刚传递的”android.app.ActivityThread”字符串,反射出该对象并执行ActivityThread的main方法)。
③Zygote进程fork出新的子进程,即App进程;
④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;(ActivityThread的main()函数里面会创建ActivityThread对象并调用attach()函数
ActivityThread thread = new ActivityThread();
thread.attach(false);
//attach()中调用ActivityManagerProxy的attachApplication(),也就是最终通过Binder机制调用了ActivityManagerService的attachApplication
⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler(ActivityThread.H)向主线程发送LAUNCH_ACTIVITY消息;
⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。(performLaunchActivity() 通过classLoader(通过LoadedApk对象来获取)加载类,然后通过反射生成对象,最后回调Activity.onCreate()等方法)
⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。