2025-02-10

  從某個方面來講,我們可以將安卓看成是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的步驟簡介:(待續)

摘自 曹太強的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *