Camera源碼解讀-1 CameraService啟動

Android系統(tǒng)啟動過程

Android系統(tǒng)啟動包括兩大步驟:1、Linux內(nèi)核啟動,2、Android架構(gòu)啟動。

  1. Linux內(nèi)核啟動:主要是bootLoader的啟動和初始化驅(qū)動,安裝文件系統(tǒng)等,與我們的CameraService啟動關(guān)系不大,不做深入探討,唯一需要注意的是,在Linux內(nèi)核啟動的最后,會啟動第一個用戶進(jìn)程init進(jìn)程,他是所有的用戶進(jìn)程的父進(jìn)程,由此進(jìn)入了Android架構(gòu)的啟動階段
  2. Android架構(gòu)啟動:init進(jìn)程啟動后會自動加載init.rc(/system/core/rootdir/init.rc)腳本,當(dāng)他執(zhí)行mount_all指令掛載分區(qū)時,會加載包括system、vendor、odm等目錄下的xxx/etc/init目錄下的所有rc腳本。

CameraService的啟動

通過看Framework層Camera的代碼,我們發(fā)現(xiàn)在framework/av/camera/目錄下有一個cameraserver文件夾,里邊有一個cameraserver.rc文件。

// cameraserver.rc
//通過init進(jìn)程啟動cameraserver進(jìn)程,啟動路徑為/system/bin/cameraserver 
service cameraserver /system/bin/cameraserver
    class main
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks

通過Android系統(tǒng)啟動過程一節(jié)我們了解到init進(jìn)程會啟動后會自動執(zhí)行*xxx/etc/init目錄下的所有rc腳本,源碼中我們又看到了一個cameraserver.rc的文件,那么init.rc又是如何調(diào)用到cameraserver.rc的呢?
繼續(xù)來看Android.mk打包文件

// Android.mk
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

//源文件,具體執(zhí)行命令的文件
LOCAL_SRC_FILES:= \
    main_cameraserver.cpp

LOCAL_SHARED_LIBRARIES := \
    libcameraservice \
    libcutils \
    libutils \
    libbinder \
    libcamera_client

//模塊名稱 cameraserver
LOCAL_MODULE:= cameraserver
LOCAL_32_BIT_ONLY := true

LOCAL_CFLAGS += -Wall -Wextra -Werror -Wno-unused-parameter

LOCAL_INIT_RC := cameraserver.rc

include $(BUILD_EXECUTABLE)

其中的LOCAL_INIT_RC := cameraserver.rccameraserver.rc掛載到system/etc/init目錄中,這樣init.rc就可以調(diào)用cameraserver.rc。
Android.mk中還指明了具體執(zhí)行的源文件為main_cameraserver.cpp。該文件在源代碼中位于framework/av/camera/cameraserver目錄中,和cameraserver.rc位于同一目錄。
我們來看一下main_cameraserver.cppmain方法,其中的CameraServe::instantiaicte()即為cameraservice的初始化。至此,cameraserver進(jìn)程啟動完畢。

// main_cameraserver.cpp
int main(int argc __unused, char** argv __unused)
{
    signal(SIGPIPE, SIG_IGN);

    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    //初始化CameraService服務(wù)
    CameraServe::instantiaicte();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

總結(jié)一下

  1. Andorid.mk將cameraserver.rc打包到system/etc/init目錄下,并指定源代碼為main_cameraserver.cpp;
  2. Android架構(gòu)啟動時啟動init.rc進(jìn)程,啟動了位于system/etc/init目錄下的cameraserver.rc。值得一提的是,同時也會啟動zygote進(jìn)程(第一個Java層進(jìn)程,也是Java層所有進(jìn)程的父進(jìn)程)、ServiceManager、mediaserver(多媒體服務(wù)進(jìn)程,Android7.0之前cameraserver屬于mediaserver,和mediaserver位于同一進(jìn)程)、surfaceflinger(屏幕渲染相關(guān)的進(jìn)程)等。之后zygote會孵化出啟動system_server進(jìn)程,Android framework里面的所有service(ActivityManagerService、WindowManagerService等)都是由system_server啟動。
  3. 啟動cameraserver.rc時,執(zhí)行main_cameraserver.cpp中的main方法,通過CameraServe::instantiaicte()初始化CameraService。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容