前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 进阶解密笔记-Android 系统进程

Android 进阶解密笔记-Android 系统进程

作者头像
Yif
发布2019-12-25 14:43:37
6300
发布2019-12-25 14:43:37
举报
文章被收录于专栏:Android 进阶Android 进阶

摘抄自<<Android 进阶解密>>一书

init 进程

Android 系统启动流程:

  1. 启动电源及系统启动
  2. 引导程序BootLaoder
  3. Linux内核启动
  4. init进程启动:主要是用来初始化和启动属性服务,也用来启动Zygote进程

僵尸进程:在Linux中,父进程使用fork创建子进程,子进程终止后,但父进程不知道子进程终止,虽然子进程已经退出,但系统还未它保留一定的信息(比如进程号,退出状态,运行时间),这时候,子进程就被称为僵尸进程。系统资源有限,如果进程被僵尸进程耗尽,那么就无法创建出新的进程。 Android 提供一种属性服务相当于Windows下的注册表管理器记录用户及软件信息,即使系统或软件重启,根据之前的信息,进行一些初始化操作。 在Linux新内核中:epoll用来替换select,它是Linux为处理大量文件而做的改进的poll,是Linux多路复用I/O接口select/poll的增强版。它能够显著的提高程序在大量并发连接中只有少量活跃情况下的系统CPU利用率。epoll内部用于保存事件的数据类型是红黑树,查找速度快,只有O(logn),select采用数组保存信息查找速度慢只有O(n),只有当少量文件描述符值,epollselect的效率才会差不多。

系统属性分为两种类型:一种普通属性,一种控制属性,控制属性用来执行一些命令,比如开机动画。 init进程总结:

  1. 创建和挂载启动所需的文件目录
  2. 初始化与启动属性服务
  3. 解析init.rc配置文件并启动Zygote进程

Zygote进程

Android系统中,DVMDalvik虚拟机)与ART、应用程序进程以及运行系统关键服务的SystemService进程都是有Zygote进程创建的。它通过fork(复制进程)的形式创建应用程序的进程与systemservice进程。zygote启动时会创建DVMART

Android 5.0开始,支持64位程序,因此zygote也就有了32位与64位区别

Zygote进程都是通过fork创建子进程.

app_main的函数中调用了AndroidRuntimestart方法。start方法进行启动java虚拟机,为java虚拟机注册JNI方法,而Zygoteinitmain方法由java语言编写,当前运行逻辑在Native中,这就需要JNI调用java。这样Zygote就进入了java框架层。

ZygoteInitmain方法:

  1. 创建一个Server端的Socket
  2. 预加载类与资源
  3. 启动SystemServer进程
  4. 等待AMS请求创建新的应用程序进程

Zygote进程启动总结:

  1. 创建Appruntime并调用start方法,启动Zygote进程
  2. 创建java虚拟机并为java虚拟机注册JNI方法
  3. 通过JNI调用ZygoteInitmain函数进入Zygotejava框架层
  4. 通过registerZygoteSocket方法创建服务器端的socket,并通过runSelectLoop方法等待AMS请求来创建新的应用程序进程
  5. 启动systemserver进程

SystemServer进程

主要用于创建系统服务,比如AMSPMSWM都是它创建

SystemServermain方法只调用了SystemServerrun方法 该方法主要做了:

  1. 创建消息Looper
  2. 加载动态库liandroid_servers.so
  3. 创建系统context
  4. 启动引导服务,比如AMS、PowerManagerServicePackageManagerService等服务
  5. 启动核心服务,比如DropBoxManagerService、BatteryService
  6. 启动其他服务,比如CamManagerService、AlarmManagerService、WindowManagerService

ServiceManager用来管理系统各种Service,用于系统C/S架构中的Binder通信机制;Client端要使用某个Service,需要先到servicemanager查询service相关信息,然后根据相关信息所在的service进程建立通信。

SystemServer总结:

  1. 启动Binder线程池,这样就可以与其他进程通信
  2. 创建SystemServiceManager,其用于对系统的服务进行创建,启动与生命周期管理
  3. 启动各种系统服务

Lanuncher进程

系统最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序叫做Lanuncher。它会启动过程中请求PackageManagerService返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。

通俗来讲Lanuncher就是Android系统桌面

  1. 作为android系统的启动器,用于启动应用程序
  2. 作为Android系统的桌面,用于显示和管理应用程序快捷图标或者其他桌面组件

启动的应用程序就是Lanuncher,因为LanuncherAndroidmanifest文件中的intent-filter标签匹配了ActionIntent.ACTION_MAIN,Category为Intent.CATEGORY_HOME,设置了这样的属性,activity就成为主activity

Launcher显示应用程序图标,它是用工作区的形式显示系统安装应用程序的快捷图标,每一个工作区用来描述一个抽象的桌面,由n个屏幕组成,每个屏幕又分n个单元格每个单元格用来显示一个应用程序快捷图标

Android系统启动流程

  1. 启动电源以及系统启动

当电源按下时引导芯片代码从预订的地方开始执行。加载引导程序BootLoaderRAM,然后执行

  1. 引导程序BootLoader

它是在android操作系统开始运行前的一个小程序,它的主要作用把系统OS拉起来并运行

  1. Linux内核启动

当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程

初始化和启动属性服务,并且启动Zygote进程

  1. Zygote进程启动

创建Java虚拟机并为java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer服务

  1. SystemServer进程启动

启动Binder线程池和SystemServiceManager,并且启动系统各种服务

  1. Launcher进程启动

SystemServer进程启动的AMS会启动LauncherLauncher启动后会将已经安装的应用快捷图标显示在桌面上

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年7月18日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • init 进程
  • Zygote进程
  • SystemServer进程
  • Lanuncher进程
  • Android系统启动流程
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档