代码改变世界

Android隐喻(二) 启动

2012-07-03 21:41  CreateLight  阅读(538)  评论(0编辑  收藏  举报

  现代分时操作系统多以进程为基本单位,Linux亦不例外。

  手机启动如同PC,上电、硬件自检、加载操作系统、内核初始化、启动第一个进程、启动更多的进程、处理用户交互。

  Android基于linux,第一个(用户级)进程是init,后续所有进程都是由此进程派生出来,linux进程创建(派生)的系统调用为fork,其语意为“分支”。比如一条道路,你在其上行走,遇到一个二叉分支路口,在这个路口之前所有东西都是相同的,在这个路口之后分成两条支路行进。于此类似,一个进程fork出来的子进程,在其诞生之时和父进程完全一样,只是其后(可能)走向不同的分支。

  init会fork出很多linux的基本服务进程,然后会fork出android的zygote进程以及ServiceManager进程。zygote进程语意为“卵”, 所有的Dalvik虚拟机进程都由zygote进程fork出来。ServicaManager为Binder机制的重要组成部分,提供添加service以及查找service等功能,Binder机制为进程间通信机制,用来处理android的进程间通信。

  zygote进程会启动Dalvik虚拟机,然后加载共享类和共享资源,共享类和共享资源是由android指定的预先加载的被所有android进程共享的类和资源,包括了android_framework中的大部分类。由于fork语意,由zygote派生出的所有(应用)子进程都已经加载了dalvik虚拟机、共享类和共享资源,可以直接被应用所用。zygote进程本质是一个service进程,用以处理所有创建新dalvik进程的请求,它会创建一个socket用以监听这些请求。

  zygote孵化出来的第一个进程为SystemServer,这个进程会启动大部分的android_framework服务线程,用以处理APK应用的各种请求,比如WindowManagerServer(WMS)、ActivityManagerServer(AMS)、PackageManagerServer(AMS)等。APK应用进程通过Binder机制和SystemServer进程通信,使用其中的各个服务线程。

  所有服务线程都启动完毕后,AMS会启动ActivityStack中的第一个acitivity,如果不存在(比如开机),则发送带有CATEGORY_HOME的intent去启动Launcher(也就是俗称的“桌面”)程序,如果存在多个Launcher,则弹出列表提示用户选择。每个Launcher都是一个activity,其启动后,用户就进入了手机桌面,随后用户点击任一APK_ICON,则会由Launcher通过startActivity方法去启动新的APK应用。

  至此,android启动完成。