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.javamain()函数,代码如下:


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方法

}

init1native方法,代码在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启动完毕。




更多相关文章

  1. Android应用程序的基本组件之Activity
  2. android java代码的启动:app_process
  3. Android的多媒体框架Opencore代码阅读
  4. Android(安卓)进程间通信(IPC)
  5. Android从Linux系统启动
  6. Android(安卓)启动应用程序方式
  7. 【转】Android的电源管理
  8. Android开机自启动
  9. android java代码的启动:app_process

随机推荐

  1. Android(安卓)G711A 音频编解码,去除“吱
  2. [置顶] Android官方文档系列(翻译)
  3. 获得Android设备的唯一序列号
  4. Android Xml文件生成,Xml数据格式写入
  5. Android官方DataBinding(三):RecyclerView
  6. Android常见错误处理
  7. Android Studio 导入 GreenDao
  8. 使用PHP开发Android应用程序技术介绍
  9. Android:Designing for Performance
  10. Android(一)Android Eclipse环境搭建