第一個系統進程init
Android設備的啓動必須經歷三個階段:Boot Loader, Linux Kernel和 Android系統服務。 默認情況下他們都有自己的啓動畫面。嚴格說Android系統是運行在Linux內核之上的一系列"服務進程",並不是完整意義的"操作系統"。這些進程是維持設備正常工作的關鍵,它們的"老祖宗"就是init.
作爲Android中第一個被啓動的進程,init的pid=0.它通過解析init.rc腳本來構建出系統形態。
init.rc語法
一個完整的init.rc腳本由4種類型組成:
- Action(動作)
- Commands(命令)
- Services(服務)
- Options(選項)
系統關鍵服務的啓動簡析
- init作爲Android系統的第一個進程,它通過解析init.rc來陸續啓動其他關鍵系統進程。 這其中最重要的就是ServiceManager, Zygote, SystemServer.
1.Android的"DNS服務器" ServiceManager
-
ServiceManager是在init.rc裏描述並由init進程啓動。
/*system/core/rootdir/Init.rc*/ service servicemanager /system/bin/servicemanager class core user system group system critical (該選項說明是系統關鍵進程) onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm
servicemanager是一個linux程序。它在設備中的存儲路徑是/system/bin/servicemanager. 源碼路徑是/frameworks/native/cmds/servicemanager.
ServiceManager所屬class是core. core組的特性是,這些進程會同時被啓動或停止。critical (該選項說明是系統關鍵進程)意味着如果進程在4分鐘內異常退出超過4次,則設備將重啓進入還原模式。當ServiceManager重啓時,其他關鍵進程如zygote,media,surfaceflinger等也會被restart.
2."孕育"新的線程和進程 Zygote
- zygote 字面意思是"受精卵",可以”孕育“一個”新生命“.Android中的大多數應用進程和系統進程都是通過zygote來生成的。
zygote也是由init在解析rc腳本時啓動的。
ServiceName:zygote
Path: /system/bin/app_process
Arguments: -Xzygote /system/bin --zygote --start-system-server
所在的程序名叫"app_process".源碼路徑在/frameworks/base/cmds/app_process 看看它的Android.mk
LOCAL_SRC_FILES:= \
app_main.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
liblog \
libbinder \
libandroid_runtime
LOCAL_MODULE:= app_process
得知app_process具體實現是app_main.cpp. 其內容主要是:
if (zygote){
//啓動虛擬機,並執行ZygoteInit
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer? "start-system-server" : "");
}
runtime是一個變量,它實際上是一個AndroidRuntime對象。其start函數源碼如下
/*frameworks/base/core/jni/AndroidRuntime.cpp*/
void AndroidRuntime::start(const char* className, const char* options)
......
JNIEnv* env;
if (startVm(&mJavaVm, &env) != 0 ){//啓動虛擬機
return;
}
onVmCreated(env); //虛擬機啓動後的回調
- zygote的作用:
- 其具體執行是通過zygoteInit來處理的。ZygoteInit是運行在java虛擬機之上的。
- 開闢一個進程處理啓動systemserver,來處理系統進程(創建系統進程)
- 完成上面操作之後,會進入無線循環來處理客戶端相應。如果接受到新的應用,則開闢新的應用進程來處理。 (創建應用進程)
3.Android的"系統服務"-- SystemServer
SystemServer是Android進入Launcher前的最後準備,它提供了衆多由java語言編寫的"系統服務"。
- ZygoteInit通過Zygote.forkSystemServer來生成一個新進程,用於承載各個系統服務
- native本地層Service(比如SurfaceFlinger, AudioFlinger等)的啓動。
- java層,各個service的啓動
-
創建新的線程來啓動
class ServerThread extends Thread { public void run(){ Looper.prepareMainLooper(); //啓動各個系統服務,如:PowerManagerService、ActivityManagerService等 Looper.loop(); } }
-
後續會分析具體的系統服務。ActivityManagerService是導致Launcher被啓動的關鍵,後面會在分析的。