
和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、SystemServer 启动的服务有哪些
二、SystemServer启动总体流程概述
三、SystemServer 如何启动,是谁启动的?
四、 SystemServer 启动入门 main 方法
五、SystemServer Run 方法初始与启动
六、SystemServer 的引导服务有哪些
七、SystemServer 的核心服务有哪些
八、SystemServer 的其他服务有哪些
一、SystemServer 启动的服务有哪些
SystemServer 主要启动 ActivityManagerService、PackageManagerService、WindowManagerService、LightsService、LightsService、BatteryService、TelephonyRegistry、RecoverySystemService 等等,主要分三大类,后文会详细列举。
1.SystemServer 启动的服务

SystemServer 启动的服务

SystemServer 启动的服务
二、SystemServer启动总体流程概述
1.SystemServer 代码
\alps\frameworks\base\services\java\com\android\server\SystemServer.java

SystemServer 进程启动导图
三、SystemServer 如何启动,是谁启动的?
SystemServer是通过Zygote 启动的,在ZygoteInit.java类的(frameworks\base\core\java\com\android\internal\os\ZygoteInit.java) main方法中通过forkSystemServer启动。
public static void main(String argv[]) {
....
//设置变量区分是否启动SystemServer
boolean startSystemServer = false;
String socketName = "zygote";
String abiList = null;
boolean enableLazyPreload = false;
for (int i = 1; i < argv.length; i++) {
if ("start-system-server".equals(argv[i])) {
// 需要启动时候,将标志位设置为true
startSystemServer = true;
} else if ("--enable-lazy-preload".equals(argv[i])) {
enableLazyPreload = true;
}
... ...
if (startSystemServer) {
// 通过 Zygote fork 出 SystemServer
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
// {@code r == null} in the parent (zygote) process, and {@code r != null} in the
// child (system_server) process.
if (r != null) {
r.run();
return;
}
}
四、 SystemServer 启动入门 main 方法
main 入口 通过 new SystemServer().run();开启SystemServer启动。
main 入口代码如下:
/**
* The main entry point from zygote.
*/
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
通过Main入口,调用SystemServer 构造方法。
public SystemServer() {
// 检查工程模式.
mFactoryTestMode = FactoryTest.getMode();
// 判断是否是重启
mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));
mRuntimeStartElapsedTime = SystemClock.elapsedRealtime();
mRuntimeStartUptime = SystemClock.uptimeMillis();
}
private void run() {
... ...
}
五、SystemServer Run 方法初始与启动
1.SystemServer Run 方法
private void run() {
try {
traceBeginAndSlog("InitBeforeStartServices");
//初始化时间
if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
Slog.w(TAG, "System clock is before 1970; setting to 1970.");
SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
}
//设置默认时区
String timezoneProperty = SystemProperties.get("persist.sys.timezone");
if (timezoneProperty == null || timezoneProperty.isEmpty()) {
Slog.w(TAG, "Timezone not set; setting to GMT.");
SystemProperties.set("persist.sys.timezone", "GMT");
}
... ...
// 开始进入Android SystemServer
Slog.i(TAG, "Entered the Android syst

最低0.47元/天 解锁文章
2648

被折叠的 条评论
为什么被折叠?



