Android系統啓動過程分析

第一個系統進程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被啓動的關鍵,後面會在分析的。

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