第一个系统进程init
Android设备的启动必须经历三个阶段:Boot Loader, Linux Kernel和 Android系统服务。 默认情况下他们都有自己的启动画面。严格说Android系统是运行在Linux内核之上的一系列”服务进程”,并不是完整意义的”操作系统”。这些进程是维持设备正常工作的关键,它们的”老祖宗”就是init.
作为Android中第一个被启动的进程,init的pid=0.它通过解析init.rc脚本来构建出系统形态。
init.rc语法
一个完整的init.rc脚本由4种类型组成:
- Action(动作)
- Commands(命令)
- Services(服务)
- Options(选项)
init进程启动总结
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务
- 解析init.rc配置文件,并启动Zygote进程
系统关键服务的启动简析
- init作为Android系统的第一个进程,它通过解析init.rc来陆续启动其他关键系统进程。 这其中最重要的就是ServiceManager, Zygote, SystemServer.
1.Android的”DNS服务器” ServiceManager
ServiceManager是在init.rc里描述并由init进程启动。
/*system/core/rootdir/Init.rc*/ service servicemanager /system/bin/servicemanager class core user system group system critical (该选项说明是系统关键进程) onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm
servicemanager是一个linux程序。它在设备中的存储路径是/system/bin/servicemanager. 源码路径是/frameworks/native/cmds/servicemanager.
ServiceManager所属class是core. core组的特性是,这些进程会同时被启动或停止。critical (该选项说明是系统关键进程)意味着如果进程在4分钟内异常退出超过4次,则设备将重启进入还原模式。当ServiceManager重启时,其他关键进程如zygote,media,surfaceflinger等也会被restart.
2.”孕育”新的线程和进程 Zygote
- zygote 字面意思是”受精卵”,可以”孕育“一个”新生命“.Android中的大多数应用进程和系统进程都是通过zygote来生成的。
zygote也是由init在解析rc脚本时启动的。
ServiceName:zygote
Path: /system/bin/app_process
Arguments: -Xzygote /system/bin --zygote --start-system-server
所在的程序名叫”app_process”.源码路径在/frameworks/base/cmds/app_process 看看它的Android.mk
LOCAL_SRC_FILES:= \
app_main.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
liblog \
libbinder \
libandroid_runtime
LOCAL_MODULE:= app_process
得知app_process具体实现是app_main.cpp. 其内容主要是:
if (zygote){
//启动虚拟机,并执行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* className, const char* options)
......
JNIEnv* env;
if (startVm(&mJavaVm, &env) != 0 ){//启动虚拟机
return;
}
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来生成一个新进程,用于承载各个系统服务
- native本地层Service(比如SurfaceFlinger, AudioFlinger等)的启动。
java层,各个service的启动
创建新的线程来启动
class ServerThread extends Thread { public void run(){ Looper.prepareMainLooper(); //启动各个系统服务,如:PowerManagerService、ActivityManagerService等 Looper.loop(); } }
4.Launcher启动过程
Launcher就是Android系统的桌面,其特点如下:
- 作为android系统的启动器,用于启动应用程序。
- 用于显示和管理应用程序快捷图标,或者其他桌面组件。
被Systemserver进程启动的AMS会启动Launcher,Launcher启动后会将应用程序快捷图标显示到桌面上.