從這一章節開始,筆者將對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是什麼的問題。
附一
1 Android啓動過程框架
原文:https://blog.csdn.net/a332324956/article/details/77456632
附二
2 Binder示意圖