《深入理解Android 5源代碼》一書的內(nèi)容實(shí)在太渣,轉(zhuǎn)戰(zhàn)博客系列:老羅的Android之旅
JNINativeMethod結(jié)構(gòu)體,name, signature, fnPtr三個(gè)成員frameworks/base/core/jni/AndroidRuntime.cpp中完成AndroidRuntime::registerNativeMethods函數(shù)調(diào)用了JNIHelp.cpp中的
jniRegisterNativeMethods方法,=> C_JNIEnv::RegisterNativesSystem.loadLibrary加載so庫JNI_OnLoad函數(shù),如果存在,則執(zhí)行之hw_module_t, hw_module_methods_t, hw_device_thw_module_methods_t為所有硬件操作定義了統(tǒng)一的API/dev/binder設(shè)備,并進(jìn)行內(nèi)存映射,方便后續(xù)操作:sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm = defaultServiceManager();proc和sm變量都沒有使用,重要的工作是對兩個(gè)函數(shù)的調(diào)用,而之所以要定義未使用的變量,是為了利用對象的析構(gòu)機(jī)制自動釋放資源,如果未定義變量,那返回的對象會立即析構(gòu),而如果定義了變量,則會在離開作用域時(shí)析構(gòu);MediaPlayerService::instantiate();ProcessState::self()->startThreadPool(),IPCThreadState::self()->joinThreadPool();IBinder, BBinder, BpBinder, IInterface, BpInterface, IServiceManager, BpServiceManager, MediaPlayerService, BnMediaPlayerService 它們之間什么關(guān)系?
transact(...)等基礎(chǔ)API;remote();remoteBinder();asBinder(...);BnInterface<IXXX>,這樣聲明的類型就會同時(shí)繼承IXXX和BBinder,BnInterface<IXXX>是IXXX的實(shí)現(xiàn)者,提供API:queryLocalInterface(...);BpInterface<IXXX>,這樣聲明的類型就會同時(shí)繼承IXXX和BpRefBase,BpInterface<IXXX>是IXXX的代理服務(wù)提供者(代理);BnServiceManager : BnInterface<IServiceManager>,是IServiceManager的實(shí)現(xiàn)者;BpServiceManager : BpInterface<IServiceManager>,是IServiceManager的代理;ServiceManager.java,是Java層對ServiceManager的定義,它通過ServiceManagerNative.asInterface(BinderInternal.getContextObject())獲得IServiceManager實(shí)例,而該方法則是通過查詢native層service manager的服務(wù)列表獲取服務(wù)實(shí)例;BnMediaPlayerService: BnInterface<IMediaPlayerService>,是IMediaPlayerService的實(shí)現(xiàn)者;BpMediaPlayerService: BpInterface<IMediaPlayerService>,是IMediaPlayerService的代理;
remote()->transact(...)函數(shù),而remote返回的實(shí)際上就是初始化ServiceManager時(shí)創(chuàng)建的BpBinder;IPCThreadState::self()->transact(...),在其中通過binder設(shè)備發(fā)送命令和數(shù)據(jù),同時(shí)讀取返回的命令和數(shù)據(jù);sp<IServiceManager> defaultServiceManager();這一方法實(shí)現(xiàn)了單例模式,單例保存在gDefaultServiceManager中gDefaultServiceManager = interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));gDefaultServiceManager = new BpServiceManager(new BpBinder(0));step34: ActivityThread.performLaunchActivity => (此處通過反射創(chuàng)建新activity對象,然后通過mInstrumentation調(diào)用新activity的onCreate/onResume等回調(diào))