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启动后,桌面上会显示应用程序快捷方式图标。
【深入解析Android系统启动流程】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于懂了手机为啥经常重启了!
有18位网友表示赞同!
看了下自己的手机安卓系统,好多步骤都不太理解唉~
有20位网友表示赞同!
平时玩手机时根本没想过是啥流程启动的,现在知道了真牛!
有6位网友表示赞同!
想要了解手机内部机制,这个分析文还挺深入。
有16位网友表示赞同!
对程序员来说这篇文章很有用吧?
有14位网友表示赞同!
不知道苹果系统的启动过程跟安卓不一样吗?
有15位网友表示赞同!
原来启动一个app这么复杂啊!
有8位网友表示赞同!
希望能有更详细的图解说明,这样更容易理解。
有9位网友表示赞同!
下次手机反应慢了就看看这篇文章里有没有问题吧。
有10位网友表示赞同!
这种分析文真能让人感受到科技的厉害!
有11位网友表示赞同!
学习一下安卓系统开机流程,很有意思!
有15位网友表示赞同!
感觉这个分析文写的很专业,我有点get不到啊。
有10位网友表示赞同!
希望能结合例子更直观地解释每个步骤。
有9位网友表示赞同!
如果能测试下速度和占用资源情况就更好了!
有5位网友表示赞同!
Android系统这么复杂的吗?难怪维修费那么贵...
有15位网友表示赞同!
以后手机慢了才知道是谁在捣乱的了!
有14位网友表示赞同!
有点理解这个机制后,对手机的运作有了新的认识。
有17位网友表示赞同!
安卓系统还是比较复杂的,需要好好学习一下。
有13位网友表示赞同!
喜欢研究技术原理的文章,这篇文章很适合我!
有7位网友表示赞同!