android系统启动流程
继续进入重载的ActivityManagerService. startProcessLocked(只有3个参数)
26 / 41
android系统启动流程
这里有3个信息值得关注: 1) Process.start:
进程启动,Process是进程管理类,一直跟踪下去,会发现他最后和zygote进程启动的服务端socket进行了通讯,通知zygote分化出一个子进程来。 2) android.app.ActivityThread
Process.start的时候,传入的class名称是android.app.ActivityThread,这里就是之前说的activity的进程一定对应着一个后台activitythread进程的,activity的所有生命周期动作都是activitythread处理的,所以前面真正让activity显示的是app.thread的schedule名称的相关函数,后面再分析 3)后面的打印信息
这里专门截取这个打印信息,是为了让大家看到这种打印数据组织方式,同时知道进程创建后,android系统一定有这么一个打印,我们在看log的时候就可以关注这个信息。 搜索log的时候也注意,直接搜索整句log,在代码中是搜索不到的,因为很多地方都像上面被截断了,需要搜索单个字符串。
5 Process类管理创建activity进程
源代码路径:
\\frameworks\\base\\core\\java\\android\\os\\ Process.java
5.1 Process.start:
重点关注前4个参数,具体到我们追踪的luancher: 第一个参数: processclass,android.app.ActivityThread 第二个参数:nicename对应着进程名称launcher. 第三个参数:uid,用户id 第四个参数:gid:用户组id
27 / 41
android系统启动流程
5.2 Process.startViaZygote
5.3 zygoteSendArgsAndGetResult和 openZygoteSocketIfNeeded
28 / 41
android系统启动流程
1)openZygoteSocketIfNeeded方法: 服务端zygote这个socket的连接,
继续创建sZygoteSocket收发数据用的stream对象和buffer。 2)zygoteSendArgsAndGetResult:
完成了java层LocalSocket 的创建得到sZygoteSocket ,并继续完成和zygote进程的
利用sZygoteWriter发送创建进程需要的参数,包括进程名称nicename(即luancher),进程要启动的第一个class(android.app.ActivityThread),uid和gid等 3)底层响应
参考《android系统从init进程开始到systemserver启动详细流程.docx》的6.3.4和6.3.5 此时\\frameworks\\base\\core\\java\\com\\android\\internal\\os\\ZygoteInit.java下的 ZygoteInit .runSelectLoop()接收到socket连接请求,继续接收参数列表,开始fork子进程,并最终执行该进程的入口函数;继续进入到
\\frameworks\\base\\core\\java\\com\\android\\internal\\os\\ZygoteConnection.java的 ZygoteConnection .handleChildProc方法。
在《android系统从init进程开始到systemserver启动详细流程.docx》的6.3.5节已经分析过,ZygoteConnection .handleChildProc执行的入口函数,是app层创建进程是传递的第一个参数所代表的class的main函数,所以这里就是android.app.ActivityThread的main函数。
到此为止,luancher运行需要的子进程创建完毕,名称为launcher,第一个要执行的函数是
29 / 41
android系统启动流程
android.app.ActivityThread的main。
6 ActivityThread线程类分析
源代码路径: \\frameworks\\base\\core\\java\\android\\app\\ActivityThread.java
6.1 ActivityThread.main分析
ActivityThread这个线程是专门管理activity运行生命周期的各种动作的封装。
当然他实际还包含了对systemserver这个进程创建管理线程的工作,之前分析过其入口是systemmain,而普通的activity的入口是main;这二者本质是一样的,只是处理的权限等属性不同。
main做3个主要的任务,分析如下:
6.1.1创建了looper对象和本线程绑定。
原来我们在activity或service或dialog中可以随便使用handler是这个线程在后台付出的努力。
关于handler,looper,messagequeue之间的关系可以百度或参考《深入理解Android 卷1》,比较简单,这里不讨论。
6.1.2创建了ActivityThread对象实例
注意,当new ActivityThread()的时候,其成员变量
final ApplicationThread mAppThread = new ApplicationThread(); 同时被创建。
ApplicationThread是内部类,继承自ApplicationThreadNative
ApplicationThreadNative继承自接口IApplicationThread
30 / 41