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. C语言中的enum(枚举)使用方法

    近期在写数据结构的广义表时候用到了这个概念,在学习C语言的时候没有太注意们这里学一下. 我在网上结合了非常多资料,这里自己总结一下. 首先说.JAVA和C++中都有枚举类型. 假设一个变量你须要几种可 ...

  2. 监听手机晃动(摇一摇)SensorEventListener

    import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; ...

  3. java调用C#的dll

    链接地址:http://www.cnblogs.com/yinhaiming/articles/1712463.html .net产生的比java晚,其类库的封装在某些方面也比java更优秀,更全面. ...

  4. Google App Engine 学习和实践

    这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧.不当之处,请多多指正. 作者:liigo,2009/04/26夜,大连 原创链接:http://blog.csdn.ne ...

  5. 【LeetCode从零单排】No 3 Longest Substring Without Repeating Characters

    题目 Given a string, find the length of the longest substring without repeating characters. For exampl ...

  6. Appium Server 传递Android参数

    Appium  server Capabilities 传递参数    Android 特定 Android Only Capability Description Values appActivit ...

  7. SetWindowLong

    SetWindowLong函数介绍 收藏 SetWindowLong函数介绍 SetWindowLong Unicode 函数原型 LONG SetWindowLong(hwnd,nIndex,lNe ...

  8. [置顶] MyEclipse显示中文界面,在线安装教程

    准备工作 1,装好MyEclipse软件 2,可以上网 3,在线安装地址:http://download.eclipse.org/technology/babel/update-site/R0.11. ...

  9. Java基础:泛型及其擦除性、不可协变性

    转载请注明出处:jiq•钦's technical Blog 1泛型语法: 泛型类: class ClassName<T>{} 泛型方法:public <T> void f(T ...

  10. 与众不同 windows phone (17) - Graphic and Animation(画图和动画)

    原文:与众不同 windows phone (17) - Graphic and Animation(画图和动画) [索引页][源码下载] 与众不同 windows phone (17) - Grap ...