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