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. GitFlow教程

    GitFlow教程 这份教程是博主学到的git基础,仅适合小团队使用,仅供参考 配置Git 配置github上面的账号,首先需要自己在git上注册一个账号 git config --global us ...

  2. 软件工程随堂小作业——最优惠价钱(C++)

    一.设计思路 前提,没有买重复书的情况是最优惠的.总共买n本书,可以分解成5k+(n-5k),k=0,1,2,...1.如果k=0,n本不重复的价钱是最优惠的:2.如果k=1,算出每一种情况的折扣并比 ...

  3. android开发类似coverflow效果的3d旋转

    源码下载地址:http://download.csdn.net/detail/feijian_/8888219

  4. vs2012 condition_variable notify_one 崩溃

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

  5. [原创] zabbix学习之旅五:如何快速搭建一个报警系统

    通过之前的文章,我们已搭建好zabbix server.agent和mail客户端,现在万事俱备,只差在server的界面中进行相应配置,即可快速搭建一个报警系统.总的来说,快速搭建一个报警系统的顺序 ...

  6. NYOJ-289 苹果 289 AC(01背包) 分类: NYOJ 2014-01-01 21:30 178人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> #define max(x,y) x>y?x:y struct apple { int c; i ...

  7. JsUnit && JUnit之讲解

    首先我们定义我们的函数 这里以最简单的加减乘除四个方法来进行测试 建立我们的js文件myjs.js function add(num1,num2){ return num1 + num2; } fun ...

  8. .NET设计模式(17):命令模式(Command Pattern)(转)

    概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...

  9. datepicker,结束时间必须大于开始时间

    $('#js-start-time').datepicker({ dateFormat:'yy-mm-dd', onSelect: function( startDate ) { var $start ...

  10. Pytho中两种方式导入模块的差别

    1.使用import module,只是把模块导入,访问模块中的函数名或者是属性是必须使用点运算符(.)来访问,否则直接访问会提示找不到这些函数或者属性. 2.使用from numpy import ...