Ò»¡¢²âÊÔ´úÂ룺
¡«/Android/external/binder/server ----FregServer.cpp ~/Android/external/binder/common ----IFregService.cpp ----IFregService.h ~/Android/external/binder/client ----FregClient.cpp |
Binder¿â(libbinder)´úÂ룺
~/Android/frameworks/base/libs/binder ----BpBinder.cpp ----Parcel.cpp ----ProcessState.cpp ----Binder.cpp ----IInterface.cpp ----IPCThreadState.cpp ----IServiceManager.cpp ----Static.cpp ~/Android/frameworks/base/include/binder ----Binder.h ----BpBinder.h ----IInterface.h ----IPCThreadState.h ----IServiceManager.h ----IBinder.h ----Parcel.h ----ProcessState.h |
Çý¶¯²ã´úÂ룺
¡«/Android//kernel/goldfish/drivers/staging/android ----binder.c ----binder.h |
¶þ¡¢Ô´Âë·ÖÎö
¼ÌÐøÉÏһƪAndroid Binder½ø³Ì¼äͨÐÅ---FregServer½ø³Ì£¬´¦ÀíBC_REPLY£¬·µ»ØBR_REPLYhttp://blog.csdn.net/jltxgcy/article/details/26339313£¬Ö´ÐÐÍêwaitForResponseº¯Êý£¬²Î¿¼Android
Binder½ø³Ì¼äͨÐÅ---FregServer½ø³Ì£¬·¢ËÍBC_TRANSACTION£¬Ë¯Ãߵȴýhttp://blog.csdn.net/jltxgcy/article/details/26076149¡£Ó¦¸Ã·µ»ØIPCThreadStateÀàµÄtransact·½·¨£¬ÔÙ·µ»ØBpBinderÀàµÄtransactº¯Êý£¬×îºó·µ»ØBpServiceManagerÀàaddServiceº¯Êý¡£×îºóÔÙ·µ»ØFregServiceÀàµÄmainº¯Êý£¬ÊµÏÖÈçÏ£º
¡«/Android/external/binder/server
----FregServer.cpp
int main(int argc, char** argv) { FregService::instantiate(); ProcessState::self()->startThreadPool();//Æô¶¯Ò»¸öBinderÏß³Ì³Ø IPCThreadState::self()->joinThreadPool();//Ö÷Ï̼߳ÓÈëÏß³Ì³Ø return 0; } |
Ê×Ïȵ±Ç°½ø³ÌµÄProcessState¶ÔÏóµÄ³ÉÔ±º¯ÊýstartThreadPoolÀ´Æô¶¯Ò»¸öBinderÏ̳߳أ¬½Ó׿ÌÐøµ÷Óõ±Ç°Ï̵߳ÄIPCThreadState¶ÔÏóµÄ³ÉÔ±º¯ÊýjoinThreadPool£¬½«µ±Ç°Ï̼߳ÓÈëµ½Ç°ÃæËùÆô¶¯µÄBinderÏ̳߳ØÖÐÈ¥µÈ´ýºÍ´¦ÀíÀ´×ÔClient½ø³ÌµÄ½ø³Ì¼äͨÐÅÇëÇó¡£
ÏÂÃæÎÒÃǾͷÖÎöProcessStateÀàµÄ³ÉÔ±º¯ÊýstartThreadPoolµÄʵÏÖ£¬ÔÚ·ÖÎö¹ý³ÌÖУ¬Í¬Ê±Ò²»á·ÖÎöIPCThreadStateÀàµÄ³ÉÔ±º¯ÊýjoinThreadPoolµÄʵÏÖ¡£
ProcessStateÀàµÄ³ÉÔ±º¯ÊýstartThreadPoolµÄʵÏÖÈçÏ£º
~/Android/frameworks/base/libs/binder
----ProcessState.cpp
void ProcessState::startThreadPool() { AutoMutex _l(mLock); if (!mThreadPoolStarted) {//ĬÈÏֵΪfalse mThreadPoolStarted = true;//·ÀÖ¹ËüµÄ³ÉÔ±º¯ÊýspawnPooledThread±»Öظ´µ÷ÓÃÀ´Æô¶¯BinderÏß³Ì³Ø spawnPooledThread(true); } } |
µ±Ç°½ø³ÌµÄProcessState¶ÔÏóµÄ³ÉÔ±±äÁ¿mThreadPoolStarted±»³õʼ»¯Îªfalse£¬µ±Ëü½«Ò»¸öBinderÏß³Ì³ØÆô¶¯ÆðÀ´Ö®ºó£¬¾Í»á½«ÄÚ²¿µÄ³ÉÔ±±äÁ¿mThreadPoolStartedµÄÖµÉèÖÃΪtrue£¬·ÀÖ¹ËüµÄ³ÉÔ±º¯ÊýspawnPooledThread±»Öظ´µ÷ÓÃÀ´Æô¶¯BinderÏ̳߳ء£spawnPooledThreadº¯ÊýʵÏÖÈçÏ£º
~/Android/frameworks/base/libs/binder
----ProcessState.cpp
void ProcessState::spawnPooledThread(bool isMain) { if (mThreadPoolStarted) { int32_t s = android_atomic_add(1, &mThreadPoolSeq); char buf[32]; sprintf(buf, "Binder Thread #%d", s); LOGV("Spawning new pooled thread, name=%s\n", buf); sp<Thread> t = new PoolThread(isMain);//isMainΪtrue t->run(buf);//Æô¶¯Ò»¸öеÄÏß³Ì } } |
´´½¨ÁËÒ»¸öPoolThread¶ÔÏót£¬µ÷ÓÃËüµÄ³ÉÔ±º¯ÊýrunÀ´Æô¶¯Ò»¸öеÄÏ̡߳£
PoolThreadÀà¼Ì³ÐÁËÏß³ÌÀàThread£¬²¢ÇÒÖØÐ´ÁËËüµÄÏß³ÌÈë¿Ú³ÉÔ±º¯ÊýthreadLoop£¬Òò´Ëµ±Ò»¸öPoolThread¶ÔÏótËù¶ÔÓ¦µÄÏß³ÌÆô¶¯ÆðÀ´Ö®ºó£¬ËüµÄ³ÉÔ±º¯ÊýthreadLoop¾Í»á±»µ÷Óá£ÊµÏÖÈçÏ£º
~/Android/frameworks/base/libs/binder
----ProcessState.cpp
class PoolThread : public Thread { public: PoolThread(bool isMain) : mIsMain(isMain)//isMainΪtrue { } protected: virtual bool threadLoop() { IPCThreadState::self()->joinThreadPool(mIsMain);//isMainΪtrue return false; } const bool mIsMain; }; |
ºÍÖ÷Ïß³ÌÒ»Ñùµ÷ÓÃÁËIPCThreadStateÀàµÄ³ÉÔ±º¯ÊýjoinThreadPool¡£ÊµÏÖÈçÏ£º
~/Android/frameworks/base/libs/binder
----IPCThreadState.cpp
void IPCThreadState::joinThreadPool(bool isMain)//ĬÈÏֵΪtrue { ......... mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);//isMainΪtrue£¬BC_ENTER_LOOPER ........ status_t result; do { int32_t cmd; ....... result = talkWithDriver();//½«×Ô¼º×¢²áµ½BinderÏ̳߳ØÖУ¬Ò»¸öÎÞÏßÑ»·Öв»¶ÏµÈ´ý½ø³Ì¼äͨÐÅÇëÇó if (result >= NO_ERROR) { size_t IN = mIn.dataAvail(); if (IN < sizeof(int32_t)) continue; cmd = mIn.readInt32(); ........ result = executeCommand(cmd);//´¦Àí½ø³Ì¼äͨÐÅÇëÇó } ......... if(result == TIMED_OUT && !isMain) {//һֱΪfalse£¬ÒòΪisMainΪtrue break; } } while (result != -ECONNREFUSED && result != -EBADF); ........ mOut.writeInt32(BC_EXIT_LOOPER);//Í˳öBinderÏß³Ì³Ø talkWithDriver(false); } |
²ÎÊýisMainÊÇÒ»¸öĬÈϲÎÊý£¬ËüµÄĬÈÏֵΪtrue¡£´ÓÇ°ÃæµÄµ÷Óùý³Ì¿ÉÒÔÖªµÀ£¬ÎÞÂÛÊÇFregServer½ø³ÌµÄÖ÷Ị̈߳¬»¹ÊÇFregServer½ø³Ì¸Õ²ÅËù´´½¨µÄỊ̈߳¬ËüÃǶ¼ÊÇÖ÷¶¯(isMainΪtrue)ÇëÇó¼ÓÈëµ½BinderÏ̳߳ص쬼´ËüÃǶ¼²»ÊÇÓÉÓÚBinderÇý¶¯³ÌÐòÇëÇó´´½¨¶ø¼ÓÈëµ½BinderÏ̳߳صġ£
Ò»¸öBinderÏ̵߳ÄÉúÃüÖÜÆÚ¿ÉÒÔ»®·ÖΪÈý¸ö½×¶Î£º
µÚÒ»½×¶ÎÊǽ«×Ô¼º×¢²áµ½BinderÏ̳߳ØÖУ»
µÚ¶þ½×¶ÎÊÇÒ»¸öÎÞÏßÑ»·Öв»¶ÏµÈ´ýºÍ´¦Àí½ø³Ì¼äͨÐÅÇëÇó£»
µÚÈý½×¶ÎÊÇÍ˳öBinderÏ̳߳ء£
×îºóÖ´ÐÐÍêµÄ½á¹ûÊÇFregServerÓÐÁ½¸öỊ̈߳¬Ë¯Ãߵȴý½ø³Ì¼äͨÐÅÊý¾ÝµÄµ½À´¡£
|