android的啓動過程

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啓動完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章