转载自:http://blog.csdn.net/maxleng/article/details/5508372

Android 启动过程详解

AndroidLinux系统启动有4个步骤;

(1) init进程启动

(2) Native服务启动

(3) System Serverandroid服务启动

(4) Home启动

总体启动框架图如:

Android——从init进程启动流程_第1张图片

 

第一步:initial进程(system/core/init)

     init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程.

Init.rc

Init.marvell.rc


Android——从init进程启动流程_第2张图片

Init进程一起来就根据init.rcinit.xxx.rc脚本文件建立了几个基本的服务:

  •  servicemanamger
  •  zygote

。。。

最后Init并不退出,而是担当起property service的功能。

1.1脚本文件

[email protected]System/Core/Init

Init.c: parse_config_file(Init.rc)

  @parse_config_file(Init.marvel.rc)

解析脚本文件:Init.rcInit.xxxx.rc(硬件平台相关)

Init.rcAndroid自己规定的初始化脚本(Android Init Language, System/Core/Init/readme.txt)

该脚本包含四个类型的声明:

  • Actions
  • Commands
  • Services
  • Options.

1.2 服务启动机制

我们来看看Init是这样解析.rc文件开启服务的。

1)打开.rc文件,解析文件内容@ system/core/init/init.c

service信息放置到service_list中。@ system/core/init parser.c

2restart_service()@ system/core/init/init.c

service_start

execve().建立service进程。

第二步 Zygote

Servicemanagerzygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service..rc脚本文件中zygote的描述:

service zygote /system/bin/app_process -Xzygote /system/bin –zygote –start-system-server

所以Zygotemain()@frameworks/base/cmds/app_main.cpp开始。

(1) main()@frameworks/base/cmds/app_main.cpp

  • 建立Java Runtime
  • runtime.start(“com.android.internal.os.ZygoteInit”, startSystemServer);

(2) runtime.start@AndroidRuntime.cpp

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

(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote

  • registerZygoteSocket();//登记Listen端口
  • startSystemServer();
  • 进入Zygote服务框架。

经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。

第三步 System Server

startSystemServer@com.android.internal.os.ZygoteInitZygotefork了一个进程: com.android.server.SystemServer.于是SystemServer@(SystemServer.Java就建立了。Android的所有服务循环框架都是建立[email protected](SystemServer.java)上。在SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。

main() @ com/android/server/SystemServer

{

init1();

}

Init1()是在Native空间实现的(com_andoird_server_systemServer.cpp)。我们一看这个函数就知道了,init1->system_init() @System_init.cpp

system_init()我们看到了循环闭合管理框架。

{

Call “com/android/server/SystemServer”, “init2”

…..

ProcessState::self()->startThreadPool();

    IPCThreadState::self()->joinThreadPool();

}


init2()@SystemServer.java中建立了Android中所有要用到的服务。

这个init2()建立了一个线程,来New ServiceAddService来建立服务


第三步 Home启动

[email protected]后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作:

(1) 使用xxx.systemReady()通知各个服务,系统已经就绪。

(2)  特别对于ActivityManagerService.systemReady(回调)

Widget.wallpaper,imm(输入法)ready通知。

Home就是在ActivityManagerService.systemReady()通知的过程中建立的。下面是ActivityManagerService.systemReady()的伪代码:

systemReady()@ActivityManagerService.java

resumeTopActivityLocked()

startHomeActivityLocked();//如果是第一个则启动HomeActivity

startActivityLocked(。。。)CATEGORY_HOME

更多相关文章

  1. Android软件安装文件夹
  2. 详细解读Android中的搜索框(四)—— Searchable配置文件
  3. 2011.09.07(5)——— android 跨进程通信之content provider + Aut
  4. Android Studio 指定DEBUG和RELEASE版本打包时的APK文件名
  5. Android跨进程通信传输大数据
  6. Android中使用 MediaExtractor 和 MediaMuxer解析、封装 mp4 文
  7. Android基础系列-----------Android进程/线程管理应用示例(Androi
  8. 【Android】一种提高Android应用进程存活率新方法
  9. Android的进程优先级与进程回收详解

随机推荐

  1. ios 类似android的toast
  2. Android(安卓)Studio官方文档之添加URL和
  3. Minecraft Earth将于下周迎来Android封测
  4. 趣拍SDK接入问题Android
  5. Android(安卓)设置无线热点模块隐藏SSID
  6. Android实现imageView在屏幕中缩放
  7. Android(安卓)EditText 的使用
  8. ubuntu下编译android源码、linux内核、an
  9. Intent 的工作机制
  10. IOS APP发布的几个要点