2.1 Android啓動與CameraService進程加載

從這一章節開始,筆者將對Camera的Framework框架進行分析。

對於Camera Framework框架而言,其核心就是CameraService,所以本節將首先探究Camera service是什麼,Camera Service是怎麼來的。

Android框架啓動過程

Android在開機時,首先裝載BootLoader引導程序,進行硬件上電,從初始代碼處開始執行初始化,再進行第二階段的代碼加載和初始化。然後就進入到Kernel加載和初始化階段,進行初始化驅動、安裝根文件系統等操作,之後會啓動第一個用戶進程init進程。

Init進程是所有用戶進程的父進程,會進行守護進程的創建,同時會創建關鍵進程。init進程啓動後會加載init.rc腳本,CameraServer進程就是在這時啓動的。

於此同時啓動的進程還包括MediaServer、ServiceManager、mediaserver(多媒體服務進程)、surfaceflinger(屏幕渲染相關的進程)等。

其中ServiceManager是一個守護進程,在應用層通過context.getSystemService()方法獲取的各種服務Manager都是在這裏進行管理。它維護着系統服務和客戶端的binder通信。

CameraService進程

我們已經知道init進程在加載init.rc之後會去加載其他rc文件從而啓動其他進程,CameraServer進程的rc文件在/frameworks/av/camera/cameraserver/cameraserver.rc路徑下,由同級目錄的Android.mk文件打包到/system/etc/init/目錄下,這個目錄就是被init進程啓動腳本的目錄之一。

CameraServer進程啓動之後,就會進行CameraService的初始化。在文件/frameworks/av/camera/cameraserver/main_cameraserver.cpp中,執行了CameraService::instantiate();方法。這個方法不在CameraService中,而是它的父類BinderService的方法。

在這個方法中,調用了addServerice()方法,傳入的參數是service name也就是”media.camera”,以及通過new創建的一個CameraService對象。這個方法定義在/frameworks/native/libs/binder/IServiceManager.cpp中,功能就是創建一個Service。

該方法傳入的第二個參數是一個sp類型的變量,sp是Android定義的一種指針格式,會調用包裝對象的onFirstRef()方法。這裏就是CameraService。

在onFirstRef方法中,直觀地進行了四步操作,創建CameraModule、獲取Camera的一些信息、設置callback、鏈接CameraServiceProxy服務。如果繼續追蹤到HAL層,會看到CameraModule進行了動態鏈接庫的加載等操作,這部分內容不在此展開。

通過addService()方法中的transact()就可以進行service的註冊,同時生成一個句柄,這個句柄就是“camera”,也就是應用層獲取Manager時的Context.CAMERA_SERVICE

至此,CameraService的整個啓動流程就已經走完了,我們也已經回答了CameraService是怎麼來的這個問題。

下一章節開始,我們將對camera流程中的各個環節進行梳理,從而探究CameraService是什麼的問題。

 

附一

https://img-blog.csdn.net/20171116134654167?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTMzMjMyNDk1Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

1  Android啓動過程框架

原文:https://blog.csdn.net/a332324956/article/details/77456632

附二

2 Binder示意圖

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