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. AI修复100年前晚清影像喜提热搜,这两大算法立功了
  2. java学习路线导航【教学视频+博客+书籍整理】
  3. docker本地私有仓库搭建
  4. Linux学习总结(四十七)NFS服务配置 上篇
  5. Javascript Array sort排序问题
  6. 编写 Debugging Tools for Windows 扩展,第 1 部分 (windbg 插件 扩展)
  7. 03_设置轴标签和范围、轴的标签(Labels on Axes)、定义轴的范围、使用linspace定义X值 (“linspace“ to Define X Values)
  8. cocos2d-x初探学习笔记(10)--运动中的加速度效果
  9. LeetCode题库第1题 两数之和
  10. php扩展之redis
  11. ad18修改过孔和走线间距_PCB设计之“过孔”
  12. 在我笔记本Ubuntu上装普罗米修斯记录
  13. 爬完点评爬某东,爬他个600多本书籍资料
  14. C/C++快速读写磁盘数据的方法
  15. 静态路由——手写路由表及综合实验
  16. 惊天骗局-----一个离开某大型门户网站人员自爆黑幕[zt]
  17. java递归把list菜单列表转为菜单树
  18. TiDB:ERROR 1265 : Data Truncated 解决
  19. 2021年十大最有前途的编程语言,第1名实至名归or名不副实?
  20. kdevelop快捷键

热门文章

  1. 微信定位真的泄露了你的精确位置
  2. gif原理+gifsicle压缩gif
  3. Python是什么意思?一篇文章给你讲清楚!
  4. Richer Convolutional Features for Edge Detection(RCF论文学习笔记)
  5. 小学生python游戏编程arcade----可旋转的坦克的发射子弹
  6. 微信公众号常见问题:
  7. layui个人中心html,Layui的简易入门教程
  8. MBA-day17 假言推理:如果的考法与题型
  9. java基于微信小程序的英语学习激励系统-计算机毕业设计
  10. 【报告分享】2020中国民营企业500强调研分析报告-全国工商联(附下载)