Android系統啟動流程

來源:互聯網
上載者:User

標籤:解析   映射   har   sig   next   執行   ready   time   library   

  • 當系統引導程式啟動Linux核心,核心會記載各種資料結構,和驅動程式,載入完畢之後,Android系統開始啟動並載入第一個使用者層級的進程:init(system/core/init/Init.c)

  • 查看Init.c代碼,看main函數

    int main(int argc, char **argv){     ...    //執行Linux指令    mkdir("/dev", 0755);    mkdir("/proc", 0755);    mkdir("/sys", 0755);    ...    //解析執行init.rc設定檔    init_parse_config_file("/init.rc");    ...}
  • 在init.rc中定義好的指令都會開始執行,其中執行了很多bin指令,啟動系統服務

    //啟動孵化器進程,此進程是Android系統啟動關鍵服務的一個母進程service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-serversocket zygote stream 666onrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart mediaonrestart restart netd
  • 在appprocess檔案夾下找到appmain.cpp,查看main函數,發現以下代碼

    int main(int argc, const char* const argv[]){    ...    //啟動一個系統服務:ZygoteInit    runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);    ...}
  • 在ZygoteInit.java中,查看main方法

     public static void main(String argv[]) {    ...    //載入Android系統需要的類    preloadClasses();    ...    if (argv[1].equals("true")) {        //調用方法啟動一個系統服務        startSystemServer();    }    ...}
  • startSystemServer()方法的方法體

    String args[] = {    "--setuid=1000",    "--setgid=1000",    "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003",    "--capabilities=130104352,130104352",    "--runtime-init",    "--nice-name=system_server",    "com.android.server.SystemServer",};...//分叉啟動上面字串數組定義的服務 pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities);
  • SystemServer服務被啟動

    public static void main(String[] args) {    ...    //載入動態連結程式庫     System.loadLibrary("android_servers");    //執行連結庫裡的init1方法    init1(args);    ...}
  • 動態連結程式庫檔案和java類包名相同,找到comandroidserver_SystemServer.cpp檔案

  • 在comandroidserver_SystemServer.cpp檔案中,找到了

    static JNINativeMethod gMethods[] = {    /* name, signature, funcPtr */    //給init1方法映射一個指標,調用system_init方法    { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },};
  • androidserverSystemServer_init1方法體中調用了systeminit,systeminit沒有方法體

  • 在systeminit.cpp檔案中找到systeminit方法,方法體中 //執行了SystemServer.java的init2方法 runtime->callStatic("com/android/server/SystemServer", "init2");

  • 回到SystemServer.java,在init2的方法體中

    //啟動一個服務線程Thread thr = new ServerThread();thr.start();
  • 在ServerThread的run方法中

    //準備訊息輪詢者Looper.prepare();...//啟動大量的系統服務並把其逐一添加至ServiceManagerServiceManager.addService(Context.WINDOW_SERVICE, wm);...//調用systemReady,準備建立第一個activity ((ActivityManagerService)ActivityManagerNative.getDefault())        .systemReady(new Runnable(){        ...});
  • 在ActivityManagerService.java中,有systemReady方法,方法體裡找到

    //檢測任務棧中有沒有activity,如果沒有,建立LaunchermMainStack.resumeTopActivityLocked(null);
  • 在ActivityStack.java中,方法resumeTopActivityLocked

    // Find the first activity that is not finishing.ActivityRecord next = topRunningActivityLocked(null);...if (next == null) {    // There are no more activities!  Let‘s just start up the    // Launcher...    if (mMainStack) {        return mService.startHomeActivityLocked();    }}...

 

Android系統啟動流程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.