Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
FregServer½ø³Ì£¬Æô¶¯BinderÏ̳߳Ø
 
×÷Õß jltxgcyµÄ²©¿Í£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-09-10
  2542  次浏览      28
 

Ò»¡¢²âÊÔ´úÂ룺

 ¡«/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ÓÐÁ½¸öỊ̈߳¬Ë¯Ãߵȴý½ø³Ì¼äͨÐÅÊý¾ÝµÄµ½À´¡£

   
2542 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ