1.Main_mediaserver.cpp 中的main函數(shù)內(nèi): int main(int argc, char** argv) { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); LOGI("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); AudioPolicyService::instantiate(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } 其實SERVCIE 與BINDER無實際關(guān)系,只是建立進程間交互所需罷了。 sp<ProcessState> proc(ProcessState::self());是打開一個binder驅(qū)動,換句話說就是為MEDIASERVER提供一個用于與底層交互的接口。解決進程間通訊的問題。這里是不是就是為該服務(wù)準(zhǔn)備好了一個進程? 2.defaultServiceManager的實現(xiàn)過程,就是通過0號句柄查找SERVCIE 維護的數(shù)組,找到自己的引用, 原來,Android系統(tǒng)中Service信息都是先add到ServiceManager中,由ServiceManager來集中管理,這樣就可以查詢當(dāng)前系統(tǒng)有哪些服務(wù)。而且,Android系統(tǒng)中某個服務(wù)例如MediaPlayerService的客戶端想要和MediaPlayerService通訊的話,必須先向ServiceManager查詢MediaPlayerService的信息,然后通過ServiceManager返回的東西再來和MediaPlayerService交互,即BPSERVICEMANAGER.在客戶端找到一個可操作服務(wù)端相應(yīng)接口神器。而此過程中建立的BPBINDER只是用于所建SERVICE 與SERVICEMANAGER進程通訊的橋梁。 工作記錄: 這種sigsegv問題用addr2line看問題出在哪段代碼,一般不用管寄存器 |
|