给什么平台,跳什么舞

第15章 Android启动过程 [Android应用开发与系统改造实战]

15.1 Android初始化语言(init.*.rc、init.conf文件格式)的英文档在system/core/init/readme.txt中有详细说明。
system/core/rootdir/init.rc
15.1.8 Android调试记录:
在默认情况下,程序在被init执行时会将标准输出和标准错误都重定向到/dev/null,若想要获得调试信息,可以通过Android中的logwrapper程序执行你的程序。它会将标准输出/标准错误都重定向到Android的日志系统(通过logcat访问)
例如,在init.rc中加上红色部分
service adbd /syste/bin/logwrapper /sbin/adbd
15.2 Android启动过程     分3大阶段:
首先是OS级别,由bootloader载入Linux Kernel后,Kernel开始初始化,并载入built-in的驱动程序。Kernel完成开机后,载入init process,切换至user-space后结束kernel的偱环过程,进入进程调度周期
然后是Android-level,由init process开始,读取init.rc,Native服务启动,并启动重要的外部程序,如servicemanager、Zygote以及System Server.
最后是Zygote-Mode,Zygote启动完SystemServer后,进入ZygoteMode,通过Socket接收命令。
15.2.2 Android启动过程
我们可以通过ps命令查看到设备启动的所有进程,从PID和PPID就可以清晰地看到它们之间的关系。
PPID是PID的parent (USER的app_*见 http://www.cnblogs.com/jimwind/archive/2012/12/18/2823587.html
下面我们来分析启动过程,从内核之上,首先应该从文件系统的init开始,因为init是内核进入文件系统后第一个运行的程序。
system/core/init/init.c

 
---------第9章 Java启动流程、调试和程序结构[Android核心原理和系统级应用高效开发]------------
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java 
其中的main()方法是一个Android系统正常启动后所执行的第一段Java代码.
frameworks/base/services/java/com/android/server/SystemServer.java -> main()调用本地方法init1()
frameworks/base/services/jni/com_android_server_SystemServer.cpp init1()调用的是system_init(),而它在libsystem_server.so中.
frameworks/base/cmds/system_server/library/system_init.cpp
frameworks/base/cmds/system_server目录生成可执行程序system_server,此可执行程序只用于测试,正常启动流程中不执行.



posted @ 2013-11-27 11:29  Jimwind  阅读(558)  评论(0编辑  收藏  举报
==============精通*学习*关注==============