深入解析Android系统启动流程

更新:11-03 神话故事 我要投稿 纠错 投诉

init.rc语法

一个完整的init.rc脚本由4种类型组成:

操作命令服务选项

init进程启动总结

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

系统关键服务的启动简析

init 作为Android 系统的第一个进程,它依次启动其他关键系统进程通过解析init.rc。其中最重要的是ServiceManager、Zygote、SystemServer。

1.Android的"DNS服务器" ServiceManager

ServiceManager 在init.rc 中描述并由init 进程启动。

/*系统/核心/rootdir/Init.rc*/

服务servicemanager /system/bin/servicemanager

班级核心

用户系统

团体系统

important(该选项表示是系统的关键进程)

onrestart 重启zygote

onrestart 重新启动媒体

onrestart 重新启动surfaceflinger

onrestart 重新启动drmservicemanager 是一个linux 程序。它在设备中的存储路径为/system/bin/servicemanager。源代码路径为/frameworks/native/cmds/servicemanager。

ServiceManager所属的类是核心类。核心组的特点是这些进程会同时启动或停止。 Critical(该选项表示是关键系统进程)表示如果该进程在4分钟内异常退出超过4次,设备将重新启动进入恢复模式。当ServiceManager重启时,其他关键进程如zygote、media、surfaceflinger等也会被重启。

2."孕育"新的线程和进程 Zygote

zygote字面意思是‘受精卵’,可以‘孕育’出‘新生命’。 Android中大部分应用程序进程和系统进程都是通过zygote生成的。 zygote也是由init在解析rc脚本时启动的。

服务名称:zygote

路径: /system/bin/app_process

参数: -Xzygote /system/bin --zygote --start-system-server 程序名称为“app_process”。源代码路径为/frameworks/base/cmds/app_process。看一下它的Android.mk

LOCAL_SRC_FILES:=

应用程序_main.cpp

LOCAL_SHARED_LIBRARIES :=

libcutils

libutils

库博客

libbinder

libandroid_运行时

LOCAL_MODULE:=app_process了解到app_process的具体实现是app_main.cpp。其主要内容是:

如果(受精卵){

//启动虚拟机并执行ZygoteInit

runtime.start("com.android.internal.os.ZygoteInit",startSystemServer?"start-system-server":"");

}runtime是一个变量,它实际上是一个AndroidRuntime对象。其start函数源码如下

/*frameworks/base/core/jni/AndroidRuntime.cpp*/

void AndroidRuntime:start(const char* 类名, const char* 选项)

.

JNIEnv* 环境;

if (startVm(mJavaVm, env) !=0 ){//启动虚拟机

返回;

}

onVmCreated(env); //虚拟机启动后回调zygote总结:创建AppRuntime,调用start()方法,启动zygote进程创建java虚拟机,注册java虚拟机的jni方法。通过jni调用zygoteinit中的main方法。进入zygote的java框架层(之前是native层),开启一个进程启动systemserver来处理系统进程(创建系统进程)。通过registerZygoteSocket方法创建服务器端socket,然后通过无限循环监听AMS请求。当接收到之后创建一个新的应用程序进程

3.Android的"系统服务"-- SystemServer

SystemServer是Android进入Launcher之前的最后准备。它提供了许多用Java语言编写的“系统服务”。

ZygoteInit通过Zygote.forkSystemServer生成一个新进程,用于托管各个系统服务原生本地层Service(如SurfaceFlinger、AudioFlinger等)的启动。 Java层,每个服务的启动都会创建一个新的线程来启动

类ServerThread 扩展线程{

公共无效运行(){

Looper.prepareMainLooper();

//启动各种系统服务,如:PowerManagerService、ActivityManagerService等

Looper.loop();

}

}

4.Launcher启动过程

Launcher是Android系统的桌面。其特点如下:

作为android系统的启动器,用于启动应用程序。用于显示和管理应用程序快捷方式图标或其他桌面组件。 Systemserver进程启动的AMS将启动Launcher。 Launcher启动后,桌面上会显示应用程序快捷方式图标。

用户评论

执笔画眉

终于懂了手机为啥经常重启了!

    有18位网友表示赞同!

猫腻

看了下自己的手机安卓系统,好多步骤都不太理解唉~

    有20位网友表示赞同!

你瞒我瞒

平时玩手机时根本没想过是啥流程启动的,现在知道了真牛!

    有6位网友表示赞同!

哭着哭着就萌了°

想要了解手机内部机制,这个分析文还挺深入。

    有16位网友表示赞同!

∞◆暯小萱◆

对程序员来说这篇文章很有用吧?

    有14位网友表示赞同!

不识爱人心

不知道苹果系统的启动过程跟安卓不一样吗?

    有15位网友表示赞同!

虚伪了的真心

原来启动一个app这么复杂啊!

    有8位网友表示赞同!

来瓶年的冰泉

希望能有更详细的图解说明,这样更容易理解。

    有9位网友表示赞同!

疯人疯语疯人愿

下次手机反应慢了就看看这篇文章里有没有问题吧。

    有10位网友表示赞同!

軨倾词

这种分析文真能让人感受到科技的厉害!

    有11位网友表示赞同!

打个酱油卖个萌

学习一下安卓系统开机流程,很有意思!

    有15位网友表示赞同!

醉枫染墨

感觉这个分析文写的很专业,我有点get不到啊。

    有10位网友表示赞同!

傲世九天

希望能结合例子更直观地解释每个步骤。

    有9位网友表示赞同!

清羽墨安

如果能测试下速度和占用资源情况就更好了!

    有5位网友表示赞同!

景忧丶枫涩帘淞幕雨

Android系统这么复杂的吗?难怪维修费那么贵...

    有15位网友表示赞同!

见朕骑妓的时刻

以后手机慢了才知道是谁在捣乱的了!

    有14位网友表示赞同!

艺菲

有点理解这个机制后,对手机的运作有了新的认识。

    有17位网友表示赞同!

江山策

安卓系统还是比较复杂的,需要好好学习一下。

    有13位网友表示赞同!

泡泡龙

喜欢研究技术原理的文章,这篇文章很适合我!

    有7位网友表示赞同!

【深入解析Android系统启动流程】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:揭秘:掌握话语权的关键人群特征 下一篇:惊艳一簇:鸡蛋花的美妙绽放