一:ActivityThread启动的流程
1:zygote进程启动之后,首先创建了Java虚拟机,该虚拟机是Android系统启动后的第一个虚拟机,然后注册JNI调用,接着调用了Java层的ZygoteInit类的main函数,进入了Java的世界。
接着,Java世界的ZygoteInit开始了zygote的工作,我们的工作就是从这之后开始:
2:Zygote有个特别的工作就是preload() 预加载资源,这是Android系统开机慢的主要原因。
3:forkSystemServer fork出systemserver进程。
4:runSelectLoop等待其他App通过socket来fork新的进程。
5:如果有APP请求新建进程,调用函数processOneCommand->forkAndSpecialize(Q版本,以前版本是RunOnce),响应AMS进程的Socket请求fork 1个进程。
6:最后childZygoteInit函数调用RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);启动了ActivityThread的Main函数。
ActivityThread就被创建了;顺便说1下,这个argv是从哪里获取的:
args = Zygote.readArgumentList(mSocketReader);从Socket获取,也就是AMS传过来的。
7:AMS的传值:AMS通过调用startProcessLocked方法向Zygote进程发送请求。
final String entryPoint = "android.app.ActivityThread";
大体流程startProcessLocked->startProcess->appZygote.getProcess().start->connectToZygoteIfNeededLocked()->startChildZygote()
之后Socket连接,传输startViaZygote->zygoteSendArgsAndGetResult的argc数据给Zygote。
二:ActivityThread Main方法
1:调用Looper的prepareMainLooper方法创建主线程Looper。
2:创建ActivityThread对象。
3:通过调用ActivityThread对象的getHandler方法获取主线程H类对象
H类继承了Handler类,是ActivityThread的内部类,用于处理线程的消息循环。
4:调用Looper的loop方法开启消息循环
5:调用attach方法,与AMS建立binder通讯,attachApplication。
6:创建mInstrumentation = new Instrumentation();对象
7:调用 mInitialApplication.onCreate();
顺便说1下,ActivityThread 不是主线程,虽然他有主线程的消息循环已经binder传输。
真正的主线程就是我们fork出来的进程。
不得不说网上这张图画的真好,大家可以参考,haha。