热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android定时server,Android系统启动(四)SystemServer篇

从上篇的Zygote学习中,了解到Zygote进程最后启动了SyetemServer进程,那么这篇文章就来分析下SystemServer。一、Syste

从上篇的Zygote学习中,了解到Zygote进程最后启动了SyetemServer进程,那么这篇文章就来分析下SystemServer。

一、SystemServer启动流程

c6f464457f4c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

这个过程在zygote进程中,主要包括这么几个内容:

1.1 Zygote fork SystemServer

1.2 当system_server进程创建失败时,将会重启zygote进程:

当kill system_server进程后,只重启zygote64和system_server,不重启zygote;

当kill zygote64进程后,只重启zygote64和system_server,也不重启zygote;

当kill zygote进程,则重启zygote、zygote64以及system_server。

1.3 Zygote通过信号处理函数SigChldHandler监听所有子进程的存亡

static void SigChldHandler(int /*signal_number*/) {

pid_t pid;

int status;

//Zygote监听所有子进程的存亡

while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {

//某一个子进程挂了

if (WIFSIGNALED(status)) {

if (WTERMSIG(status) != SIGKILL) {

ALOGI("Process %d exited due to signal (%d)", pid, WTERMSIG(status));

}

}

//如果挂掉的是SystemServer

if (pid == gSystemServerPid) {

ALOGE("Exit zygote because system server (%d) has terminated", pid);

kill(getpid(), SIGKILL); //Zygote自杀

}

}

}

二、SystemServer启动后的工作

c6f464457f4c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

关键流程说明:

ZygoteInit.startSystemServer()

fork 子进程 system_server,进入 system_server 进程。

ZygoteInit.handleSystemServerProcess()

设置当前进程名为“system_server”,创建 PathClassLoader 类加载器。

RuntimeInit.zygoteInit()

重定向 log 输出,通用的初始化(设置默认异常捕捉方法,时区等),初始化 Zygote -> nativeZygoteInit()。

app_main::onZygoteInit()

proc->startThreadPool(); 启动Binder线程池,这样就可以与其他进程进行通信。

ZygoteInit.main()

开启 DDMS 功能,preload() 加载资源,预加载 OpenGL,调用 SystemServer.main() 方法。

SystemServer.main()

先初始化 SystemServer 对象,再调用对象的 run() 方法。

SystemServer.run()

createSystemContext

startBootstrapServices();

startCoreServices();

startOtherServices();

Looper.loop();

三、系统服务

startBootstrapServices:引导服务

服务

作用

Installer

系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务

ActivityManagerService

负责四大组件的启动、切换、调度。

PowerManagerService

计算系统中和Power相关的计算,然后决策系统应该如何反应

LightsService

管理和显示背光LED

DisplayManagerService

用来管理所有显示设备

UserManagerService

多用户模式管理

SensorService

为系统提供各种感应器服务

PackageManagerService

用来对apk进行安装、解析、删除、卸载等等操作

startCoreServices:核心服务

服务

作用

BatteryService

管理电池相关的服务

UsageStatsService

收集用户使用每一个APP的频率、使用时常

WebViewUpdateService

WebView更新服务

startOtherServices:其他服务

服务

作用

CameraService

摄像头相关服务

AlarmManagerService

全局定时器管理服务

InputManagerService

管理输入事件

WindowManagerService

窗口管理服务

VrManagerService

VR模式管理服务

BluetoothService

蓝牙管理服务

NotificationManagerService

通知管理服务

DeviceStorageMonitorService

存储相关管理服务

LocationManagerService

定位管理服务

AudioService

音频相关管理服务

….

四、SystemServiceManager分析

从名字就很明显知道SystemServiceManager是系统服务管理类,简单了解两个方法:

4.1 startService函数

很简单,就是通过反射创建服务对象,并调用其onStart( )方法启动。

4.2 startBootPhase函数

Systemserver会将设备启动分成几个阶段,每个阶段service通过继承SytemService实现的onBootPhase方法来做一些对应的操作,相当于一个回调。

c6f464457f4c?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation



推荐阅读
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
author-avatar
李林1108_965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有