ActivityThread

一: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。

https://www.cnblogs.com/lijunamneg/p/3573093.html   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值