嵌入式设备启动时bootloader加载linux内核,linux内核启动后运行第一个用户级进程init,从此进程进入android世界,所以,android是一个框架而不是kernel。
在linux系统启动时,内核引导参数上一般都会设置“init=/init”,当android 最底层linux kernel 启动后会执行一个用户级进程init,此进程为所有进程的父进程,进程号为1,这里为整个android框架的入口,init进程为android内所有进程的父进程。init 可执行程序一般位于/xbin/init 下,init程序源码在Android源码的system/core/init中,我们的分析就从main开始进入android framework。


/system/core/init/init.c#main


init进程 为标准linux进程,它可以使用linux 内核提供的api,也可以使用标准库。


init 进程分两部分,boot 部分 及 daemon部分,


int main(int argc, char **argv)
{
/* Boot part */

for(;;) {
/* Daemon part */
}
}
首先执行boot 部分,此部分创建文件系统基本目录,包括 /dev, /proc, /sys 等。
初始化kmsg log 模块,此模块用于获取linux kernle log 信息。


boot部分 最后解析init.rc配置文件,init_parse_config_file("/init.rc");/system/core/rootdir/init.rc
init.rc 语法解释参考 /system/core/init/readme.txt


此文件定义了一系列 action及service。这里指定了系统启动时执行哪些动作,可以设置环境变量,
使用linux命令执行某个动作,启动服务,挂载文件系统等等。
action 是一个命令的序列,每个action定义了某一命令,action有触发机制,及在什么情况下执行此命令。当某一事件与此action的出发机制匹配,此action会被加到action执行队列中被执行。
parse_service 把解析后的 action 都放到 action_list链表,parse_action 把Service放在service_list。


boot部分最后遍历action_list执行相应命令,具体如下:
(1)console_init_action :初始化console,显示A N D R O I D 字样在终端上。
(2)property_init_action
(3)set_init_properties_action
(4)property_service_init_action


Daemon part :
for(;;)不断执行一下动作:
(1)启动service_list中指定的服务,所有android其他服务在此处通过service 方式启动,如虚拟机,servicemanager,mediaserver等,
每个服务对应init进程的一个子进程。


(2)不断调用poll 监控3个fd状态
property_set_fd
signal_recv_fd
keychord_fd
property_set_fd 解释:
作为一个系统服务管理着系统的配置和状态,所有的这些系统配置和状态都是属性(property)。属性(property)是一对键/值(key/value)组合,键和值都是字符串类型。Androd中非常多的应用程序和库直接或者间接的依赖于属性系统,并由此决定其运行期的行为。例如:adbd进程通过属性来决定是否当前运行在模拟器中。再比如:java.io.File.pathSeparator方法返回存储在属性服务中的值,property_service_init_action 在boot阶段调用,初始化android 属性系统,系统固定的属性在目录 "/data/property" 下面。init 进程管理android属性系统所有数据,其他进程通过android提供的ashmem驱动只读属性系统。
参考:
http://hi.baidu.com/runsheng2005/blog/item/84734fd6ac12363b06088b1f.html


signal_recv_fd :
子进程信号处理,waitpid等候子进程退出,清理资源,如果子进程是服务则重启子进程。
keychord_fd:
监控输入设备事件并启动相应服务。


至此,init进程启动完毕。


上面的daamon部分提到service_list保存了 init.rc中配置的启动项,android内给上层提供的一些主要服务都是在此处指定并启动。


如:servicemanager
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
--------------------#android运行时环境虚拟机启动
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
---------------------------------
service media /system/bin/mediaserver #多媒体service启动。
user media
group system audio camera graphics inet net_bt net_bt_admin net_raw
ioprio rt 4
------------------------------------------------------------------------


init进程通过创建子进程启动其他服务,这些服务作为damon进程在后台运行,给整个android上层应用提供服务。
这里对应init.rc中的 service 部分,
主要包括以下几个部分:
(1) servicemanager: start binder system,ipc 通信机制在此实现, device/commands/binder.
(2) installd, install package daemon, device/servers/installd.
(3) media 多媒体服务,启动 AudioFlinger, MediaPlayerService and CameraService,device/commands/mediaserver
(4) bluetoothd 蓝牙服务
(5) dhcpcd dhcp服务
(6)console , shell, device/system/bin/ash
(7)adbd, adb daemon进程,device/tools/adbd
(8)mountd,device/system/bin/mountd
(9)flash_recovery, device/commands/recovery/mtdutils
(10)bootsound ,播放默认 boot sound /system/media/audio/ui/boot.mp3. The source is in device/commands/playmp3.
(11)rild, start radio interface layer daemon. device/commands/rind.


(12)zygote 启动android java 运行时环境,同时启动system server (构建在java虚拟机之上),此子进程为android 中最重要的服务,device/servers/app


这些子进程构成了android framework基础。


zygote 进程启动流程:
Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。


(1) main(…)@frameworks/base/cmds/app_main.cpp
创建虚拟机,注册android本地函数。
建立Java Runtime
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);


(2) runtime.start@AndroidRuntime.cpp


建立虚拟机
运行:com.android.internal.os.ZygoteInit:main函数。


(3)main()@com.android.internal.os.ZygoteInit //真正启动虚拟机进程 Zygote。 /java/android/com/android/internal/os/ZygoteInit.java


registerZygoteSocket();//登记Listen端口
startSystemServer(); 启动systemserver子进程,此进程非常重要,他分两部分,init1,init2,init1阶段启动用C++写的service, init2启动了android java 层所有服务。


内部调用forkSystemServer (implemented in device/dalvik/vm/InternalNative.c)启动新进程,
调用 main#SystemServer.java(/frameworks/base/services/java/com/android/server/systemserver.java),
内部分两个过程,init1,init2,init1为jni调用在com_android_server_SystemServer.cpp 中为init1是现代码。
system_init为init1的具体实现,
进入init2后启动java线程启动android java services (framesorks/base/services/java/com/android/server/SystemServer.java)


至此systemservice启动完毕,进入android。
更进一步分析应该进入 ini1,init2阶段启动的各种服务( SurfaceFlinger, CameraService., Activity Manager。。。)




更多相关文章

  1. Android应用程序进程启动过程的源代码分析
  2. [zz] Android(安卓)初始化语言(Android(安卓)init Language翻译)
  3. Android(安卓)Push Notification技术实现
  4. Android应用程序进程启动过程的源代码分析
  5. android AIDL服务
  6. Android内存管理机制
  7. 利用BLCR加快android的启动过程
  8. Android(安卓)服务器推送技术
  9. [Java][Android][Process] 暴力的服务可以解决一切,暴力的方式执

随机推荐

  1. linux 配置安装android sdk自动下载缺少
  2. 去除listBView的抖动,判断textView中文本
  3. struts2中获取request、response,与androi
  4. android4.2 修改设置背景
  5. Android(安卓)模糊搜索rawquery bind or
  6. MySQL必备基础之分组函数 聚合函数 分组
  7. MySQL MHA 运行状态监控介绍
  8. mysql按照时间分组查询的语句
  9. Node.js对MySQL数据库的增删改查实战记录
  10. mysql自动插入百万模拟数据的操作代码