Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动,下面我们分别来了解一下具体的过程。本篇我们主要是研究android的启动过程,linux的启动我们泛泛而过。
首先看下整个系统的启动过程,如下图:
首先通过 init.rc,可以孵化出如下进程:
-
console:启动一个shell.
-
servicemanager:启动binder IPC servicemanager.
-
mountd:绑定定义在/system/etc/mountd.conf的文件.
-
debuggerd:启动debug system.
-
rild:启动radio interfacelayer daemon(跟电话相关).
-
zygote:启动Android Java VMRuntime和 启动systemserver. 上层的应用都是从这个孵化出来
-
mediaserver:启动AudioFlinger,MediaPlayerService and CameraService.
以上是linux的启动,有了zygoteprocess后下面便是android的启动了,我们开始深入讲解
android进程都是从zygoteprocess孵化而出,那么zygote启动后都干了啥呢?
servicezygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server ---- init.rc
从init.rc中得知,我们首先看app_process,即在framework/base/cmds/app_main.cppmain函数中:
intmain(int argc, const char* const argv[])
{……..
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);
}
runtime---AppRuntime runtime;
classAppRuntime : public AndroidRuntime(android的运行空间)
我们再看start函数都干了啥?
/*
*Start the Android runtime. This involvesstarting the virtual machine
*and calling the "static void main(String[] args)" method inthe class
*named by "className".
*/
voidAndroidRuntime::start(const char* className, const boolstartSystemServer)
{
LOGD("\n>>>>>>AndroidRuntime START %s <<<<<<\n",
className!= NULL ? className : "(unknown)");
…………………
jclassstartClass;
jmethodIDstartMeth;
………
startClass= env->FindClass(slashClassName);
if(startClass == NULL) {
LOGE("JavaVMunable to locate class '%s'\n", slashClassName);
/*keep going */
}else {
startMeth= env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
if(startMeth == NULL) {
………………
}else {
env->CallStaticVoidMethod(startClass,startMeth, strArray);
…………………………
}
}
从注释看出启动了虚拟机,并调用com.android.internal.os.ZygoteInit里的main方法
继续追踪到frameworks/base/core/java/com/android/internal/os/ZygoteInit.java的main()函数,代码如下:
publicstatic void main(String argv[]) {
try{
VMRuntime.getRuntime().setMinimumHeapSize(5* 1024 * 1024);
//Start profiling the zygote initialization.
SamplingProfilerIntegration.start();
registerZygoteSocket();
…………….
gc();
……………
if(argv[1].equals("true")) {
startSystemServer();
}else if (!argv[1].equals("false")) {
thrownew RuntimeException(argv[0] + USAGE_STRING);
}
if(ZYGOTE_FORK_MODE) {
runForkMode();
}else {
runSelectLoopMode();
}
………………
}
}
privatestatic final boolean ZYGOTE_FORK_MODE = false
从main函数可以看出,主要是做一些初始化zygote,并孵化systemservice进程
我们具体看下startSystemServer()方法:
privatestatic boolean startSystemServer()
throws MethodAndArgsCaller,RuntimeException {
……………………
/*Request to fork the system server process */
pid= Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags,rlimits,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
}
以上zygote fork出了system_server进程,systemService这是第一个被zygote孵化出来的,由它启动了android的核心进程,如ActivityManager,WindowManager, PackageManager等.我们下一步进入看看它是如何启动上层进程的,代码位于frameworks/base/services/java/com/android/server/systemserver.java
首先看下main函数:
publicstatic void main(String[] args) {
……….
checkStorageSpace();---检查/data空间内存状况,如果是低内存,将会删除/data下的保留文件已腾出空间
…………….
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);----systemserver会一直在运行,所以会保留一定内存供其持续运行
System.loadLibrary("android_servers");
init1(args);----native方法
}
init1是native方法,代码在frameworks/base/services/jni/com_android_server_systemService.cpp中,主要是启动一下native的进程,比如:SurfaceFlinger,AudioFlinger, etc..),
最后调用init2()启动androidservice ---- android.server.ServerThread。具体我们看下:
extern"C" int system_init();
staticvoid android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
system_init();
}
上面我们还是没有看到我们想要的,继续看
frameworks/base/cmds/system_server/library/system_init.cpp:
extern"C" status_t system_init()
{
…….
sp<ProcessState>proc(ProcessState::self());
sp<IServiceManager>sm = defaultServiceManager();
……………
if(strcmp(propBuf, "1") == 0) {
//Start the SurfaceFlinger
SurfaceFlinger::instantiate();
}
SensorService::instantiate();
……
if(!proc->supportsProcesses()) {
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
}
……..
AndroidRuntime*runtime = AndroidRuntime::getRuntime();
LOGI("Systemserver: starting Android services.\n");
runtime->callStatic("com/android/server/SystemServer","init2");
if(proc->supportsProcesses()) {
LOGI("Systemserver: entering thread pool.\n");
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
…………..
}
以上启动了一些native的进程 如 SurfaceFlinger,SensorService,MediaPlayerService等等,最后回调到在framework/base/cmds/app_main.cpp init2函数中:
publicstatic final void init2() {
Slog.i(TAG,"Entered the Android system server!");
Threadthr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
到这我们来到了启动的最后过程ServerThread,在这里将会启动android上层的各种service,WindowManagerService,ActivityService等等,代码还是在framework/base/cmds/app_main.cpp中,
最后,调用各服务的systemReady()函数通知系统就绪,至此android启动完毕。