Android 啟動過程簡介

來源:互聯網
上載者:User
文章目錄
  • 概述
  • 詳解

        從某個方面來講,我們可以將安卓看成是LINUX之上的一種XWINDOW。所以系統啟動的過程難免要先從linux kernel開始講起。當然linux kernel的啟動不是我們這裡需要討論的問題。

       本人最近試圖在framework層添加一個自己的service,之前研究了一下但還不是特別清楚。故以此理清思路。也希望能夠給同樣在研究這部分的朋友好的提示。由於Android系統非常的龐大。所以要清晰的明白這些東西,一定要好好的研究它的實現機制。

概述

        Android系統在啟動時首先會啟動Linux基礎系統,然後引導載入Linux Kernel並啟動初始化進程(Init)。接著啟動Linux守護進程。在啟動Linux守護進程的同時還需要啟動Zygote進程。包括初始化一個Dalvik虛擬機器執行個體。裝載Socket請求所需的類和監聽。建立虛擬機器執行個體來管理應用程式的進程。

      在Zygote之後需要初始化runtime進程。在這個過程中主要進行服務管理員的初始化和註冊。

詳解       第一步:initial進程(System\core\init)       init進程,它是一個由核心啟動的使用者級進程。核心自行啟動之後,就通過啟動一個使用者級程式init的方式完成引導進程。在第一個進程中會讀取init.rc。在這個檔案中會啟動servicemanager,zygote……等基本的服務。       在init.c@system/core/init。會調用parse_config_file(init.rc)解析指令檔init.rc。(init.rc是Android init language。具體的描述在./readme.txt)此處具體如何讓解析的還需要進行研究。

      Android在開機啟動後,經過一系列的載入流程,將進入frameworks\base\cmds\app_process\app_main.cpp進而執行main()方法。

    188    if (zygote) {
    189         runtime.start("com.android.internal.os.ZygoteInit",
    190                 startSystemServer ? "start-system-server" : "");
    191     } else if (className) {
    192         // Remainder of args get passed to startup class main()
    193         runtime.mClassName = className;
    194         runtime.mArgC = argc - i;
    195         runtime.mArgV = argv + i;
    196         runtime.start("com.android.internal.os.RuntimeInit",
    197                 application ? "application" : "tool");
    198     } else {
    199         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
    200         app_usage();
    201         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    202         return 10;
    203     }

        (在frameworks\base\core\jni檔案夾下存在com_android_internel_os_ZygoteInit.cpp檔案。在此檔案中通過register_com_android_internel_os_ZygoteInit函數調用AndroidRuntime::registerNativeMethods函數。)

最終會調用到frameworks/base/core/jni/AndroidRuntime.cpp的start()方法。事實上,Android API與本地方法的註冊關聯就是在AndroidRuntime.cpp模組裡完成的。

Android  framework層的API函數對應的本地方法映射和註冊原理簡析:

        Android啟動之後,本地方法的註冊關聯是在調用AndroidRuntime::startReg過程中完成的。在AndroidRuntime的靜態數組gRegJNI[]儲存了各個framework子模組本地方法關聯資訊。數組gRegJNI[]的每一個元素儲存了各個模組的註冊相關的函數指標,這個函數指標的功能是把子模組中眾多的本地函數關聯添加進系統中。子模組中的眾多本地函數也是通過子模組的靜態數組被上述函數指標指向的函數作為參數來使用。註冊的關聯具體是通過在startReg中調用register_jni_process方法把靜態數組gRegJNI[]數組儲存的各個framework子模組本地方法關聯資訊註冊到系統中。

        具體的註冊JNI的步驟簡介:(待續)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.