作者:唐老师,华清远见嵌入式学院讲师。

一、Android init进程启动

还是从Linux的启动开始吧。Linux被bootloader加载到了内存之后,开始运行,在初始化完 Linux运行环境之后,挂载ramdisk.img根文件系统映像,运行里面的init程序,这也是Linux的第一个用户程序,其pid为1。下面的 文章是作者关于init进程启动的描述。

http://blog.csdn.net/mr_raptor/article/details/7666906

二、Android本地服务的启动

init进程启动完之后,开始初始化并启动Dalvik虚拟机,在Dalvik虚拟机启动之前做了一些工作,请看下面一篇文章。

http://blog.csdn.net/mr_raptor/article/details/7804984

Android启动总结:

init进程在执行过程中可以分为以下几个阶段:

Ø 启动准备:创建文件系统的基本目录、打开标准输入、标准输出、标准错误,初始化log日志功能等

Ø 解析init.rc和init.hardware.rc文件:将rc文件逐行解析成Action或Service。解析出来的Action和 Service分别存放在action_list和service_list链表里,每个Action都对应一个或多个Commands,每个依附于 Action的Commands也由一个链表维护。

Ø 将early-initAction添加到action_queue队列里,等待执行

Ø 将init Action添加到action_queue队列里,等待执行

Ø 添加其它条件的Action到action_queue队列里

Ø 进入死循环

o 从action_queue队列里依次取出每个Action,执行其维护的Commands链表里的命令

o 重新启动service_list中标记为SVC_RESTARTING服务

o 监听系统属性状态变化事件、子进程信号、Keychord组合按键事件

注:在代码里没有明显运行service_list里服务的代码,每个服务都有一个class属性,该属性决定了服务的分类,在init.rc文件的on boot Action最后有两个命令:

[plain] view plaincopy
                1. on boot
                2. …
                3. ...
                4. class_start core

                5. class_start main

class_start命令是指运行某一类的服务,先启动了class为core的服务,然后再启动了class为main的服务。

init.rc中class为core的服务有:

Service名 对应程序及参数
ueventd /sbin/ueventd
console /system/bin/sh
adbd /sbin/adbd
servicemanager /system/bin/servicemanager
vold /system/bin/vold

class为main的服务有:

Service名 对应程序及参数
netd /system/bin/netd
debuggerd /system/bin/debuggerd
ril-daemon /system/bin/rild
surfaceflinger /system/bin/surfaceflinger
zygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server
drm /system/bin/drmserver
media /system/bin/mediaserver
bootanim /system/bin/bootanimation
dbus /system/bin/dbus-daemon --system --nofork
bluetoothd /system/bin/bluetoothd -n
installd /system/bin/installd
flash_recovery /system/etc/install-recovery.sh
racoon /system/bin/racoon
mtpd /system/bin/mtpd
keystore /system/bin/keystore /data/misc/keystore
dumpstate /system/bin/dumpstate -s

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column651.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

深入浅出 - Android系统移植与平台开发(四)- Android启动流程的更多相关文章

  1. 深入浅出 - Android系统移植与平台开发(一)

    深入浅出 - Android系统移植与平台开发(一) 分类: Android移植2012-09-05 14:16 16173人阅读 评论(12) 收藏 举报 androidgitgooglejdkub ...

  2. 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)

    2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...

  3. 深入浅出 - Android系统移植与平台开发(九)- Android系统system_server及Home启动

    3.3 Zygote守护进程与system_server进程 Android的执行环境和Java执行环境有着本质的差别,在Android系统中每一个应用程序都是一独立的进程,当一个进程死掉时,不会影响 ...

  4. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  5. 深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制(瘋耔修改篇一)

    首先非常感谢原文作者为我们提供的知识库,因为有你们的贡献,我们的开发难度更显简单 原文 :   http://blog.csdn.net/mr_raptor/article/details/30113 ...

  6. 深入浅出-Android系统移植与平台开发(一)- Android4.0系统的下载与编译

    作者:唐老师,华清远见嵌入式学院讲师. 一.Android4.0系统的下载与编译 Android系统的下载与编译,Google的官方网站上已经给出了详细的说明,请参照Android的官方网址: htt ...

  7. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器

    作者:唐老师,华清远见嵌入式学院讲师. 1.   编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...

  8. 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

    第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...

  9. 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一

    作者:唐老师,华清远见嵌入式学院讲师. 1. Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor.LightsSensor. ProximitySensor.Temp ...

  10. 深入浅出 - Android系统移植与平台开发(二) - 准备Android开发环境

    作者:唐老师,华清远见嵌入式学院讲师. 编译Android源码 关于android系统的编译,Android的官方网站上也给出了详细的说明.http://source.android.com/sour ...

随机推荐

  1. MDX语法之排序函数Order

    使用场景: 排列指定集的成员,可以选择保留或打乱原有的层次结构. 语法: Numeric expression syntax Order(Set_Expression, Numeric_Express ...

  2. 攻城狮在路上(叁)Linux(十八)--- 文件系统的简单操作

    本篇仅作为补漏. 一.查看磁盘和目录的容量:df  du df:列出文件系统的整体磁盘使用量. du:评估文件系统的磁盘使用量(常用于评估目录所占容量) 二.连接文件:ln 1.hard link:硬 ...

  3. vector 之删除元素

    删除指定位置的元素 删除vector中第5个位置的元素 vector<int> vec; //执行vector初始化操作 vector<; //获取第五个元素的iterator ve ...

  4. 分享一个漂亮WPF界面框架创作过程及其源码(转)

    本文会作为一个系列,分为以下部分来介绍: (1)见识一下这个界面框架: (2)界面框架如何进行开发: (3)辅助开发支持:Demo.模板.VsPackage制作. 框架源码如下所示. 本文介绍第(1) ...

  5. 廖雪峰js教程笔记10 浏览器对象

    JavaScript可以获取浏览器提供的很多对象,并进行操作. window window对象不但充当全局作用域,而且表示浏览器窗口. window对象有innerWidth和innerHeight属 ...

  6. 学习笔记总结---关于sass

    今天跟大家共同分享交流一下关于sass的知识点: sass的产生: css不是一种编程语言,我们可以用它开发网页样式,但不能用它进行编程.它没有常量,变量,也没有条件语句,只是对属性一行行的描述,资料 ...

  7. BestCoder Round #72 (div.2)

    后面的题目补不懂了 暴力 1001 Clarke and chemistry 这题也把我搞死了..枚举系数判断就行了 #include <cstdio> #include <algo ...

  8. 转载:robotium typeText与enterText区别

    solo.typeText和solo.enterText方法都可以对EditeText进行测试,达到的测试目的是一样的.存在几点不同: 1.实现上,typeText方法是robotium框架调用系统I ...

  9. Python学习笔记08

      正则表达式包re match,search,sub re.match(pattern, string, flags=0) re.search(pattern, string, flags=0) r ...

  10. node.js第一次

    随着时代的变迁,日月星辰轮回,不断的有新的事物被创造于世,作为在这个世界活着的前端工程崽的我,最近又接触了一门新手艺“node.js”.自从它2009年诞生至今,被很多前端推崇,我起步已经晚了,还好它 ...