最近在看Android内核剖析这本书感觉写的挺好的,看到Framework这里就想写写自己所看到的,话不多说,看过程。
大家都知道Linux启动过程的最后内核都将读取init.rc文件,并启动该文件中定义的各种服务程序,而Android系统相对于Linux内核而言仅仅是一个Linux程序,因此Android系统也是在init.rc文件开始。
任何系统启动过程的本质都需要建立在一套系统运行所需要的环境,而Android系统就是运行在Dalvik虚拟机上,它类似java虚拟机。如图所示
系统中运行的第一个Dalvik虚拟机程序叫做zygote,该名称的意义就像是一个“”卵“”,因为接下来的所有Dalvik虚拟机进程都是通过这个“卵”孵化出来的。
zygote进程中包含两个主要模块,分别如下:
1、Socket服务端。该Socket服务端用于接受启动新的Dalvik进程命令。
2、Framework共享类及共享资源。当zygote进程启动后,会装载一些共享的类和资源,其*享类是在preload-classes文件中定义的,共享资源是在preload-resources中定义的。因为zygote进程用于孵化其他Dalvik进程,因此,这些类和资源装载完后,新的Dalvik进程就不需要再装载这些类和资源了,这就叫资源共享。
zygote进程对应的具体程序是app_process,该程序存在于system/bin目录下,启动改程序的指令是在init.rc中进行配置的。
zygote孵化出的第一个Dalvik进程叫做SystemServer,SystemServer仅仅是该进程的别名,而该进程对应的程序依然是app_process,因为SystemServer是从app_process中孵化出来的。
SystemServer中创建了一个Socket客户端,并由AmS负责管理该客户端,之后所有的Dalvik进程都将通过该Socket客户端间接被启动,当需要启动新的APK的时候,Ams会通过该客户端像zygote进程的Socket服务端发送一个启动命令,然后zygote会孵化出新的进程。
从系统架构的角度来讲,就在于此即先创建一个zygote,并加载共享类和资源,然后通过该zygote去孵化新的Dalvik进程,该架构的特点有两个:
1、每一个进程都是一个Dalvik虚拟机,而Dalvik虚拟机是一种类似于java虚拟机的程序,并且从开发的过程来看,与标准的java程序开发基本一致。
2、zygote进程预先会装载共享类和共享资源,这些共享类和资源就是SDK中定义的大部分类和资源,因此,当通过zygote孵化出的新的进程后,新的APK只需要去装载APK自身包含的类和资源即可,这就有效的解决了多个APK共享Framework资源的问题。