一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

分析IBinder體系中g(shù)etService的流程

 mandrave 2011-12-09
IBinder體系中得到一個(gè)服務(wù)的過(guò)程分析:
ServiceManager是管理所有服務(wù)(如音頻,相機(jī))的一個(gè)進(jìn)程,它的handle是0
一、總的來(lái)說(shuō):得到一個(gè)service很簡(jiǎn)單,分成兩步,
1,得到一個(gè)默認(rèn)的serviceManager;
2,然后使用serviceManger->getService(service名稱)得到具體的service

二、詳細(xì)分析
參照網(wǎng)上一些資料(感謝石頭),我們也以得到AudioFlinger服務(wù)為例,詳細(xì)的講述整個(gè)過(guò)程。
1,AudioSystem.cpp中有個(gè)函數(shù)const sp<IAudioFlinger>& AudioSystem:: get_audio_flinger(),顧名思義,該函數(shù)的功能是得到AudioFlinger服務(wù)
2,查看該函數(shù)的實(shí)現(xiàn),首先我們看到了一個(gè)函數(shù)調(diào)用:
sp<IServiceManager> sm = defaultServiceManager();
該函數(shù)就是我們所說(shuō)的第一步---得到一個(gè)默認(rèn)的serviceManager;
defaultServiceManager()的實(shí)現(xiàn)如下:
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL)
return gDefaultServiceManager;

{
AutoMutex _l(gDefaultServiceManagerLock);
if (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}
}

return gDefaultServiceManager;
}

重點(diǎn)分析gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
A.ProcessState::self()得到一個(gè)ProcessState的實(shí)例,在它的構(gòu)造函數(shù)中通過(guò)mmap將/dev/binder文件映射到了一段內(nèi)存,并將這段內(nèi)存的地址保存下來(lái),這段內(nèi)存就是IBinder中進(jìn)行數(shù)據(jù)客戶端和服務(wù)端讀寫(xiě)數(shù)據(jù)的地方
B.ProcessState::self()->getContextObject(NULL)); 通過(guò)getStrongProxyForHandle返回一個(gè)BpBinder對(duì)象
C.根據(jù)上面描述,該語(yǔ)句實(shí)際上就是interface_cast<IServiceManager>(BpBinder)
D.在此,我們有必要關(guān)注一下interface_cast,通過(guò)代碼跟蹤:看到它的實(shí)現(xiàn)
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
通過(guò)模板替換就是:
inline sp< IServiceManager > interface_cast(const sp<IBinder>& obj)
{
return IServiceManager::asInterface(obj);
}
看來(lái)在asInterface是IServiceManager的一個(gè)成員函數(shù),我們打開(kāi)IServiceManager.cpp/h文件,我們并沒(méi)有發(fā)現(xiàn)該函數(shù),那它到底在哪兒呢,仔細(xì)觀察IServiceManager.cpp,發(fā)現(xiàn)里面有個(gè)
IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
在IServiceManager.h里面發(fā)現(xiàn)了
DECLARE_META_INTERFACE(ServiceManager);
通過(guò)跟蹤這兩個(gè)宏發(fā)現(xiàn)DECLARE_META_INTERFACE聲明了一個(gè)變量和兩個(gè)函數(shù),代碼如下:
#define DECLARE_META_INTERFACE(INTERFACE)                  \
static const String16 descriptor;                                   \
static sp<I##INTERFACE> asInterface(const sp<IBinder>& obj);        \
virtual String16 getInterfaceDescriptor() const;                    \

IMPLEMENT_META_INTERFACE這個(gè)宏是對(duì)上面聲明的實(shí)現(xiàn)
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)         \
const String16 I##INTERFACE::descriptor(NAME);                  \
String16 I##INTERFACE::getInterfaceDescriptor() const {             \
return I##INTERFACE::descriptor;                          \
}                                                       \
sp<I##INTERFACE> I##INTERFACE::asInterface(const sp<IBinder>& obj)  \
{                                                    \
sp<I##INTERFACE> intr;                                \
if (obj != NULL) {                                       \
intr = static_cast<I##INTERFACE*>(                     \
obj->queryLocalInterface(                         \
I##INTERFACE::descriptor).get());         \
if (intr == NULL) {                                    \
intr = new Bp##INTERFACE(obj);                \
}                                                \
}                                             \
return intr;                                      \
}                                                   \
interface_cast<IServiceManager>實(shí)際上返回了一個(gè)BpServiceManager,在創(chuàng)建一個(gè)BpServiceManager時(shí),有些細(xì)節(jié)還是需要注意:
BpServiceManager(const sp<IBinder>& impl): BpInterface<IServiceManager>(impl){}
BpInterface<IServiceManager>(impl)中的impl實(shí)際就是一個(gè)BpBinder,它調(diào)用了BpInterface的構(gòu)造函數(shù),然后調(diào)用了BpRefBase(remote),從而把一個(gè)BpBinder賦值給了mRemote,這個(gè)變量會(huì)在后面?zhèn)鬏數(shù)臅r(shí)候用到

3,AudioSystem.cpp文件中緊接著就執(zhí)行了 binder = sm->getService(String16("media.audio_flinger")); //參數(shù)是服務(wù)名稱
我們知道了sm就是一個(gè)BpServiceManager,可以在BpServiceManager類中看到getService的實(shí)現(xiàn),它調(diào)用了checkService,checkService先將數(shù)據(jù)打包成Parcel格式,然后調(diào)用remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);進(jìn)行傳輸,remote()是BpServiceManager父類BpRefBase的一個(gè)成員函數(shù),作用是返回mRemote(在上面講過(guò)它就是一個(gè)BpBinder),那么我們就去BpBinder.cpp中去尋找transact的實(shí)現(xiàn),代碼如下:
status_t BpBinder::transact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
// Once a binder has died, it will never come back to life.
if (mAlive) {
status_t status = IPCThreadState::self()->transact(
mHandle, code, data, reply, flags);
if (status == DEAD_OBJECT) mAlive = 0;
return status;
}

return DEAD_OBJECT;
}
IPCThreadState是專門(mén)負(fù)責(zé)進(jìn)程間通訊的,包括進(jìn)程間的數(shù)據(jù)傳輸,查看IPCThreadState::self()->transact(mHandle, code, data, reply, flags)的實(shí)現(xiàn),提取兩行和我們相關(guān)的代碼
………………..
Err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);
……………………….
err = waitForResponse(reply);
writeTransactionData的作用是把數(shù)據(jù)寫(xiě)到類型為Parcel的mOut容器中去,方便ServiceManager讀取
waitForResponse等待ServiceManager找到具體的服務(wù),并把結(jié)果傳回來(lái)
查看status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)的實(shí)現(xiàn),里面調(diào)用了函數(shù)talkWithDriver(),該函數(shù)通過(guò)ioctl將mOut中的數(shù)據(jù)寫(xiě)到Binder driver中去,同時(shí)等待將返回的數(shù)據(jù)寫(xiě)入mIn。此時(shí),數(shù)據(jù)的發(fā)送就算完成。
再來(lái)看看ServiceManager是怎么讀取該數(shù)據(jù)的,在Service_manager.c中,調(diào)用了binder_loop(bs, svcmgr_handler),binder_loop其實(shí)就是一直在等待數(shù)據(jù)的到來(lái),到來(lái)就就從驅(qū)動(dòng)中讀取數(shù)據(jù),然后調(diào)用binder_parser解析,在binder_parser中
case BR_TRANSACTION:
…………………..
res = func(bs, txn, &msg, &reply);//這里的func就是svcmgr_handler
binder_send_reply(bs, &reply, txn->data, res); //將結(jié)果返回到Binder driver中
svcmgr_handler在getService的情況下,就是從服務(wù)鏈表中根據(jù)名稱找到對(duì)應(yīng)的服務(wù)的節(jié)點(diǎn),然后轉(zhuǎn)化成binder_object的格式后返回回去
waitForResponse中將返回結(jié)果寫(xiě)到reply中,然后從reply中就結(jié)果返回給調(diào)用者

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲中文字幕在线综合视频| 欧美成人久久久免费播放| 国产精品国三级国产专不卡| 99国产精品国产精品九九| 亚洲熟女国产熟女二区三区| 欧美精品亚洲精品一区| 日韩在线免费看中文字幕| 国产黑人一区二区三区| 日韩精品一级一区二区| 欧美特色特黄一级大黄片| 成年人免费看国产视频| 欧美午夜色视频国产精品| 青青操日老女人的穴穴| 国产成人午夜在线视频| 国产又粗又猛又黄又爽视频免费| 黄色国产一区二区三区| 午夜久久精品福利视频| 日韩亚洲精品国产第二页| 男女一进一出午夜视频| 高潮日韩福利在线观看| 超薄肉色丝袜脚一区二区| 精品老司机视频在线观看| 91天堂免费在线观看 | 日韩一级免费中文字幕视频| 成人免费观看视频免费| 午夜精品一区免费视频| 欧美成人免费视频午夜色| 国产高清三级视频在线观看| 欧美国产日韩在线综合| 很黄很污在线免费观看| 国产女性精品一区二区三区| 亚洲中文字幕在线乱码av| 日本午夜免费啪视频在线| 黄片在线免费看日韩欧美| 欧美激情视频一区二区三区| 九九热在线视频观看最新| 欧美又大又黄刺激视频| 日韩精品成区中文字幕| 国产精品一区二区日韩新区| 成人午夜激情免费在线| 色婷婷亚洲精品综合网|