android启动流程
什么是Zygot,init.rc,和Linux的启动过程有什么区别等。
通电与系统启动
电源接通以后,Boot Rom从一个写入硬件的预定义的地址开始执行,它会加载BootLoader到内存中执行。
(注:类似PC的BIOS)
BootLoader
这是一个在android之前运行的小程序,它不是android的一部分,是厂商设置锁的其它限制的地方。
(注:类似Linux的Grub)
Bootloader分两步执行,首先它检测外部Ram并加载一个第二步中要用到的程序。
第二步中,bootloader安装内核运行需要的网络、内存等,它为kernel的特定功能提供配置参数或者输入。
bootloader可以在这里找到:
|
|
legacy的loader包含两个重要部分:
1. init.s:: 初始化栈,置零BSS segment和调用main.c中的call_main()。
2. main.c:: 初始化硬件(硬件,主板,键盘,控制台)和创建Linux tags
内核
和Linux的内核加载相似。启动后开始安装cache和被保护的内存,调度和加载驱动。完成系统安装后,开始寻找init文件。
Linux中的kernel处理所有操作系统进程,例如内存管理,任务调度,IPC和整体系统控制。分两步进行,首先内核(单个压缩文件)被读入内存并解压,一些基础功能如基本内存管理被安装。之后控制最终被移交给主要的kernel启动进程。当Kernel功能完全时(kernel加载和执行也是它自身启动的一部分),Kernel寻找并运行Init进程,它会安装用户空间、用户环境和login时需要的进程。此时Kernel可以终结,服从其它进程的调用。
和Linux的kernel有何不同?以下是android对kernel作的修改和附加:
Blinder
android的IPC机制和RPC系统
ashmem
“Android Shared Memory”. 新的共享内存分配器,和POSIXS的SHM类似但是行为不同,有简化的基于文件的API。
pmem
“process memory allocator”。 用于管理在用户空间与内核空间中共享的连续的大块物理内存。
logger
logcat命令的内核支持
wakelocks
用于电源管理文件,它保持系统唤醒,直到wakelock被释放。
oom handling
在可用内存低时结束进程
alarm manager
用户空间在需要时唤醒内核
RAM_CONSOLE
允许将内核的printk消息缓存到RAM中,以使得消息可以在出现kernel panic后在下次内核调用时能被看到。
USB gadget driver for ADB
yaffs flash filesystem
init进程
第一个进程,属于root,所有进程之父。它有两个职责:
1. 加载目录,例如/sys , /proc
2. 运行**init.rc**脚本
android有特殊的init.rc规则和格式,详细信息可以参考What is inside the init.rc and what is it used for.
此时终于可以看到Android的logo了。
Zygote and Dalvik
我们知道在java中每个应用都会在内在中建立一个单独的VM,在Android中每个app的VM都应该尽可能地快速运行。但是如果每个app都运行一个Dalvik虚拟机,会消耗相当多地内存。
为了克服这个问题,android有一个zygote系统,它使得dalvik之间可以共享代码,减少内在消耗和启动时间。zygote是一个在系统开机时启动的虚拟机进程,预加载和初始化核心类库。
Zygote加载过程:
1.加载Zygote的init类:
<android source>/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
2. registerZygoteSocket() :: 为Zygote命令连接注册一个服务socket
3. preloadClasses():: 一个简单的文本文件,包含需要预加载的类列表,位于 <android source>/framework/base
4. preloadResources():: 所有包含于android.R中的文件将被此方法加载。
此时,你会看到启动动画。
系统服务
上述步骤完成以后,Zygote将fork新进程来运行运行系统服务。
核心服务:
- Starting power manager
- Creating the Activity Manager
- Starting telephony registry
- Starting package manager
- Set activity manager service as system process
- Starting context manager
- Starting system contact providers
- Starting battery service
- Starting alarm manager
- Starting sensor service
- Starting window manager
- Starting Bluetooth service
- Starting mount service
其它服务:
- status bar service
- hardware service
- NetStat service
- connectivity service
- Notification Manager
- DeviceStorageMonitor service
- Location Manager
- Search Service
- Clipboard Service
- checkin service
- Wallpaper service
- Audio Service
- HeadsetObserver
- AdbSettingsObserver
至此系统启动完成,系统服务已经运行在内在当中。如果需要分析Android启动过程,可以用ABD logcat工具来得到启动过程中的的事件。
|
|