Android 核心分析 之八Android 启动过程详解

时间:2022-08-14 03:51:25

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

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

下载附件  保存到相册

2012-3-19 11:28 上传

 

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

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. Windows Store App JavaScript 开发:小球运动示例

    通过前面内容的学习,相信读者已经对开发基于JavaScript的Windows应用商店应用有了一定的了解,本小节通过一个小球运动的示例来介绍如何新建一个JavaScript的Windows应用商店项目 ...

  2. 获取HTML

    public class GetHtml { public string GetWebRequest(string url) { Uri uri = new Uri(url); WebRequest ...

  3. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  4. postfix启动失败

      [root@localhost pid]# /usr/sbin/postfix start postfix/postfix-script: warning: not owned by postfi ...

  5. 线段覆盖4(codevs 3012)

    题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段 ...

  6. mysql 的 存储结构(储存引擎)

    1 MyISAM:这种引擎是mysql最早提供的.这种引擎又可以分为静态MyISAM.动态MyISAM 和压缩MyISAM三种:    静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的, ...

  7. 一句代码,更加优雅的调用KVO和通知

    来源:wazrx 链接:http://www.jianshu.com/p/70b2503d5fd1 写在前面 每次使用KVO和通知我就觉得是一件麻烦的事情,即便谈不上麻烦,也可说是不方便吧,对于KVO ...

  8. springMVC&lpar;5&rpar;---导入excel文件数据到数据库

    springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...

  9. xml与Excel转换

    使用Python将如下xml格式转换为Excel格式: xml转为xls格式文件: xml格式如下: <?xml version="1.0" encoding="U ...

  10. C-Lodop回调函数的触发

    高版本的火狐和谷歌不再支持np插件之后,Lodop公司推出了C-Lodop,解决了这些浏览器不能用Lodop插件方式打印的问题,相比较Lodop插件,C-Lodop由于是以服务的形式出现,返回值不能直 ...