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

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

Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:
servicemanamger
zygote
  。。。
  最后Init并不退出,而是担当起property service的功能。
  1.1脚本文件
  init@System/Core/Init
  Init.c: parse_config_file(Init.rc)
    @parse_config_file(Init.marvel.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启动   盛世游戏:http://www.shengshiyouxi.com
  在ServerThread@SystemServer.java后半段,我们可以看到系统在启动完所有的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

http://www.shengshiyouxi.com的更多相关文章

  1. ActionScript通用开发框架

    ActionScript 3(简称as)自2006年诞生以来,出现了一大批很优秀框架.就我的知识领域,运用包括pureMVC.pushButton Engine(组件框架).Robotlegs.Ash ...

  2. flash与字符串:字符串与属性

    有时候,我们想通过设置一个DisplayObject 类是属性值,只是需要通过点来引用即可.有时候,通过字符串也可以引用显示对象里面的属性值.     下面举个例子 .                 ...

  3. 再谈cacheAsBitmap

    cacheAsBitmap这个属性很多人都知道,但少有人明白它到底是如何生效的.虽然看名字是转换为位图处理,但用起来的时候感觉却也不过如此.所以,不少人最终选择自己转换Bitmap. 当然,自己转Bi ...

  4. as3 updateAfterEvent的作用

    flash中一共有三个类具有该属性,这三个类分别是:KeyboardEvent,MouseEvent,TimerEvent.调用updateAfterEvent 属性的事件,可强制立即执行呈现操作,而 ...

  5. 导致flash屏幕重绘的几种方式及避免重绘的方法

    导致屏幕重绘的几种原因: 1.最常见的是情况就是舞台上的可视组件在形状.位置.状态(alpha, scale…)发生改变的时候会触发Flash Player 的重绘. 2.当一个DisplayObje ...

  6. AS3游戏中可视对象上限及位图相关的内存消耗实测

    前些天连续做了一些测试,以加深对AS3的掌握和在项目中对 游戏 性能.效率优化方面的一些处理,有很多测试实际意义不大,都不过是证明一些猜想是正确的,除此没有什么. 但前天进行的一系列测试中,有一些对游 ...

  7. AS3事件机制概述

    事件机制是AS3的核心功能之一,没有充分掌握事件机制的方方面面,就不能算是精通AS3语言. 1. AS3事件机制的主要成员 IEventDispatcher:事件派发对象接口,定义了添加.派发.移除. ...

  8. C++与AS3

    ActionScript 3(简称AS3)与 c++ 都是面向对象的编程(OOP)语言,都具有OOP的特性如封装.继承.多态等.二者在语法上有许多相似之处,基本上学过C++之后再学习AS3感觉并不是特 ...

  9. as3用鼠标拖动图形拼图——灰常简单的教程

    话说这种效果在课件里面经常用到,鼠标拖动事件,一个运用很频繁的事件,一起学习学习吧 首先SWF贡献给大家看看效果 感觉咋样,原理其实还蛮简单的,做做试试吧 下面来看看源码吧 package { imp ...

随机推荐

  1. java-多线程安全问题

    1. 安全问题产生原因 多个线程操作共享数据. 操作共享数据的线程代码有多条.当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了计算,就会产生线程安全问题. 2. 解决方案 java中用同步 ...

  2. python学习——截图工具编写

    学习一门语言最好的方法便是实践,想要拿Python写一个截图工具,网上一搜资料果然已经很多,前辈们都已经做的很到位了.现在就一步步来学习一下: 首先学习截图整个桌面的方法,可以使用Python中的PI ...

  3. python 获取当前日期 星期

    from datetime import datetime d =datetime.today()     #获取当前日期时间 d.isoweekday()           #获取时间周几

  4. Nginx 负载均衡配置和策略

    Nginx 的 HttpUpstreamModule 提供对后端(backend)server的简单负载均衡.一个最简单的 upstream 写法例如以下: upstream backend { se ...

  5. ACM POJ 2192 Zipper

    题目大意:输入字符串a,b,c 要求推断c是否有a,b中的个字符保持原有顺序组合而成. 算法思想: DP 用dp[i][j]表示a的前0~i-1共i个字符和b的前0~j-1共j个字符是否构成c[i+j ...

  6. Effective C++_笔记_条款11_在operator=中处理“自我赋值”

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为什么会出现自我赋值呢?不明显的自我赋值,是“别名”带来的结果: ...

  7. Servlet的学习(一)

    初识Servlet Servlet是一门专门用于开发动态web资源的技术,Sun公司在其API中提供了一个Servlet接口(当然,我们不会去直接实现这个接口,而是去继承其实现类会更好),因此,狭义的 ...

  8. Swift - 时间控制器NSTimer(每隔一定时间执行某个函数)

    时间控制器NSTimer可以实现定时器功能,即每隔一定时间执行具体函数,可以重复也可以只执行一次. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cl ...

  9. 邮件应用Acompli和日历应用Sunrise(传微软曾考虑以80亿美元收购企业通讯公司Slack)

    http://tech.163.com/16/0305/10/BHCU8EHO000915BD.html http://www.cnbeta.com/articles/480835.htm

  10. 外国的Delphi网站

    www.phidels.com delphifr.com http://www.swissdelphicenter.com/torry/showcode.php?id=787 B4A delphifa ...