Contents
  1. 1. 通电与系统启动
  2. 2. BootLoader
  3. 3. 内核
    1. 3.1. Blinder
    2. 3.2. ashmem
    3. 3.3. pmem
    4. 3.4. logger
    5. 3.5. wakelocks
    6. 3.6. oom handling
    7. 3.7. alarm manager
    8. 3.8. RAM_CONSOLE
    9. 3.9. USB gadget driver for ADB
    10. 3.10. yaffs flash filesystem
  4. 4. init进程
  5. 5. Zygote and Dalvik
  6. 6. 系统服务
    1. 6.1. 核心服务:
    2. 6.2. 其它服务:

什么是Zygot,init.rc,和Linux的启动过程有什么区别等。

通电与系统启动

电源接通以后,Boot Rom从一个写入硬件的预定义的地址开始执行,它会加载BootLoader到内存中执行。

(注:类似PC的BIOS)

BootLoader

这是一个在android之前运行的小程序,它不是android的一部分,是厂商设置锁的其它限制的地方。

(注:类似Linux的Grub)

Bootloader分两步执行,首先它检测外部Ram并加载一个第二步中要用到的程序。

第二步中,bootloader安装内核运行需要的网络、内存等,它为kernel的特定功能提供配置参数或者输入

bootloader可以在这里找到:

1
<android source>/bootable/bootloader/legacy/usbloader

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工具来得到启动过程中的的事件。

1
2
adb logcat -d -b events | grep boot
adb logcat -d | grep preload

Contents
  1. 1. 通电与系统启动
  2. 2. BootLoader
  3. 3. 内核
    1. 3.1. Blinder
    2. 3.2. ashmem
    3. 3.3. pmem
    4. 3.4. logger
    5. 3.5. wakelocks
    6. 3.6. oom handling
    7. 3.7. alarm manager
    8. 3.8. RAM_CONSOLE
    9. 3.9. USB gadget driver for ADB
    10. 3.10. yaffs flash filesystem
  4. 4. init进程
  5. 5. Zygote and Dalvik
  6. 6. 系统服务
    1. 6.1. 核心服务:
    2. 6.2. 其它服务: