Framework启动流程

在手机的Linux系统启动后,Framework层第一个启动的进程就是zygote。Zygote负责预加载framework层的共享资源,比如SDK中的类,同时它是framework层上所有虚拟机进程的孵化器,即所谓的“源头”。所有基于虚拟机的java程序,比如我们安装的apk进程、framework层的系统进程等,都是由zygote创建出来的。

一、Zygote

Zygote进程的大致启动过程如下:

1.       linux系统启动

2.       linux依次启动在/init.rc中注册的进程,这其中就有zygote进程,它被注册为一个service,即常驻进程:

这段代码实际上就是执行app_process可执行文件,并将此进程命名为zygote

3.       app_process中创建虚拟机对象,创造java执行环境,开始加载ZygoteInit.java方法,并从其main方法开始执行。ZygoteInit类主要进行的工作有:

1)  启动Socket服务,用于接收建立进程的指令。

2)  Framework共享资源的预加载。这些类及资源实际上就是SDK 中定义的大部分类和

资源。这些资源是所有进程共享的。当通过zygote 孵化出新的APK进程后,这些进程只需要去装载APK自身包含的类和资源即可,无需处理SDK部分的类,因为Zygote在启动时已经加载完毕了。这就有效地解决了多个APK 共享Framework 资源的问  题。具体资源大概分为2类:

a.预加载Framework类列表。此列表定义在frameworks/base/preload-classes文件中。是通过WritePreloadedClassFile.java类生成的。

b.加载preload-resources。在frameworks/base/core/res/res/values/arrays.xml中定义。包含两类资源:drawable和color。

3)通过fork孵化出第一个进程:SystemServer。

二、SystemServer

SystemServer,也就是系统服务,我们平时经常用到的和依赖的一些系统服务都是在SystemServer进程中以线程的形式存在的。其中包括ActivityManagerService、WindowManagerService等等这样重要的服务。

SystemServer启动的大致过程如下:

启动SystemServer后,Zygote进程基本上初步启动完毕。此后便等待Socket客户端(一般就是AmS)传来新的指令,通知其启动一个新进程。Android中的所有虚拟机进程都是通过Zygote启动的。这其中就包括用户安装的Apk。现在看一下Zygote的进程信息:

我们看到zygote的父进程id是1,正说明它是init进程启动的。

再来看一下那些apk程序的进程信息:

这些进程的父进程id都是120,也就是上面的zygote进程。这也验证了所有进程都是zygote孵化出来的,包括一些framework中的系统进程,和用户安装的apk进程。

再来看一下SystemSever进程:

同样父进程也是120,即zygote。

三 、

当SystemServer中的服务线程都启动后,会启动第一个Activity。但其并不是启动某一个具体的Activity。而是发送了一个category包含CATEGORY_HOME的intent。就是说,任何程序的activity只要声明了可以响应此intent,就可以作为home程序运行。但是只有在程序的第一个activity,也就是category必须同时包含CATEGORY_HOME和CATEGORY_LAUNCHER的activity才能够起作用。否则在按Home键时是不会触发你的程序的。

至此,framework的启动过程基本告一段落了。在触发了第一个Activity(即Home程序)后,就等待着新的请求的到来。

一般常见的情况为,用户在Laucher界面上点击一个图标,Launcher调用startActivity()方法请求SystemServer中的AmS(ActivityManagerService)服务,AmS判断Activity所在的进程是否已存在,如果不存在则向Zygote进程的Socket服务端发送请求,Zygote随后便孵化出一个新的空进程,用来加载具体的apk文件,并在该进程中运行ActivityThread类,并完成该进程的启动过程,随后经过一系列复杂的验证以及AmS、WmS与目标进程的交互后,最终完成目标Activity的显示。

关于Activity和AmS的工作细节暂不包括在本文中。

以上。

Android Framework启动流程相关推荐

  1. Android开机启动流程简析

    Android开机启动流程简析 (一) 文章目录 Android开机启动流程简析 (一) 前言 一.开机启动的流程概述 二.Android的启动过程分析 (1).总体流程 init简述 Zygote简 ...

  2. Android -- Wifi启动流程分析

    Android -- Wifi启动流程分析 Android网络各个模式中,Wifi应该是目前最常用的一种网络方式了:下面就简单介绍下Android中Wifi的启动流程. 当我在Setting菜单里点击 ...

  3. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

  4. 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )

    文章目录 前言 一.Android 进程 二.Android 应用启动流程 前言 参考 [Android 逆向]Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_a ...

  5. Android开机启动流程

    Android开机启动流程 一.APPS PBL(Application primary boot loader:主引导加载程序) 二.XBL(Extensible boot loader:可扩展引导 ...

  6. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  7. 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)

    [SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...

  8. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  9. Android 蓝牙启动流程(以及设置蓝牙为作为sink模式 接收端模式)

    本文以Android 7.1为基础 最近在做蓝牙开发,研究了一下蓝牙的启动流程,总结一下 Google在Android源码中推出了它和博通公司一起开发的BlueDroid以替代BlueZ.BlueZ的 ...

最新文章

  1. Guava学习笔记:缘起
  2. ML之DT:基于DT算法对泰坦尼克号乘客数据集进行二分类(是否获救)预测
  3. 【学习笔记】关于最大公约数(gcd)的定理
  4. cisco routemap 能在出接口调用吗_潍坊驰燃一号燃料能不能合法在家经营,手续好办吗?...
  5. linux删除百万个文件夹,linux下如何删除一百万个文件
  6. linux vnc 改端口号,RHEL6下配置vncserver服务(包括修改vnc端口)
  7. java实验检查危险品代码_2019JAVA第六次实验报告
  8. vba mysql 80004005_Access运行时错误'-2147467259(80004005)':方法'Controls'作用于对象'CommandBarPopup'时失败的解决方法...
  9. 一、 Python概述、变量
  10. 用Hello World校验Docker的安装
  11. 黑莓刷机及情景设置来电和短信等没有声音的解决办法
  12. python绘制密度散点图
  13. SVM 超平面计算例题
  14. A problem occurred starting process 'command 'xxx
  15. 【名单回顾】2019/2020年第11届蓝桥杯大赛青少年组(北京赛区)选拔赛C++初级组一二等奖获奖名单
  16. GeekPwn再现碟中谍场景 黑客肆意控制智能摄像头
  17. Anaconda安装labelImg图像标注软件
  18. iterator 的遍历 循环输出数字,页码
  19. ubuntu下的beyond compare破解
  20. NCX SQL编程规范

热门文章

  1. 最新年龄估计综述(Deep learning approach for facial age classification: a survey of the state of the art)
  2. 2022-05-08 基于卷积神经网络ResNet的车型识别(实验)
  3. 室内定位技术将会怎样颠覆传统商业运营?
  4. 计算机网络技术期末复习考点
  5. P1526 [NOI2003] 智破连环阵 题解
  6. ios制作h5的桌面webapp的详解
  7. JavaScript级联链表
  8. Excel隔行插入空行(亲自实践)
  9. css绘制梯形图形,及显示矩形图片
  10. Putty(菩提)远程连接服务器教程听语音