今天我们将深入Android的启动流程,从用户按下开机键到Android界面的过程。在谷歌上搜索“Android boot process”会得到很多很好英文文章,讲解Android启动这一过程,每个人讲述的角度不一样,通过阅读,对于Android的理解将会更加深刻。下面是链接,打不开的请翻墙!谢谢!
首先,贴出一张比较宏观的流程图,主要分为六步:
Step 1 : Power On and SystemStartup
Step 2 : Bootloader
Step 3: Kernel
Step 4: init process
Step 5: Zygote and Dalvik
Step 6: SystemService or Services
Step 1 : Power On and SystemStartup
开机键按下,CPU上电,固化在CPU内部的ROM程序运行,加载放在某固定地址的bootloader到内存(RAM)中,然后PC指针跳过去执行bootloader。
Step 2 : Bootloader
Bootloader核心任务就是要初始化内存,把boot.img(kernel + ramdisk)从flash上copy到RAM上面,然后交出对CPU的控制权给kernel。当然,这个过程bootloader还会初始化一下LCM、串口、时钟神马的。
Step 3: Kernel
PC指针指向Kernel区,kernel要做的事情比较多:kernel刚开始会匹配一下硬件CPU和板子,后面软件会创建内存页表,开启MMU(虚拟内存管理单元,负责把逻辑地址转化为物理地址),CPU寻址就会通过MMU获取实际物理地址。虚拟内存管理是操作系统的一个重要概念,用户进程使用逻辑地址,它看到4G的内存空间,而且每个进程都认为自己有这么大的空间。对于虚拟地址如何转为物理地址,这个转换过程有操作系统和CPU共同完成.操作系统为CPU设置好页表。CPU通过MMU单元进行地址转换。接下来就是常见系统第一个进程init进程!
Step 4: init process
Init 进程首先进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统。挂载procfs,sysfs文件系统,启动udev创建设备驱动节点。对于Android来讲,解析init.rc是进入Android世界的关键核心任务。
- init process can be found at init : <android source>/system/core/init
- init.rc file can be found in source tree at <android source>/system/core/rootdir/init.rc
Init.rc配置很多本地的守护进程(本地服务native service)其实就是一个个进程死循环while(1)! 这些进程拥有自己的地址空间,受到Linux process manager策略的约束,不断地被排队,被调度!关于进程管理这一块可以看下书,基本模型如下(这张图比较标准,网上很多图大同小异!):
言归正传,下表就是init.rc中启动的主要的本地服务:
Action / Service | Description |
on early-init | Set init and its forked children's oom_adj. |
on init | setup the global environment |
on fs | mount mtd partitions |
on post-fs | change permissions of system directories |
on post-fs-data | change permission of /data folders and sub folders |
on boot | basic network init ,Memory Management ,etc |
service servicemanager | start system manager to manage all native services like location, audio, shared preference etc.. |
service zygote | start zygote as app_process |
到这个阶段你会看到Android的log显示在显示屏上面!
Step 5: Zygote and Dalvik
Step 6: SystemService or Services
第五阶段是一些本地守护进程和VM虚拟机的启动,其中重点关注两个进程:①servicemanager②service zygote 。
Zygote是受精卵的意思,其深意就是不断分裂Android应用进程,丰富Android的世界。Servicemanager是系统服务的管理者,这些系统服务包括硬件服务和软件服务,一般SDK都定义好了这些服务提供的API接口,如果我们自己加上自己的系统服务也是可行的。同事servicemanager也是BINDER的管理者,binder是Android提出的进程通信的一种机制,研究起来挺复杂的,这里我们就知道它的作用就好了。
Binder的C/S模型如上图,任何一个环节都需要binder的通信。因为三者处于三个进程当中!
举个例子:
Zygote启动后会fork出嫡长子system server进程,这个进程是干什么的呢?就是上面图中server的角色注册一大堆系统服务,前面说了,这些服务有硬件服务和软件服务!client一般就是以APP的形式存在,也是有Zygotefork出来的进程。这个过程也可以从下图中窥知一二:
这里补充一下VM虚拟机的启动,受精卵zygote启动了Android Runtime,开启了Java世界的大门,下面是Zygote总结:
Zygote是在android系统中创建java世界的盘古,它创建了第一个java虚拟机。同时,它又是女娲,它成功的繁殖了framework的核心system_server进程。主要步骤如下:
1、 创建AppRuntime对象,并调用其start函数。之后zygote的核心初始化都由AppRuntime中。
2、 调用startVm创建java虚拟机,然后调用startReg来注册JNI函数。
3、 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了java世界。
4、 调用registerZygoteSocket创建可以响应子孙后代请求的socket。同时,zygote调用preload函数预加载了常用的类、资源等,为java世界添砖加瓦。
5、 调用startSystemServer函数分裂了一个子进程system_server来为java世界服务。
6、 Zygote完成了java世界的初创工作,便调用runSelectLoop来让自己沉沉的睡去。之后,如果收到子孙后代的请求,它便会醒来为他们工作。
第六步主要设计注册的的系统服务如下,另外注册方法也可以参考如下网址:
Core Services:
1. Starting Power Manager
2. Creating Activity Manager
3. Starting Telephony Registry
4. Starting Package Manager
5. Set Activity Manager Service as System Process
6. Starting Context Manager
7. Starting System Context Providers
8. Starting Battery Service
9. Starting Alarm Manager
10. Starting Sensor Service
11. Starting Window Manager
12. Starting Bluetooth Service
13. Starting Mount Service
Other services
1. Starting Status Bar Service
2. Starting Hardware Service
3. Starting NetStat Service
4. Starting Connectivity Service
5. Starting Notification Manager
6. Starting DeviceStorageMonitor Service
7. Starting Location Manager
8. Starting Search Service
9. Starting Clipboard Service
10. Starting Checkin Service
11. Starting Wallpaper Service
12. Starting Audio Service
13. Starting HeadsetObserver
14. Starting AdbSettingsObserver
http://blog.csdn.net/eliot_shao/article/details/51514045
SystemServer vs ServiceManager