久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

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

二、詳細(xì)分析
參照網(wǎng)上一些資料(感謝石頭),,我們也以得到AudioFlinger服務(wù)為例,,詳細(xì)的講述整個(gè)過程。
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ù)就是我們所說的第一步---得到一個(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ù)中通過mmap將/dev/binder文件映射到了一段內(nèi)存,,并將這段內(nèi)存的地址保存下來,,這段內(nèi)存就是IBinder中進(jìn)行數(shù)據(jù)客戶端和服務(wù)端讀寫數(shù)據(jù)的地方
B.ProcessState::self()->getContextObject(NULL)); 通過getStrongProxyForHandle返回一個(gè)BpBinder對(duì)象
C.根據(jù)上面描述,該語句實(shí)際上就是interface_cast<IServiceManager>(BpBinder)
D.在此,,我們有必要關(guān)注一下interface_cast,,通過代碼跟蹤:看到它的實(shí)現(xiàn)
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
通過模板替換就是:
inline sp< IServiceManager > interface_cast(const sp<IBinder>& obj)
{
return IServiceManager::asInterface(obj);
}
看來在asInterface是IServiceManager的一個(gè)成員函數(shù),我們打開IServiceManager.cpp/h文件,,我們并沒有發(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);
通過跟蹤這兩個(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(在上面講過它就是一個(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是專門負(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ù)寫到類型為Parcel的mOut容器中去,,方便ServiceManager讀取
waitForResponse等待ServiceManager找到具體的服務(wù),并把結(jié)果傳回來
查看status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)的實(shí)現(xiàn),,里面調(diào)用了函數(shù)talkWithDriver(),,該函數(shù)通過ioctl將mOut中的數(shù)據(jù)寫到Binder driver中去,同時(shí)等待將返回的數(shù)據(jù)寫入mIn,。此時(shí),,數(shù)據(jù)的發(fā)送就算完成。
再來看看ServiceManager是怎么讀取該數(shù)據(jù)的,,在Service_manager.c中,,調(diào)用了binder_loop(bs, svcmgr_handler),binder_loop其實(shí)就是一直在等待數(shù)據(jù)的到來,,到來就就從驅(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é)果寫到reply中,然后從reply中就結(jié)果返回給調(diào)用者

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(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)論公約

    類似文章 更多