- 當引導(dǎo)程序啟動linux內(nèi)核后盯拱,會加載各種驅(qū)動和數(shù)據(jù)結(jié)構(gòu)骇两。有了驅(qū)動以后萌衬,開始啟動Android系統(tǒng)同時會加載用戶級別的第一個進程init
- 加載init.rc配置文件,會啟動一個Zygote進程硕蛹,此進程是Android系統(tǒng)的一個母進程,用來創(chuàng)建Android的其他服務(wù)進程硕并。
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
- 在app_process目錄下執(zhí)行App_main.cpp法焰。在其內(nèi)部類AppRuntime中,啟動com.android.internal.os.ZygoteInit類,即從C++代碼跳轉(zhuǎn)到Java代碼中倔毙。
- ZygoteInit.java :
啟動VMRuntime 配置一些參數(shù)埃仪。同時啟動SystemServer服務(wù)。
- SystemServer.java:
System.loadLibrary("android_servers");//JNI調(diào)用
init1(args);//native方法
native public static void init1(String [] args);
- SystemServer 對應(yīng)的C++代碼com_android_server_SystemServer.cpp
在此程序中陕赃,把init1方法通過指針映射到了android_server_SystemServer_init1卵蛉。在其中執(zhí)行了 system_init()颁股,而system_init()是抽象函數(shù),還得尋找其實現(xiàn)傻丝。
extern "C" int system_init();
- system_init實現(xiàn)中甘有,初始化了一堆硬件服務(wù),例如傳感器葡缰,聲音,顯示設(shè)備等亏掀。之后又調(diào)用了Java層的com.android.server.SystemServer中的靜態(tài)方法inti2。代碼:
AndroidRuntime* runtime = AndoridRuntime::getRuntime();
runtime->callStatic("com/android/server/SystemServer","init2");//為JNI調(diào)用
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
- ServerThread為SystemServer的內(nèi)部類泛释,是一個線程滤愕,其run方法中:(Looper初次出現(xiàn))初始化了Android系統(tǒng)中的諸多Service,例如ActivityManagerService怜校,WindowManagerService该互,LocationService等等,并將這些Serive保存到一個Map中韭畸。最后在Service初始化完成后宇智,調(diào)用ActivityManagerService的systemReady方法,接收一個Runable對象胰丁。
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runable(){...});
- ActivityManagerService systemReady()方法:
//打開第一個Activity
mMainStack.resumeTopActivityLocked(null);//mMainStack是一個ActivityStack類型
- ActivityStack resumeTopActivityLocked()方法:
ActivityRecord next = topRunningActivityLocked(null);
if(next==null){
//在最頂層運行的Activity 為空說明連桌面應(yīng)用都木有随橘。那就先啟動我們的桌面應(yīng)用吧!
return mServices.startHomeActivityLocked();
}
- 此時Android系統(tǒng)啟動完成锦庸,打開了Luncher應(yīng)用的Home界面机蔗!
- 總結(jié):
當Android系統(tǒng)第一次啟動時,和Windows系統(tǒng)一樣都有一個類似于引導(dǎo)系統(tǒng)啟動的程序甘萧,引導(dǎo)系統(tǒng)啟動萝嘁。Android系統(tǒng)第一個啟動的進程是Zygote(孵化的意思)進程,由他負責再啟動其他進程扬卷,隨之而來的是創(chuàng)建各種需要的文件夾牙言,初始化各種硬件設(shè)備和服務(wù),硬件設(shè)備包括傳感器怪得,顯示設(shè)備咱枉,聲音設(shè)備等等,服務(wù)就是我們平時用的WindowServiceManager徒恋,ActivityServiceManager蚕断,他們都在SystemServer的一個內(nèi)部類ServerThread(是一個線程)的run方法中被初始化,保存在Map中入挣。之后調(diào)用ActivityManagerService的resumeTopActivityLocked方法打開第一個Activty應(yīng)用亿乳,這個應(yīng)用便是我們的桌面應(yīng)用,至此Android系統(tǒng)啟動完畢径筏。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者