Android 启动过程详解
  Android从Linux系统启动有4个步骤;
  (1) init进程启动
  (2) Native服务启动
  (3) System Server,Android服务启动
  (4) Home启动
  总体启动框架图如:
                 

1.jpg (53 KB, 下载次数: 1)

下载附件  保存到相册

2012-3-19 11:28 上传

 

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

2.jpg (18.26 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-19 11:29 上传

 

  Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:
  servicemanamger
  zygoteo
  最后Init并不退出,而是担当起property service的功能。
  1.1脚本文件
  init@System/Core/Init
  Init.c: parse_config_file(Init.rc)
  @parse_config_file(Init.marve.rc)
  解析脚本文件:Init.rc和Init.xxxx.rc(硬件平台相关)
  Init。rc是Android自己规定的初始化脚本(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
  (2)restart_service()@ system/core/init/init。c
  service_start
  execve(…)。建立service进程。
  第二步 Zygote
  Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service。在。rc脚本文件中zygote的描述:
  service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
  所以Zygote从main(…)@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.ZygoteInit:main函数。
  (3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。
  registerZygoteSocket();//登记Listen端口
  startSystemServer();
  进入Zygote服务框架。
  经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。
  第三步 System Server
  startSystemServer@com.android.internal.os.ZygoteInit在Zygote上fork了一个进程: com.android.server.SystemServer。于是SystemServer@(SystemServer.java)就建立了。Android的所有服务循环框架都是建立SystemServer@(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 Service和AddService来建立服务
  第三步 Home启动
  [url=mailto:%E5%9C%A8ServerThread@SystemServer.java]在ServerThread@SystemServer.java[/url]后半段,我们可以看到系统在启动完所有的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

Android 核心分析 之八Android 启动过程详解的更多相关文章

  1. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  2. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  3. 【STM32H7教程】第13章 STM32H7启动过程详解

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章       STM32H7启动过程详解 本章教 ...

  4. fabric网络环境启动过程详解

    这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...

  5. (转)Linux 开机引导和启动过程详解

    Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...

  6. linux 开机启动过程详解

    Linux开机执行内核后会启动init进程,该进程根据runlevel(如x)执行/etc/rcx.d/下的程序,其下的程序是符号链接,真正的程序放在/etc/init.d/下.开机启动的程序(服务等 ...

  7. android系统启动框架、Activity界面显示过程详解

    一.Android系统框架 android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心 ...

  8. Android Activity的4种启动模式详解(示例)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...

  9. [转载] Linux启动过程详解-《别怕Linux编程》之八

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket.为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. = ...

随机推荐

  1. Asp.NET网站Session浅谈

    .NET网站在Web.config的<configuration>下<system.web>下<sessionState>配置session. sessionSta ...

  2. c++中头文件include规则浅析[译]

    英文原文地址 在开发大型的软件项目时,头文件需要得到恰当的管理,甚至在c中也会面临这种问题,当我们用c++开发时,头文件的管理会变得更复杂,更加耗费我们的时间去管理,下面我将讲一些包含规则来简化这个苦 ...

  3. Ubuntu14.04搭建LAMP环境

    安装Apache2                                                             sudo apt-get install apache2   ...

  4. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

  5. 使用JavaScript+Html创建win8应用(一)

            最近在学习win8 metro app的开发,今天刚刚学了一个小的例子,分享一下 开始之前你需要准备... 1.开发win8应用需要具备Windows 8 和 Microsoft Vi ...

  6. 二、freemarker.controller半自动静态化+Tomcat虚拟资源映射

    描述:本内容主要是讲2个tomcat之间同时共享一个静态话页面,统一入口是springMVC的一个controller,静态化的更新只需要传false.true.把完成的web项目放入a.b服务器To ...

  7. 通过HTML5实现发送声音

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. Linux 硬盘分区、分区、删除分区、格式化、挂载、卸载

    Linux 虽然一直都有在玩,但是对硬盘操作确实不是很熟悉今天有空,就整理了下. 1,创建分区 先查看下是否有磁盘没有分区 fdisk -l 其中第一个框和第二个框,是已经分好区的磁盘,第三个硬盘没有 ...

  9. vs2012 condition_variable notify_one 崩溃

    vs2012项目中用到 condition_variable系统方法,程序运行过程过程中偶尔出现notify_one崩溃, 程序运行的服务器系统版本是windows server 2008 R2 SP ...

  10. Dijkstra算法亲自实践

    按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点 ...