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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android BanderÉè¼ÆÓëʵÏÖ - Éè¼ÆÆª
 
×÷Õߣºuniversus
  2465  次浏览      27
2020-12-18 
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁËÃæÏò¶ÔÏóµÄ Binder IPC¡¢Binder ͨÐÅÄ£ÐÍ¡¢Binder ЭÒé¡¢Binder µÄ±íÊö¡¢Binder ÄÚ´æÓ³ÉäºÍ½ÓÊÕ»º´æÇø¹ÜÀíµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

ÕªÒª

BinderÊÇAndroidϵͳ½ø³Ì¼äͨÐÅ£¨IPC£©·½Ê½Ö®Ò»¡£LinuxÒѾ­ÓµÓйܵÀ£¬system V IPC£¬socketµÈIPCÊֶΣ¬È´»¹ÒªÒÐÀµBinderÀ´ÊµÏÖ½ø³Ì¼äͨÐÅ£¬ËµÃ÷Binder¾ßÓÐÎ޿ɱÈÄâµÄÓÅÊÆ¡£ÉîÈëÁ˽âBinder²¢½«Ö®Ó봫ͳIPC×ö¶Ô±ÈÓÐÖúÓÚÎÒÃÇÉîÈëÁì»á½ø³Ì¼äͨÐŵÄʵÏÖºÍÐÔÄÜÓÅ»¯¡£±¾ÎĽ«¶ÔBinderµÄÉè¼ÆÏ¸½Ú×öÒ»¸öÈ«ÃæµÄ²ûÊö£¬Ê×ÏÈͨ¹ý½éÉÜBinderͨÐÅÄ£ÐͺÍBinderͨÐÅЭÒéÁ˽âBinderµÄÉè¼ÆÐèÇó£»È»ºó·Ö±ð²ûÊöBinderÔÚϵͳ²»Í¬²¿·ÖµÄ±íÊö·½Ê½ºÍÆðµÄ×÷Óã»×îºó»¹»á½âÊÍBinderÔÚÊý¾Ý½ÓÊն˵ÄÉè¼Æ¿¼ÂÇ£¬°üÀ¨Ï̳߳عÜÀí£¬ÄÚ´æÓ³ÉäºÍµÈ´ý¶ÓÁйÜÀíµÈ¡£Í¨¹ý±¾ÎĶÔBinderµÄÏêϸ½éÉÜÒÔ¼°ÓëÆäËüIPCͨÐÅ·½Ê½µÄ¶Ô±È£¬¶ÁÕß½«¶ÔBinderµÄÓÅÊÆºÍʹÓÃBinder×÷ΪAndroidÖ÷ÒªIPC·½Ê½µÄÔ­ÒòÓÐÉîÈëÁ˽⡣

1 ÒýÑÔ

»ùÓÚClient-ServerµÄͨÐÅ·½Ê½¹ã·ºÓ¦ÓÃÓÚ´Ó»¥ÁªÍøºÍÊý¾Ý¿â·ÃÎʵ½Ç¶ÈëʽÊÖ³ÖÉ豸ÄÚ²¿Í¨Ðŵȸ÷¸öÁìÓò¡£ÖÇÄÜÊÖ»úÆ½Ì¨ÌØ±ðÊÇAndroidϵͳÖУ¬ÎªÁËÏòÓ¦Óÿª·¢ÕßÌṩ·á¸»¶àÑùµÄ¹¦ÄÜ£¬ÕâÖÖͨÐÅ·½Ê½¸üÊÇÎÞ´¦²»ÔÚ£¬ÖîÈçýÌå²¥·Å£¬ÊÓÒôƵƵ²¶»ñ£¬µ½¸÷ÖÖÈÃÊÖ»ú¸üÖÇÄܵĴ«¸ÐÆ÷£¨¼ÓËÙ¶È£¬·½Î»£¬Î¶ȣ¬¹âÁÁ¶ÈµÈ£©¶¼Óɲ»Í¬µÄServer¸ºÔð¹ÜÀí£¬Ó¦ÓóÌÐòÖ»Ðè×öΪClientÓëÕâЩServer½¨Á¢Á¬½Ó±ã¿ÉÒÔʹÓÃÕâЩ·þÎñ£¬»¨ºÜÉÙµÄʱ¼äºÍ¾«Á¦¾ÍÄÜ¿ª·¢³öÁîÈËѣĿµÄ¹¦ÄÜ¡£Client-Server·½Ê½µÄ¹ã·º²ÉÓöԽø³Ì¼äͨÐÅ£¨IPC£©»úÖÆÊÇÒ»¸öÌôÕ½¡£Ä¿Ç°linuxÖ§³ÖµÄIPC°üÀ¨´«Í³µÄ¹ÜµÀ£¬System V IPC£¬¼´ÏûÏ¢¶ÓÁÐ/¹²ÏíÄÚ´æ/ÐźÅÁ¿£¬ÒÔ¼°socketÖÐÖ»ÓÐsocketÖ§³ÖClient-ServerµÄͨÐÅ·½Ê½¡£µ±È»Ò²¿ÉÒÔÔÚÕâЩµ×²ã»úÖÆÉϼÜÉèÒ»Ì×ЭÒéÀ´ÊµÏÖClient-ServerͨÐÅ£¬µ«ÕâÑùÔö¼ÓÁËϵͳµÄ¸´ÔÓÐÔ£¬ÔÚÊÖ»úÕâÖÖÌõ¼þ¸´ÔÓ£¬×ÊԴϡȱµÄ»·¾³Ï¿ɿ¿ÐÔÒ²ÄÑÒÔ±£Ö¤¡£

ÁíÒ»·½ÃæÊÇ´«ÊäÐÔÄÜ¡£socket×÷Ϊһ¿îͨÓýӿڣ¬Æä´«ÊäЧÂʵͣ¬¿ªÏú´ó£¬Ö÷ÒªÓÃÔÚ¿çÍøÂçµÄ½ø³Ì¼äͨÐźͱ¾»úÉϽø³Ì¼äµÄµÍËÙͨÐÅ¡£ÏûÏ¢¶ÓÁк͹ܵÀ²ÉÓô洢-ת·¢·½Ê½£¬¼´Êý¾ÝÏÈ´Ó·¢ËÍ·½»º´æÇø¿½±´µ½Äں˿ª±ÙµÄ»º´æÇøÖУ¬È»ºóÔÙ´ÓÄں˻º´æÇø¿½±´µ½½ÓÊÕ·½»º´æÇø£¬ÖÁÉÙÓÐÁ½´Î¿½±´¹ý³Ì¡£¹²ÏíÄÚ´æËäÈ»ÎÞÐ追±´£¬µ«¿ØÖƸ´ÔÓ£¬ÄÑÒÔʹÓá£

±í 1 ¸÷ÖÖIPC·½Ê½Êý¾Ý¿½±´´ÎÊý

IPC Êý¾Ý¿½±´´ÎÊý
¹²ÏíÄÚ´æ 0
Binder 1
Socket/¹ÜµÀ/ÏûÏ¢¶ÓÁÐ 2

»¹ÓÐÒ»µãÊdzöÓÚ°²È«ÐÔ¿¼ÂÇ¡£Android×÷Ϊһ¸ö¿ª·Åʽ£¬ÓµÓÐÖڶ࿪·¢Õߵĵį½Ì¨£¬Ó¦ÓóÌÐòµÄÀ´Ô´¹ã·º£¬È·±£ÖÇÄÜÖն˵ݲȫÊǷdz£ÖØÒªµÄ¡£ÖÕ¶ËÓû§²»Ï£Íû´ÓÍøÉÏÏÂÔØµÄ³ÌÐòÔÚ²»ÖªÇéµÄÇé¿öÏÂ͵¿úÒþ˽Êý¾Ý£¬Á¬½ÓÎÞÏßÍøÂ磬³¤ÆÚ²Ù×÷µ×²ãÉ豸µ¼ÖÂµç³ØºÜ¿ìºÄ¾¡µÈµÈ¡£´«Í³IPCûÓÐÈκΰ²È«´ëÊ©£¬ÍêÈ«ÒÀÀµÉϲãЭÒéÀ´È·±£¡£Ê×ÏÈ´«Í³IPCµÄ½ÓÊÕ·½ÎÞ·¨»ñµÃ¶Ô·½½ø³Ì¿É¿¿µÄUID/PID£¨Óû§ID/½ø³ÌID£©£¬´Ó¶øÎÞ·¨¼ø±ð¶Ô·½Éí·Ý¡£AndroidΪÿ¸ö°²×°ºÃµÄÓ¦ÓóÌÐò·ÖÅäÁË×Ô¼ºµÄUID£¬¹Ê½ø³ÌµÄUIDÊǼø±ð½ø³ÌÉí·ÝµÄÖØÒª±êÖ¾¡£Ê¹Óô«Í³IPCÖ»ÄÜÓÉÓû§ÔÚÊý¾Ý°üÀïÌîÈëUID/PID£¬µ«ÕâÑù²»¿É¿¿£¬ÈÝÒ×±»¶ñÒâ³ÌÐòÀûÓ᣿ɿ¿µÄÉí·Ý±ê¼ÇÖ»ÓÐÓÉIPC»úÖÆ±¾ÉíÔÚÄÚºËÖÐÌí¼Ó¡£Æä´Î´«Í³IPC·ÃÎʽÓÈëµãÊÇ¿ª·ÅµÄ£¬ÎÞ·¨½¨Á¢Ë½ÓÐͨµÀ¡£±ÈÈçÃüÃû¹ÜµÀµÄÃû³Æ£¬system VµÄ¼üÖµ£¬socketµÄipµØÖ·»òÎļþÃû¶¼ÊÇ¿ª·ÅµÄ£¬Ö»ÒªÖªµÀÕâЩ½ÓÈëµãµÄ³ÌÐò¶¼¿ÉÒԺͶԶ˽¨Á¢Á¬½Ó£¬²»¹ÜÔõÑù¶¼ÎÞ·¨×èÖ¹¶ñÒâ³ÌÐòͨ¹ý²Â²â½ÓÊÕ·½µØÖ·»ñµÃÁ¬½Ó¡£

»ùÓÚÒÔÉÏÔ­Òò£¬AndroidÐèÒª½¨Á¢Ò»Ì×еÄIPC»úÖÆÀ´Âú×ãϵͳ¶ÔͨÐÅ·½Ê½£¬´«ÊäÐÔÄܺͰ²È«ÐÔµÄÒªÇó£¬Õâ¾ÍÊÇBinder¡£Binder»ùÓÚClient-ServerͨÐÅģʽ£¬´«Êä¹ý³ÌÖ»ÐèÒ»´Î¿½±´£¬Îª·¢ËÍ·¢Ìí¼ÓUID/PIDÉí·Ý£¬¼ÈÖ§³ÖʵÃûBinderÒ²Ö§³ÖÄäÃûBinder£¬°²È«ÐԸߡ£

2 ÃæÏò¶ÔÏóµÄ Binder IPC

BinderʹÓÃClient-ServerͨÐÅ·½Ê½£ºÒ»¸ö½ø³Ì×÷ΪServerÌṩÖîÈçÊÓÆµ/ÒôƵ½âÂ룬ÊÓÆµ²¶»ñ£¬µØÖ·±¾²éѯ£¬ÍøÂçÁ¬½ÓµÈ·þÎñ£»¶à¸ö½ø³Ì×÷ΪClientÏòServer·¢Æð·þÎñÇëÇ󣬻ñµÃËùÐèÒªµÄ·þÎñ¡£ÒªÏëʵÏÖClient-ServerͨОݱØÐëʵÏÖÒÔÏÂÁ½µã£ºÒ»ÊÇserver±ØÐëÓÐÈ·¶¨µÄ·ÃÎʽÓÈëµã»òÕß˵µØÖ·À´½ÓÊÜClientµÄÇëÇ󣬲¢ÇÒClient¿ÉÒÔͨ¹ýijÖÖ;¾¶»ñÖªServerµÄµØÖ·£»¶þÊÇÖÆ¶¨Command-ReplyЭÒéÀ´´«ÊäÊý¾Ý¡£ÀýÈçÔÚÍøÂçͨÐÅÖÐServerµÄ·ÃÎʽÓÈëµã¾ÍÊÇServerÖ÷»úµÄIPµØÖ·+¶Ë¿ÚºÅ£¬´«ÊäЭÒéΪTCPЭÒé¡£¶ÔBinder¶øÑÔ£¬Binder¿ÉÒÔ¿´³ÉServerÌṩµÄʵÏÖij¸öÌØ¶¨·þÎñµÄ·ÃÎʽÓÈëµã£¬ Clientͨ¹ýÕâ¸ö¡®µØÖ·¡¯ÏòServer·¢ËÍÇëÇóÀ´Ê¹Óø÷þÎñ£»¶ÔClient¶øÑÔ£¬Binder¿ÉÒÔ¿´³ÉÊÇͨÏòServerµÄ¹ÜµÀÈë¿Ú£¬ÒªÏëºÍij¸öServerͨÐÅÊ×ÏȱØÐ뽨Á¢Õâ¸ö¹ÜµÀ²¢»ñµÃ¹ÜµÀÈë¿Ú¡£

ÓëÆäËüIPC²»Í¬£¬BinderʹÓÃÁËÃæÏò¶ÔÏóµÄ˼ÏëÀ´ÃèÊö×÷Ϊ·ÃÎʽÓÈëµãµÄBinder¼°ÆäÔÚClientÖеÄÈë¿Ú£ºBinderÊÇÒ»¸öʵÌåλÓÚServerÖеĶÔÏ󣬸öÔÏóÌṩÁËÒ»Ì×·½·¨ÓÃÒÔʵÏÖ¶Ô·þÎñµÄÇëÇ󣬾ÍÏóÀàµÄ³ÉÔ±º¯Êý¡£±é²¼ÓÚclientÖеÄÈë¿Ú¿ÉÒÔ¿´³ÉÖ¸ÏòÕâ¸öbinder¶ÔÏóµÄ¡®Ö¸Õ롯£¬Ò»µ©»ñµÃÁËÕâ¸ö¡®Ö¸Õ롯¾Í¿ÉÒÔµ÷ÓøöÔÏóµÄ·½·¨·ÃÎÊserver¡£ÔÚClient¿´À´£¬Í¨¹ýBinder¡®Ö¸Õ롯µ÷ÓÃÆäÌṩµÄ·½·¨ºÍͨ¹ýÖ¸Õëµ÷ÓÃÆäËüÈκα¾µØ¶ÔÏóµÄ·½·¨²¢ÎÞÇø±ð£¬¾¡¹ÜǰÕßµÄʵÌåλÓÚÔ¶¶ËServerÖУ¬¶øºóÕßʵÌåλÓÚ±¾µØÄÚ´æÖС£¡®Ö¸Õ롯ÊÇC++µÄÊõÓ¶ø¸üͨ³£µÄ˵·¨ÊÇÒýÓ㬼´Clientͨ¹ýBinderµÄÒýÓ÷ÃÎÊServer¡£¶øÈí¼þÁìÓòÁíÒ»¸öÊõÓï¡®¾ä±ú¡¯Ò²¿ÉÒÔÓÃÀ´±íÊöBinderÔÚClientÖеĴæÔÚ·½Ê½¡£´ÓͨÐŵĽǶȿ´£¬ClientÖеÄBinderÒ²¿ÉÒÔ¿´×÷ÊÇServer BinderµÄ¡®´úÀí¡¯£¬ÔÚ±¾µØ´ú±íÔ¶¶ËServerΪClientÌṩ·þÎñ¡£±¾ÎÄÖлáʹÓá®ÒýÓ᯻ò¡®¾ä±ú¡¯Õâ¸öÁ½¹ã·ºÊ¹ÓõÄÊõÓï¡£

ÃæÏò¶ÔÏó˼ÏëµÄÒýÈ뽫½ø³Ì¼äͨÐÅת»¯ÎªÍ¨¹ý¶Ôij¸öBinder¶ÔÏóµÄÒýÓõ÷ÓøöÔÏóµÄ·½·¨£¬¶øÆä¶ÀÌØÖ®´¦ÔÚÓÚBinder¶ÔÏóÊÇÒ»¸ö¿ÉÒÔ¿ç½ø³ÌÒýÓõĶÔÏó£¬ËüµÄʵÌåλÓÚÒ»¸ö½ø³ÌÖУ¬¶øËüµÄÒýÓÃÈ´±é²¼ÓÚϵͳµÄ¸÷¸ö½ø³ÌÖ®ÖС£×îÓÕÈ˵ÄÊÇ£¬Õâ¸öÒýÓúÍjavaÀïÒýÓÃÒ»Ñù¼È¿ÉÒÔÊÇÇ¿ÀàÐÍ£¬Ò²¿ÉÒÔÊÇÈõÀàÐÍ£¬¶øÇÒ¿ÉÒÔ´ÓÒ»¸ö½ø³Ì´«¸øÆäËü½ø³Ì£¬Èôó¼Ò¶¼ÄÜ·ÃÎÊͬһServer£¬¾ÍÏó½«Ò»¸ö¶ÔÏó»òÒýÓø³Öµ¸øÁíÒ»¸öÒýÓÃÒ»Ñù¡£BinderÄ£ºýÁ˽ø³Ì±ß½ç£¬µ­»¯Á˽ø³Ì¼äͨÐŹý³Ì£¬Õû¸öϵͳ·Â·ðÔËÐÐÓÚͬһ¸öÃæÏò¶ÔÏóµÄ³ÌÐòÖ®ÖС£ÐÎÐÎɫɫµÄBinder¶ÔÏóÒÔ¼°ÐÇÂÞÆå²¼µÄÒýÓ÷·ðÕ³½Ó¸÷¸öÓ¦ÓóÌÐòµÄ½ºË®£¬ÕâÒ²ÊÇBinderÔÚÓ¢ÎÄÀïµÄÔ­Òâ¡£

µ±È»ÃæÏò¶ÔÏóÖ»ÊÇÕë¶ÔÓ¦ÓóÌÐò¶øÑÔ£¬¶ÔÓÚBinderÇý¶¯ºÍÄÚºËÆäËüÄ£¿éÒ»ÑùʹÓÃCÓïÑÔʵÏÖ£¬Ã»ÓÐÀàºÍ¶ÔÏóµÄ¸ÅÄî¡£BinderÇý¶¯ÎªÃæÏò¶ÔÏóµÄ½ø³Ì¼äͨÐÅÌṩµ×²ãÖ§³Ö¡£

3 Binder ͨÐÅÄ£ÐÍ

Binder¿ò¼Ü¶¨ÒåÁËËĸö½ÇÉ«£ºServer£¬Client£¬ServiceManager£¨ÒÔºó¼ò³ÆSMgr£©ÒÔ¼°BinderÇý¶¯¡£ÆäÖÐServer£¬Client£¬SMgrÔËÐÐÓÚÓû§¿Õ¼ä£¬Çý¶¯ÔËÐÐÓÚÄں˿ռ䡣ÕâËĸö½ÇÉ«µÄ¹ØÏµºÍ»¥ÁªÍøÀàËÆ£ºServerÊÇ·þÎñÆ÷£¬ClientÊǿͻ§ÖÕ¶Ë£¬SMgrÊÇÓòÃû·þÎñÆ÷£¨DNS£©£¬Çý¶¯ÊÇ·ÓÉÆ÷¡£

3.1 Binder Çý¶¯

ºÍ·ÓÉÆ÷Ò»Ñù£¬BinderÇý¶¯ËäȻĬĬÎÞÎÅ£¬È´ÊÇͨÐŵĺËÐÄ¡£¾¡¹ÜÃû½Ð¡®Çý¶¯¡¯£¬Êµ¼ÊÉϺÍÓ²¼þÉ豸ûÓÐÈκιØÏµ£¬Ö»ÊÇʵÏÖ·½Ê½ºÍÉ豸Çý¶¯³ÌÐòÊÇÒ»ÑùµÄ£ºËü¹¤×÷ÓÚÄÚºË̬£¬Ìṩopen()£¬mmap()£¬poll()£¬ioctl()µÈ±ê×¼Îļþ²Ù×÷£¬ÒÔ×Ö·ûÇý¶¯É豸ÖеÄmiscÉ豸ע²áÔÚÉ豸Ŀ¼/devÏ£¬Óû§Í¨¹ý/dev/binder·ÃÎʸÃËü¡£Çý¶¯¸ºÔð½ø³ÌÖ®¼äBinderͨÐŵĽ¨Á¢£¬BinderÔÚ½ø³ÌÖ®¼äµÄ´«µÝ£¬BinderÒýÓüÆÊý¹ÜÀí£¬Êý¾Ý°üÔÚ½ø³ÌÖ®¼äµÄ´«µÝºÍ½»»¥µÈһϵÁеײãÖ§³Ö¡£Çý¶¯ºÍÓ¦ÓóÌÐòÖ®¼ä¶¨ÒåÁËÒ»Ì×½Ó¿ÚЭÒ飬Ö÷Òª¹¦ÄÜÓÉioctl()½Ó¿ÚʵÏÖ£¬²»Ìṩread()£¬write()½Ó¿Ú£¬ÒòΪioctl()Áé»î·½±ã£¬ÇÒÄܹ»Ò»´Îµ÷ÓÃʵÏÖÏÈдºó¶ÁÒÔÂú×ãͬ²½½»»¥£¬¶ø²»±Ø·Ö±ðµ÷ÓÃwrite()ºÍread()¡£BinderÇý¶¯µÄ´úÂëλÓÚlinuxĿ¼µÄdrivers/misc/binder.cÖС£

3.2 ServiceManager ÓëʵÃûBinder

ºÍDNSÀàËÆ£¬SMgrµÄ×÷ÓÃÊǽ«×Ö·ûÐÎʽµÄBinderÃû×Öת»¯³ÉClientÖжԸÃBinderµÄÒýÓã¬Ê¹µÃClientÄܹ»Í¨¹ýBinderÃû×Ö»ñµÃ¶ÔServerÖÐBinderʵÌåµÄÒýÓá£×¢²áÁËÃû×ÖµÄBinder½ÐʵÃûBinder£¬¾ÍÏóÿ¸öÍøÕ¾³ýÁËÓÐIPµØÖ·Í⻹ÓÐ×Ô¼ºµÄÍøÖ·¡£Server´´½¨ÁËBinderʵÌ壬ΪÆäȡһ¸ö×Ö·ûÐÎʽ£¬¿É¶ÁÒ׼ǵÄÃû×Ö£¬½«Õâ¸öBinderÁ¬Í¬Ãû×ÖÒÔÊý¾Ý°üµÄÐÎʽͨ¹ýBinderÇý¶¯·¢Ë͸øSMgr£¬Í¨ÖªSMgr×¢²áÒ»¸öÃû½ÐÕÅÈýµÄBinder£¬ËüλÓÚij¸öServerÖС£Çý¶¯ÎªÕâ¸ö´©¹ý½ø³Ì±ß½çµÄBinder´´½¨Î»ÓÚÄÚºËÖеÄʵÌå½ÚµãÒÔ¼°SMgr¶ÔʵÌåµÄÒýÓ㬽«Ãû×Ö¼°Ð½¨µÄÒýÓôò°ü´«µÝ¸øSMgr¡£SMgrÊÕÊý¾Ý°üºó£¬´ÓÖÐÈ¡³öÃû×ÖºÍÒýÓÃÌîÈëÒ»ÕŲéÕÒ±íÖС£

ϸÐĵĶÁÕß¿ÉÄܻᷢÏÖÆäÖеÄõèõΣºSMgrÊÇÒ»¸ö½ø³Ì£¬ServerÊÇÁíÒ»¸ö½ø³Ì£¬ServerÏòSMgr×¢²áBinder±ØÈ»»áÉæ¼°½ø³Ì¼äͨÐÅ¡£µ±Ç°ÊµÏÖµÄÊǽø³Ì¼äͨÐÅÈ´ÓÖÒªÓõ½½ø³Ì¼äͨÐÅ£¬Õâ¾ÍºÃÏóµ°¿ÉÒÔ·õ³ö¼¦Ç°ÌáÈ´ÊÇÒªÕÒÖ»¼¦À´·õµ°¡£BinderµÄʵÏֱȽÏÇÉÃԤÏÈ´´ÔìÒ»Ö»¼¦À´·õµ°£ºSMgrºÍÆäËü½ø³ÌͬÑù²ÉÓÃBinderͨÐÅ£¬SMgrÊÇServer¶Ë£¬ÓÐ×Ô¼ºµÄBinder¶ÔÏó£¨ÊµÌ壩£¬ÆäËü½ø³Ì¶¼ÊÇClient£¬ÐèҪͨ¹ýÕâ¸öBinderµÄÒýÓÃÀ´ÊµÏÖBinderµÄ×¢²á£¬²éѯºÍ»ñÈ¡¡£SMgrÌṩµÄBinder±È½ÏÌØÊ⣬ËüûÓÐÃû×ÖÒ²²»ÐèҪע²á£¬µ±Ò»¸ö½ø³ÌʹÓÃBINDER_SET_CONTEXT_MGRÃüÁ×Ô¼º×¢²á³ÉSMgrʱBinderÇý¶¯»á×Ô¶¯ÎªËü´´½¨BinderʵÌ壨Õâ¾ÍÊÇÄÇÖ»Ô¤ÏÈÔìºÃµÄ¼¦£©¡£Æä´ÎÕâ¸öBinderµÄÒýÓÃÔÚËùÓÐClientÖж¼¹Ì¶¨Îª0¶øÎÞÐëͨ¹ýÆäËüÊֶλñµÃ¡£Ò²¾ÍÊÇ˵£¬Ò»¸öServerÈôÒªÏòSMgr×¢²á×Ô¼ºBinder¾Í±ØÐèͨ¹ý0Õâ¸öÒýÓúźÍSMgrµÄBinderͨÐÅ¡£Àà±ÈÍøÂçͨÐÅ£¬0ºÅÒýÓþͺñÈÓòÃû·þÎñÆ÷µÄµØÖ·£¬Äã±ØÐëÔ¤ÏÈÊÖ¹¤»ò¶¯Ì¬ÅäÖúá£Òª×¢ÒâÕâÀï˵µÄClientÊÇÏà¶ÔSMgr¶øÑԵģ¬Ò»¸öÓ¦ÓóÌÐò¿ÉÄÜÊǸöÌṩ·þÎñµÄServer£¬µ«¶ÔSMgrÀ´ËµËüÈÔÈ»ÊǸöClient¡£

3.3 Client »ñµÃʵÃûBinderµÄÒýÓÃ

ServerÏòSMgr×¢²áÁËBinderʵÌå¼°ÆäÃû×Öºó£¬Client¾Í¿ÉÒÔͨ¹ýÃû×Ö»ñµÃ¸ÃBinderµÄÒýÓÃÁË¡£ClientÒ²ÀûÓñ£ÁôµÄ0ºÅÒýÓÃÏòSMgrÇëÇó·ÃÎÊij¸öBinder£ºÎÒÉêÇë»ñµÃÃû×Ö½ÐÕÅÈýµÄBinderµÄÒýÓá£SMgrÊÕµ½Õâ¸öÁ¬½ÓÇëÇ󣬴ÓÇëÇóÊý¾Ý°üÀï»ñµÃBinderµÄÃû×Ö£¬ÔÚ²éÕÒ±íÀïÕÒµ½¸ÃÃû×Ö¶ÔÓ¦µÄÌõÄ¿£¬´ÓÌõÄ¿ÖÐÈ¡³öBinderµÄÒýÓ㬽«¸ÃÒýÓÃ×÷Ϊ»Ø¸´·¢Ë͸ø·¢ÆðÇëÇóµÄClient¡£´ÓÃæÏò¶ÔÏóµÄ½Ç¶È£¬Õâ¸öBinder¶ÔÏóÏÖÔÚÓÐÁËÁ½¸öÒýÓãºÒ»¸öλÓÚSMgrÖУ¬Ò»¸öλÓÚ·¢ÆðÇëÇóµÄClientÖС£Èç¹û½ÓÏÂÀ´Óиü¶àµÄClientÇëÇó¸ÃBinder£¬ÏµÍ³ÖоͻáÓиü¶àµÄÒýÓÃÖ¸Ïò¸ÃBinder£¬¾ÍÏójavaÀïÒ»¸ö¶ÔÏó´æÔÚ¶à¸öÒýÓÃÒ»Ñù¡£¶øÇÒÀàËÆµÄÕâЩָÏòBinderµÄÒýÓÃÊÇÇ¿ÀàÐÍ£¬´Ó¶øÈ·±£Ö»ÒªÓÐÒýÓÃBinderʵÌå¾Í²»»á±»Êͷŵô¡£Í¨¹ýÒÔÉϹý³Ì¿ÉÒÔ¿´³ö£¬SMgrÏó¸ö»ð³µÆ±´úÊ۵㣬ÊÕ¼¯ÁËËùÓл𳵵ijµÆ±£¬¿ÉÒÔͨ¹ýËü¹ºÂòµ½³Ë×ø¸÷ÌË»ð³µµÄÆ±-µÃµ½Ä³¸öBinderµÄÒýÓá£

3.4 ÄäÃû Binder

²¢²»ÊÇËùÓÐBinder¶¼ÐèҪע²á¸øSMgr¹ã¶ø¸æÖ®µÄ¡£Server¶Ë¿ÉÒÔͨ¹ýÒѾ­½¨Á¢µÄBinderÁ¬½Ó½«´´½¨µÄBinderʵÌå´«¸øClient£¬µ±È»ÕâÌõÒѾ­½¨Á¢µÄBinderÁ¬½Ó±ØÐëÊÇͨ¹ýʵÃûBinderʵÏÖ¡£ÓÉÓÚÕâ¸öBinderûÓÐÏòSMgr×¢²áÃû×Ö£¬ËùÒÔÊǸöÄäÃûBinder¡£Client½«»áÊÕµ½Õâ¸öÄäÃûBinderµÄÒýÓã¬Í¨¹ýÕâ¸öÒýÓÃÏòλÓÚServerÖеÄʵÌå·¢ËÍÇëÇó¡£ÄäÃûBinderΪͨÐÅË«·½½¨Á¢Ò»Ìõ˽ÃÜͨµÀ£¬Ö»ÒªServerûÓаÑÄäÃûBinder·¢¸ø±ðµÄ½ø³Ì£¬±ðµÄ½ø³Ì¾ÍÎÞ·¨Í¨¹ýÇî¾Ù»ò²Â²âµÈÈκη½Ê½»ñµÃ¸ÃBinderµÄÒýÓã¬Ïò¸ÃBinder·¢ËÍÇëÇó¡£

ÏÂͼչʾÁ˲ÎÓëBinderͨÐŵÄËùÓнÇÉ«£¬½«ÔÚÒÔºóÕ½ÚÖÐÒ»Ò»Ìáµ½¡£

ͼ 1 BinderͨÐÅʾÀý

4 Binder ЭÒé

BinderЭÒé»ù±¾¸ñʽÊÇ£¨ÃüÁî+Êý¾Ý£©£¬Ê¹ÓÃioctl(fd, cmd, arg)º¯ÊýʵÏÖ½»»¥¡£ÃüÁîÓɲÎÊýcmd³ÐÔØ£¬Êý¾ÝÓɲÎÊýarg³ÐÔØ£¬Ëæcmd²»Í¬¶ø²»Í¬¡£Ï±íÁоÙÁËËùÓÐÃüÁî¼°ÆäËù¶ÔÓ¦µÄÊý¾Ý£º

±í 2 BinderͨÐÅÃüÁî×Ö

ÃüÁî º¬Òå arg
BINDER_WRITE_READ ¸ÃÃüÁîÏòBinderдÈë»ò¶ÁÈ¡Êý¾Ý¡£²ÎÊý·ÖΪÁ½¶Î£ºÐ´²¿·ÖºÍ¶Á²¿·Ö¡£Èç¹ûwrite_size²»Îª0¾ÍÏȽ«write_bufferÀïµÄÊý¾ÝдÈëBinder£»Èç¹ûread_size²»Îª0ÔÙ´ÓBinderÖжÁÈ¡Êý¾Ý´æÈëread_bufferÖС£write_consumedºÍread_consumed±íʾ²Ù×÷Íê³ÉʱBinderÇý¶¯Êµ¼ÊдÈë»ò¶Á³öµÄÊý¾Ý¸öÊý¡£ struct binder_write_read {
signed long write_size;

signed long write_consumed;

unsigned long write_buffer;

signed long read_size;

signed long read_consumed;

unsigned long read_buffer;

};

BINDER_SET_MAX_THREADS ¸ÃÃüÁî¸æÖªBinderÇý¶¯½ÓÊÕ·½£¨Í¨³£ÊÇServer¶Ë£©Ï̳߳ØÖÐ×î´óµÄÏß³ÌÊý¡£ÓÉÓÚClientÊDz¢·¢ÏòServer¶Ë·¢ËÍÇëÇóµÄ£¬Server¶Ë±ØÐ뿪±ÙÏ̳߳ØÎªÕâЩ²¢·¢ÇëÇóÌṩ·þÎñ¡£¸æÖªÇý¶¯Ï̳߳صÄ×î´óÖµÊÇΪÁËÈÃÇý¶¯·¢ÏÖÏß³ÌÊý´ïµ½¸Ãֵʱ²»ÒªÔÙÃüÁî½ÓÊÕ¶ËÆô¶¯ÐµÄÏ̡߳£ int max_threads;
BINDER_SET_CONTEXT_MGR ½«µ±Ç°½ø³Ì×¢²áΪSMgr¡£ÏµÍ³ÖÐͬʱֻÄÜ´æÔÚÒ»¸öSMgr¡£Ö»Òªµ±Ç°µÄSMgrûÓе÷ÓÃclose()¹Ø±ÕBinderÇý¶¯¾Í²»ÄÜÓбðµÄ½ø³Ì¿ÉÒÔ³ÉΪSMgr¡£ ---
BINDER_THREAD_EXIT ֪ͨBinderÇý¶¯µ±Ç°Ïß³ÌÍ˳öÁË¡£Binder»áΪËùÓвÎÓëBinderͨÐŵÄỊ̈߳¨°üÀ¨ServerÏ̳߳ØÖеÄÏ̺߳ÍClient·¢³öÇëÇóµÄỊ̈߳©½¨Á¢ÏàÓ¦µÄÊý¾Ý½á¹¹¡£ÕâЩÏß³ÌÔÚÍ˳öʱ±ØÐë֪ͨÇý¶¯ÊÍ·ÅÏàÓ¦µÄÊý¾Ý½á¹¹¡£ ---
BINDER_VERSION
»ñµÃBinderÇý¶¯µÄ°æ±¾ºÅ¡£
---

ÕâÆäÖÐ×î³£ÓõÄÃüÁîÊÇBINDER_WRITE_READ¡£¸ÃÃüÁîµÄ²ÎÊý°üÀ¨Á½²¿·ÖÊý¾Ý£ºÒ»²¿·ÖÊÇÏòBinderдÈëµÄÊý¾Ý£¬Ò»²¿·ÖÊÇÒª´ÓBinder¶Á³öµÄÊý¾Ý£¬Çý¶¯³ÌÐòÏÈ´¦Àíд²¿·ÖÔÙ´¦Àí¶Á²¿·Ö¡£ÕâÑù°²Åŵĺô¦ÊÇÓ¦ÓóÌÐò¿ÉÒÔºÜÁé»îµØ´¦ÀíÃüÁîµÄͬ²½»òÒì²½¡£ÀýÈçÈôÒª·¢ËÍÒì²½ÃüÁî¿ÉÒÔÖ»ÌîÈëд²¿·Ö¶ø½«read_sizeÖóÉ0£»ÈôÒªÖ»´ÓBinder»ñµÃÊý¾Ý¿ÉÒÔ½«Ð´²¿·ÖÖÿռ´write_sizeÖóÉ0£»ÈôÒª·¢ËÍÇëÇó²¢Í¬²½µÈ´ý·µ»ØÊý¾Ý¿ÉÒÔ½«Á½²¿·Ö¶¼ÖÃÉÏ¡£

4.1 BINDER_WRITE_READ ֮д²Ù×÷

Binderд²Ù×÷µÄÊý¾Ýʱ¸ñʽͬÑùÒ²ÊÇ£¨ÃüÁî+Êý¾Ý£©¡£ÕâʱºòÃüÁîºÍÊý¾Ý¶¼´æ·ÅÔÚbinder_write_read ½á¹¹write_bufferÓòÖ¸ÏòµÄÄÚ´æ¿Õ¼äÀ¶àÌõÃüÁî¿ÉÒÔÁ¬Ðø´æ·Å¡£Êý¾Ý½ô½Ó×Å´æ·ÅÔÚÃüÁîºóÃæ£¬¸ñʽ¸ù¾ÝÃüÁͬ¶ø²»Í¬¡£Ï±íÁоÙÁËBinderд²Ù×÷Ö§³ÖµÄÃüÁ

±í 3 Binderд²Ù×÷ÃüÁî×Ö

cmd º¬Òå arg
BC_TRANSACTION
BC_REPLY
BC_TRANSACTIONÓÃÓÚClientÏòServer·¢ËÍÇëÇóÊý¾Ý£»BC_REPLYÓÃÓÚServerÏòClient·¢Ëͻظ´£¨Ó¦´ð£©Êý¾Ý¡£ÆäºóÃæ½ô½Ó×ÅÒ»¸öbinder_transaction_data½á¹¹Ìå±íÃ÷ҪдÈëµÄÊý¾Ý¡£ struct binder_transaction _data

 

BC_ACQUIRE_RESULT
BC_ATTEMPT_ACQUIRE
ÔÝδʵÏÖ ---
BC_FREE_BUFFER ÊÍ·ÅÒ»¿éÓ³ÉäµÄÄÚ´æ¡£Binder½ÓÊÕ·½Í¨¹ýmmap()Ó³ÉäÒ»¿é½Ï´óµÄÄÚ´æ¿Õ¼ä£¬BinderÇý¶¯»ùÓÚÕâÆ¬ÄÚ´æ²ÉÓÃ×î¼ÑÆ¥ÅäË㷨ʵÏÖ½ÓÊÕÊý¾Ý»º´æµÄ¶¯Ì¬·ÖÅäºÍÊÍ·Å£¬Âú×ã²¢·¢ÇëÇó¶Ô½ÓÊÕ»º´æÇøµÄÐèÇó¡£Ó¦ÓóÌÐò´¦ÀíÍêÕâÆ¬Êý¾Ýºó±ØÐ뾡¿ìʹÓøÃÃüÁîÊÍ·Å»º´æÇø£¬·ñÔò»áÒòΪ»º´æÇøºÄ¾¡¶øÎÞ·¨½ÓÊÕÐÂÊý¾Ý Ö¸ÏòÐèÒªÊͷŵĻº´æÇøµÄÖ¸Õ룻¸ÃÖ¸ÕëλÓÚÊÕµ½µÄBinderÊý¾Ý°üÖÐ
BC_INCREFS
BC_ACQUIRE
BC_RELEASE
BC_DECREFS
Õâ×éÃüÁîÔö¼Ó»ò¼õÉÙBinderµÄÒýÓüÆÊý£¬ÓÃÒÔʵÏÖǿָÕë»òÈõÖ¸ÕëµÄ¹¦ÄÜ¡£¡£ 32λBinderÒýÓúÅ
BC_INCREFS_DONE
BC_ACQUIRE_DONE
µÚÒ»´ÎÔö¼ÓBinderʵÌåÒýÓüÆÊýʱ£¬Çý¶¯ÏòBinderʵÌåËùÔڵĽø³Ì·¢ËÍBR_INCREFS£¬ BR_ACQUIREÏûÏ¢£»BinderʵÌåËùÔڵĽø³Ì´¦ÀíÍê±Ï»ØÀ¡BC_INCREFS_DONE£¬BC_ACQUIRE_DONE void *ptr£º BinderʵÌåÔÚÓû§¿Õ¼äÖеÄÖ¸Õë

void *cookie£ºÓë¸ÃʵÌåÏà¹ØµÄ¸½¼ÓÊý¾Ý

BC_REGISTER_LOOPER
BC_ENTER_LOOPER
BC_EXIT_LOOPER
Õâ×éÃüÁîͬBINDER_SET_MAX_THREADSÒ»µÀʵÏÖBinderÇý¶¯¶Ô½ÓÊÕ·½Ï̳߳عÜÀí¡£BC_REGISTER_LOOPER֪ͨÇý¶¯Ï̳߳ØÖÐÒ»¸öÏß³ÌÒѾ­´´½¨ÁË£»BC_ENTER_LOOPER֪ͨÇý¶¯¸ÃÏß³ÌÒѾ­½øÈëÖ÷Ñ­»·£¬¿ÉÒÔ½ÓÊÕÊý¾Ý£»BC_EXIT_LOOPER֪ͨÇý¶¯¸ÃÏß³ÌÍ˳öÖ÷Ñ­»·£¬²»ÔÙ½ÓÊÕÊý¾Ý¡£ ---

 

BC_REQUEST_DEATH _NOTIFICATION »ñµÃBinderÒýÓõĽø³Ìͨ¹ý¸ÃÃüÁîÒªÇóÇý¶¯ÔÚBinderʵÌåÏú»ÙµÃµ½Í¨Öª¡£Ëä˵ǿָÕë¿ÉÒÔÈ·±£Ö»ÒªÓÐÒýÓþͲ»»áÏú»ÙʵÌ壬µ«Õâ±Ï¾¹ÊǸö¿ç½ø³ÌµÄÒýÓã¬Ë­Ò²ÎÞ·¨±£Ö¤ÊµÌåÓÉÓÚËùÔÚµÄServer¹Ø±ÕBinderÇý¶¯»òÒì³£Í˳ö¶øÏûʧ£¬ÒýÓÃÕßÄÜ×öµÄÊÇÒªÇóServerÔڴ˿̸ø³ö֪ͨ¡£ uint32 *ptr; ÐèÒªµÃµ½ËÀÍö֪ͨµÄBinderÒýÓÃ

void **cookie: ÓëËÀÍö֪ͨÏà¹ØµÄÐÅÏ¢£¬Çý¶¯»áÔÚ·¢³öËÀÍö֪ͨʱ·µ»Ø¸ø·¢³öÇëÇóµÄ½ø³Ì¡£

 

BC_DEAD_BINDER_DONE ÊÕµ½ÊµÌåËÀÍö֪ͨÊéµÄ½ø³ÌÔÚɾ³ýÒýÓúóÓñ¾ÃüÁî¸æÖªÇý¶¯¡£ void **cookie

 

 

ÔÚÕâЩÃüÁîÖУ¬×î³£ÓõÄÊÇBC_TRANSACTION/BC_REPLYÃüÁî¶Ô£¬BinderÇëÇóºÍÓ¦´ðÊý¾Ý¾ÍÊÇͨ¹ýÕâ¶ÔÃüÁî·¢Ë͸ø½ÓÊÕ·½¡£Õâ¶ÔÃüÁîËù³ÐÔØµÄÊý¾Ý°üÓɽṹÌåstruct binder_transaction_data¶¨Òå¡£Binder½»»¥ÓÐͬ²½ºÍÒì²½Ö®·Ö£¬ÀûÓÃbinder_transaction_dataÖÐflagÓòÇø·Ö¡£Èç¹ûflagÓòµÄTF_ONE_WAYλΪ1ÔòΪÒì²½½»»¥£¬¼´Client¶Ë·¢ËÍÍêÇëÇó½»»¥¼´½áÊø£¬ Server¶Ë²»ÔÙ·µ»ØBC_REPLYÊý¾Ý°ü£»·ñÔòServer»á·µ»ØBC_REPLYÊý¾Ý°ü£¬Client¶Ë±ØÐëµÈ´ý½ÓÊÕÍê¸ÃÊý¾Ý°ü·½²ÅÍê³ÉÒ»´Î½»»¥¡£

4.2 BINDER_WRITE_READ £º´ÓBinder¶Á³öÊý¾Ý

´ÓBinderÀï¶Á³öµÄÊý¾Ý¸ñʽºÍÏòBinderÖÐдÈëµÄÊý¾Ý¸ñʽһÑù£¬²ÉÓã¨ÏûÏ¢ID+Êý¾Ý£©ÐÎʽ£¬²¢ÇÒ¶àÌõÏûÏ¢¿ÉÒÔÁ¬Ðø´æ·Å¡£Ï±íÁоÙÁË´ÓBinder¶Á³öµÄÃüÁî×Ö¼°ÆäÏàÓ¦µÄ²ÎÊý£º

±í 4 Binder¶Á²Ù×÷ÏûÏ¢ID

ÏûÏ¢ º¬Òå ²ÎÊý
BR_ERROR ·¢ÉúÄÚ²¿´íÎó£¨ÈçÄÚ´æ·ÖÅäʧ°Ü£© ---

 

BR_OK
BR_NOOP
²Ù×÷Íê³É ---
BR_SPAWN_LOOPER ¸ÃÏûÏ¢ÓÃÓÚ½ÓÊÕ·½Ï̳߳عÜÀí¡£µ±Çý¶¯·¢ÏÖ½ÓÊÕ·½ËùÓÐÏ̶߳¼´¦ÓÚæµ״̬ÇÒÏ̳߳ØÀïµÄÏß³Ì×ÜÊýûÓг¬¹ýBINDER_SET_MAX_THREADSÉèÖõÄ×î´óÏß³ÌÊýʱ£¬Ïò½ÓÊÕ·½·¢Ë͸ÃÃüÁîÒªÇó´´½¨¸ü¶àÏß³ÌÒÔ±¸½ÓÊÕÊý¾Ý¡£ ---
BR_TRANSACTION
BR_REPLY
ÕâÁ½ÌõÏûÏ¢·Ö±ð¶ÔÓ¦·¢ËÍ·½µÄBC_TRANSACTION ºÍBC_REPLY£¬±íʾµ±Ç°½ÓÊÕµÄÊý¾ÝÊÇÇëÇó»¹Êǻظ´ binder _transaction_data
BR_ACQUIRE_RESULT
BR_ATTEMPT_ACQUIRE
BR_FINISHED
ÉÐδʵÏÖ ---

 

BR_DEAD_REPLY ½»»¥¹ý³ÌÖÐÈç¹û·¢ÏÖ¶Ô·½½ø³Ì»òÏß³ÌÒѾ­ËÀÍöÔò·µ»Ø¸ÃÏûÏ¢ ---

 

BR_TRANSACTION _COMPLETE ·¢ËÍ·½Í¨¹ýBC_TRANSACTION»òBC_REPLY·¢ËÍÍêÒ»¸öÊý¾Ý°üºó£¬¶¼ÄÜÊÕµ½¸ÃÏûÏ¢×öΪ³É¹¦·¢Ë͵ķ´À¡¡£ÕâºÍBR_REPLY²»Ò»Ñù£¬ÊÇÇý¶¯¸æÖª·¢ËÍ·½ÒѾ­·¢Ëͳɹ¦£¬¶ø²»ÊÇServer¶Ë·µ»ØÇëÇóÊý¾Ý¡£ËùÒÔ²»¹Üͬ²½»¹ÊÇÒì²½½»»¥½ÓÊÕ·½¶¼ÄÜ»ñµÃ±¾ÏûÏ¢¡£ ---

 

BR_INCREFS
BR_ACQUIRE
BR_RELEASE
BR_DECREFS
ÕâÒ»×éÏûÏ¢ÓÃÓÚ¹ÜÀíÇ¿/ÈõÖ¸ÕëµÄÒýÓüÆÊý¡£Ö»ÓÐÌṩBinderʵÌåµÄ½ø³Ì²ÅÄÜÊÕµ½Õâ×éÏûÏ¢¡£ void *ptr£º BinderʵÌåÔÚÓû§¿Õ¼äÖеÄÖ¸Õë

void *cookie£ºÓë¸ÃʵÌåÏà¹ØµÄ¸½¼ÓÊý¾Ý

 

 

BR_DEAD_BINDER
BR_CLEAR_DEATH _NOTIFICATION_DONE
Ïò»ñµÃBinderÒýÓõĽø³Ì·¢ËÍBinderʵÌåËÀÍö֪ͨÊ飻ÊÕµ½ËÀÍö֪ͨÊéµÄ½ø³Ì½ÓÏÂÀ´»á·µ»ØBC_DEAD_BINDER_DONE×öÈ·ÈÏ¡£ void **cookie£ºÔÚʹÓÃBC_REQUEST_DEATH _NOTIFICATION×¢²áËÀÍö֪ͨʱµÄ¸½¼Ó²ÎÊý¡£

 

 

 

BR_FAILED_REPLY Èç¹û·¢ËÍ·Ç·¨ÒýÓúÅÔò·µ»Ø¸ÃÏûÏ¢ ---

 

 

ºÍдÊý¾ÝÒ»Ñù£¬ÆäÖÐ×îÖØÒªµÄÏûÏ¢ÊÇBR_TRANSACTION »òBR_REPLY£¬±íÃ÷ÊÕµ½ÁËÒ»¸ö¸ñʽΪbinder_transaction_dataµÄÇëÇóÊý¾Ý°ü£¨BR_TRANSACTION£©»ò·µ»ØÊý¾Ý°ü£¨BR_REPLY£©¡£

4.3 struct binder_transaction_data £ºÊÕ·¢Êý¾Ý°ü½á¹¹

¸Ã½á¹¹ÊÇBinder½ÓÊÕ/·¢ËÍÊý¾Ý°üµÄ±ê×¼¸ñʽ£¬Ã¿¸ö³ÉÔ±¶¨ÒåÈçÏ£º

±í 5 BinderÊÕ·¢Êý¾Ý°ü½á¹¹£ºbinder_transaction_data

³ÉÔ± º¬Òå
union {
size_t handle;

void *ptr;

} target;

¶ÔÓÚ·¢ËÍÊý¾Ý°üµÄÒ»·½£¬¸Ã³ÉÔ±Ö¸Ã÷·¢ËÍÄ¿µÄµØ¡£ÓÉÓÚÄ¿µÄÊÇÔÚÔ¶¶Ë£¬ËùÒÔÕâÀïÌîÈëµÄÊǶÔBinderʵÌåµÄÒýÓ㬴æ·ÅÔÚtarget.handleÖС£ÈçǰÊö£¬BinderµÄÒýÓÃÔÚ´úÂëÖÐÒ²½Ð¾ä±ú£¨handle£©¡£

µ±Êý¾Ý°üµ½´ï½ÓÊÕ·½Ê±£¬Çý¶¯Òѽ«¸Ã³ÉÔ±Ð޸ijÉBinderʵÌ壬¼´Ö¸ÏòBinder¶ÔÏóÄÚ´æµÄÖ¸Õ룬ʹÓÃtarget.ptrÀ´»ñµÃ¡£¸ÃÖ¸ÕëÊǽÓÊÕ·½ÔÚ½«BinderʵÌå´«Ê䏸ÆäËü½ø³ÌʱÌá½»¸øÇý¶¯µÄ£¬Çý¶¯³ÌÐòÄܹ»×Ô¶¯½«·¢ËÍ·½ÌîÈëµÄÒýÓÃת»»³É½ÓÊÕ·½Binder¶ÔÏóµÄÖ¸Õ룬¹Ê½ÓÊÕ·½¿ÉÒÔÖ±½Ó½«Æäµ±×ö¶ÔÏóÖ¸ÕëÀ´Ê¹Óã¨Í¨³£Êǽ«Æäreinterpret_cast³ÉÏàÓ¦Àࣩ¡£

void *cookie; ·¢ËÍ·½ºöÂԸóÉÔ±£»½ÓÊÕ·½ÊÕµ½Êý¾Ý°üʱ£¬¸Ã³ÉÔ±´æ·ÅµÄÊÇ´´½¨BinderʵÌåʱÓɸýÓÊÕ·½×Ô¶¨ÒåµÄÈÎÒâÊýÖµ£¬×öΪÓëBinderÖ¸ÕëÏà¹ØµÄ¶îÍâÐÅÏ¢´æ·ÅÔÚÇý¶¯ÖС£Çý¶¯»ù±¾Éϲ»¹ØÐĸóÉÔ±¡£
unsigned int code; ¸Ã³ÉÔ±´æ·ÅÊÕ·¢Ë«·½Ô¼¶¨µÄÃüÁîÂ룬Çý¶¯ÍêÈ«²»¹ØÐĸóÉÔ±µÄÄÚÈÝ¡£Í¨³£ÊÇServer¶Ë¶¨ÒåµÄ¹«¹²½Ó¿Úº¯ÊýµÄ±àºÅ¡£
unsigned int flags; Óë½»»¥Ïà¹ØµÄ±ê־룬ÆäÖÐ×îÖØÒªµÄÊÇTF_ONE_WAYλ¡£Èç¹û¸ÃλÖÃÉϱíÃ÷Õâ´Î½»»¥ÊÇÒì²½µÄ£¬Server¶Ë²»»á·µ»ØÈκÎÊý¾Ý¡£Çý¶¯ÀûÓøÃλÀ´¾ö¶¨ÊÇ·ñ¹¹½¨Óë·µ»ØÓйصÄÊý¾Ý½á¹¹¡£ÁíÍâһλTF_ACCEPT_FDSÊdzöÓÚ°²È«¿¼ÂÇ£¬Èç¹û·¢ÆðÇëÇóµÄÒ»·½²»Ï£ÍûÔÚÊÕµ½µÄ»Ø¸´ÖнÓÊÕÎļþÐÎʽµÄBinder¿ÉÒÔ½«¸ÃλÖÃÉÏ¡£ÒòΪÊÕµ½Ò»¸öÎļþÐÎʽµÄBinder»á×Ô¶¯ÎªÊý¾Ý½ÓÊÕ·½´ò¿ªÒ»¸öÎļþ£¬Ê¹ÓøÃλ¿ÉÒÔ·ÀÖ¹´ò¿ªÎļþ¹ý¶à¡£
pid_t sender_pid;

uid_t sender_euid;

¸Ã³ÉÔ±´æ·Å·¢ËÍ·½µÄ½ø³ÌIDºÍÓû§ID£¬ÓÉÇý¶¯¸ºÔðÌîÈ룬½ÓÊÕ·½¿ÉÒÔ¶ÁÈ¡¸Ã³ÉÔ±»ñÖª·¢ËÍ·½µÄÉí·Ý¡£
size_t data_size; ¸Ã³ÉÔ±±íʾdata.bufferÖ¸ÏòµÄ»º³åÇø´æ·ÅµÄÊý¾Ý³¤¶È¡£·¢ËÍÊý¾ÝʱÓÉ·¢ËÍ·½ÌîÈ룬±íʾ¼´½«·¢Ë͵ÄÊý¾Ý³¤¶È£»ÔÚ½ÓÊÕ·½ÓÃÀ´¸æÖª½ÓÊÕµ½Êý¾ÝµÄ³¤¶È¡£
size_t offsets_size; Çý¶¯Ò»°ãÇé¿öϲ»¹ØÐÄdata.bufferÀï´æ·ÅʲôÊý¾Ý£¬µ«Èç¹ûÓÐBinderÔÚÆäÖд«ÊäÔòÐèÒª½«ÆäÏà¶Ôdata.bufferµÄÆ«ÒÆÎ»ÖÃÖ¸³öÀ´ÈÃÇý¶¯ÖªµÀ¡£ÓпÉÄÜ´æÔÚ¶à¸öBinderͬʱÔÚÊý¾ÝÖд«µÝ£¬ËùÒÔÐëÓÃÊý×é±íʾËùÓÐÆ«ÒÆÎ»Öᣱ¾³ÉÔ±±íʾ¸ÃÊý×éµÄ´óС¡£
union {
struct {
const void *buffer;

const void *offsets;

} ptr;

uint8_t buf[8];

} data;

data.bufer´æ·ÅÒª·¢ËÍ»ò½ÓÊÕµ½µÄÊý¾Ý£»data.offsetsÖ¸ÏòBinderÆ«ÒÆÎ»ÖÃÊý×飬¸ÃÊý×é¿ÉÒÔλÓÚdata.bufferÖУ¬Ò²¿ÉÒÔÔÚÁíÍâµÄÄÚ´æ¿Õ¼äÖУ¬²¢ÎÞÏÞÖÆ¡£buf[8]ÊÇΪÁËÎÞÂÛ±£Ö¤32λ»¹ÊÇ64λƽ̨£¬³ÉÔ±dataµÄ´óС¶¼ÊÇ8¸ö×Ö½Ú¡£

ÕâÀïÓбØÒªÔÙÇ¿µ÷Ò»ÏÂoffsets_sizeºÍdata.offsetsÁ½¸ö³ÉÔ±£¬ÕâÊÇBinderͨÐÅÓбðÓÚÆäËüIPCµÄµØ·½¡£ÈçǰÊö£¬Binder²ÉÓÃÃæÏò¶ÔÏóµÄÉè¼ÆË¼Ï룬һ¸öBinderʵÌå¿ÉÒÔ·¢Ë͸øÆäËü½ø³Ì´Ó¶ø½¨Á¢Ðí¶à¿ç½ø³ÌµÄÒýÓã»ÁíÍâÕâЩÒýÓÃÒ²¿ÉÒÔÔÚ½ø³ÌÖ®¼ä´«µÝ£¬¾ÍÏójavaÀォһ¸öÒýÓø³¸øÁíÒ»¸öÒýÓÃÒ»Ñù¡£ÎªBinderÔÚ²»Í¬½ø³ÌÖн¨Á¢ÒýÓñØÐëÓÐÇý¶¯µÄ²ÎÓ룬ÓÉÇý¶¯ÔÚÄں˴´½¨²¢×¢²áÏà¹ØµÄÊý¾Ý½á¹¹ºó½ÓÊÕ·½²ÅÄÜʹÓøÃÒýÓ᣶øÇÒÕâЩÒýÓÿÉÒÔÊÇÇ¿ÀàÐÍ£¬ÐèÒªÇý¶¯ÎªÆäά»¤ÒýÓüÆÊý¡£È»¶øÕâЩ¿ç½ø³Ì´«µÝµÄBinder»ìÔÓÔÚÓ¦ÓóÌÐò·¢Ë͵ÄÊý¾Ý°üÀÊý¾Ý¸ñʽÓÉÓû§¶¨Ò壬Èç¹û²»°ÑËüÃÇÒ»Ò»±ê¼Ç³öÀ´¸æÖªÇý¶¯£¬Çý¶¯½«ÎÞ·¨´ÓÊý¾ÝÖн«ËüÃÇÌáÈ¡³öÀ´¡£ÓÚÊǾÍʹÓÃÊý×édata.offsets´æ·ÅÓû§Êý¾ÝÖÐÿ¸öBinderÏà¶Ôdata.bufferµÄÆ«ÒÆÁ¿£¬ÓÃoffsets_size±íʾÕâ¸öÊý×éµÄ´óС¡£Çý¶¯ÔÚ·¢ËÍÊý¾Ý°üʱ»á¸ù¾Ýdata.offsetsºÍoffset_size½«É¢ÂäÓÚdata.bufferÖеÄBinderÕÒ³öÀ´²¢Ò»Ò»ÎªËüÃÇ´´½¨Ïà¹ØµÄÊý¾Ý½á¹¹¡£ÔÚÊý¾Ý°üÖд«ÊäµÄBinderÊÇÀàÐÍΪstruct flat_binder_objectµÄ½á¹¹Ì壬Ïê¼ûºóÎÄ¡£

¶ÔÓÚ½ÓÊÕ·½À´Ëµ£¬¸Ã½á¹¹Ö»Ï൱ÓÚÒ»¸ö¶¨³¤µÄÏûϢͷ£¬ÕæÕýµÄÓû§Êý¾Ý´æ·ÅÔÚdata.bufferËùÖ¸ÏòµÄ»º´æÇøÖС£Èç¹û·¢ËÍ·½ÔÚÊý¾ÝÖÐÄÚǶÁËÒ»¸ö»ò¶à¸öBinder£¬½ÓÊÕµ½µÄÊý¾Ý°üÖÐͬÑù»áÓÃdata.offsetsºÍoffset_sizeÖ¸³öÿ¸öBinderµÄλÖúÍ×ܸöÊý¡£²»¹ýͨ³£½ÓÊÕ·½¿ÉÒÔºöÂÔÕâЩÐÅÏ¢£¬ÒòΪ½ÓÊÕ·½ÊÇÖªµÀÊý¾Ý¸ñʽµÄ£¬²Î¿¼Ë«·½Ô¼¶¨µÄ¸ñʽ¶¨Òå¾ÍÄÜÖªµÀÕâЩBinderÔÚʲôλÖá£

ͼ 2 BINDER_WRITE_READÊý¾Ý°üʵÀý

5 Binder µÄ±íÊö

¿¼²ìÒ»´ÎBinderͨÐŵÄÈ«¹ý³Ì»á·¢ÏÖ£¬Binder´æÔÚÓÚϵͳÒÔϼ¸¸ö²¿·ÖÖУº

¡¤ Ó¦ÓóÌÐò½ø³Ì£º·Ö±ðλÓÚServer½ø³ÌºÍClient½ø³ÌÖÐ

¡¤ BinderÇý¶¯£º·Ö±ð¹ÜÀíΪServer¶ËµÄBinderʵÌåºÍClient¶ËµÄÒýÓÃ

¡¤ ´«ÊäÊý¾Ý£ºÓÉÓÚBinder¿ÉÒÔ¿ç½ø³Ì´«µÝ£¬ÐèÒªÔÚ´«ÊäÊý¾ÝÖÐÓèÒÔ±íÊö

ÔÚϵͳ²»Í¬²¿·Ö£¬BinderʵÏֵŦÄܲ»Í¬£¬±íÏÖÐÎʽҲ²»Ò»Ñù¡£½ÓÏÂÀ´Öðһ̽ÌÖBinderÔÚ¸÷²¿·ÖËù°çÑݵĽÇÉ«ºÍʹÓõÄÊý¾Ý½á¹¹¡£

5.1 Binder ÔÚÓ¦ÓóÌÐòÖеıíÊö

ËäÈ»BinderÓõ½ÁËÃæÏò¶ÔÏóµÄ˼Ï룬µ«²¢²»ÏÞÖÆÓ¦ÓóÌÐòÒ»¶¨ÒªÊ¹ÓÃÃæÏò¶ÔÏóµÄÓïÑÔ£¬ÎÞÂÛÊÇCÓïÑÔ»¹ÊÇC++ÓïÑÔ¶¼¿ÉÒÔºÜÈÝÒ×µÄʹÓÃBinderÀ´Í¨ÐÅ¡£ÀýÈ羡¹ÜAndroidÖ÷ҪʹÓÃjava/C++£¬ÏóSMgrÕâÃ´ÖØÒªµÄ½ø³Ì¾ÍÊÇÓÃCÓïÑÔʵÏֵġ£²»¹ýÃæÏò¶ÔÏóµÄ·½Ê½±íÊöÆðÀ´¸ü·½±ã£¬ËùÒÔ±¾ÎļÙÉèÓ¦ÓóÌÐòÊÇÓÃÃæÏò¶ÔÏóÓïÑÔʵÏֵġ£

Binder±¾ÖÊÉÏÖ»ÊÇÒ»ÖֵײãͨÐÅ·½Ê½£¬ºÍ¾ßÌå·þÎñûÓйØÏµ¡£ÎªÁËÌṩ¾ßÌå·þÎñ£¬Server±ØÐëÌṩһÌ×½Ó¿Úº¯ÊýÒÔ±ãClientͨ¹ýÔ¶³Ì·ÃÎÊʹÓø÷ÖÖ·þÎñ¡£Õâʱͨ³£²ÉÓÃProxyÉè¼ÆÄ£Ê½£º½«½Ó¿Úº¯Êý¶¨ÒåÔÚÒ»¸ö³éÏóÀàÖУ¬ServerºÍClient¶¼»áÒԸóéÏóÀàΪ»ùÀàʵÏÖËùÓнӿں¯Êý£¬Ëù²»Í¬µÄÊÇServer¶ËÊÇÕæÕýµÄ¹¦ÄÜʵÏÖ£¬¶øClient¶ËÊǶÔÕâЩº¯ÊýÔ¶³Ìµ÷ÓÃÇëÇóµÄ°ü×°¡£ÈçºÎ½«BinderºÍProxyÉè¼ÆÄ£Ê½½áºÏÆðÀ´ÊÇÓ¦ÓóÌÐòʵÏÖÃæÏò¶ÔÏóBinderͨÐŵĸù±¾ÎÊÌâ¡£

5.1.1 Binder ÔÚServer¶ËµÄ±íÊö ¨C BinderʵÌå

×öΪProxyÉè¼ÆÄ£Ê½µÄ»ù´¡£¬Ê×Ïȶ¨ÒåÒ»¸ö³éÏó½Ó¿ÚÀà·â×°ServerËùÓй¦ÄÜ£¬ÆäÖаüº¬Ò»ÏµÁд¿Ð麯ÊýÁô´ýServerºÍProxy¸÷×ÔʵÏÖ¡£ÓÉÓÚÕâЩº¯ÊýÐèÒª¿ç½ø³Ìµ÷Óã¬ÐëΪÆäÒ»Ò»±àºÅ£¬´Ó¶øServer¿ÉÒÔ¸ù¾ÝÊÕµ½µÄ±àºÅ¾ö¶¨µ÷ÓÃÄĸöº¯Êý¡£Æä´Î¾ÍÒªÒýÈëBinderÁË¡£Server¶Ë¶¨ÒåÁíÒ»¸öBinder³éÏóÀà´¦ÀíÀ´×ÔClientµÄBinderÇëÇóÊý¾Ý°ü£¬ÆäÖÐ×îÖØÒªµÄ³ÉÔ±ÊÇÐ麯ÊýonTransact()¡£¸Ãº¯Êý·ÖÎöÊÕµ½µÄÊý¾Ý°ü£¬µ÷ÓÃÏàÓ¦µÄ½Ó¿Úº¯Êý´¦ÀíÇëÇó¡£

½ÓÏÂÀ´²ÉÓü̳з½Ê½ÒÔ½Ó¿ÚÀàºÍBinder³éÏóÀàΪ»ùÀ๹½¨BinderÔÚServerÖеÄʵÌ壬ʵÏÖ»ùÀàÀïËùÓеÄÐ麯Êý£¬°üÀ¨¹«¹²½Ó¿Úº¯ÊýÒÔ¼°Êý¾Ý°ü´¦Àíº¯Êý£ºonTransact()¡£Õâ¸öº¯ÊýµÄÊäÈëÊÇÀ´×ÔClientµÄbinder _transaction_data½á¹¹µÄÊý¾Ý°ü¡£Ç°ÃæÌáµ½£¬¸Ã½á¹¹ÀïÓиö³ÉÔ±code£¬°üº¬Õâ´ÎÇëÇóµÄ½Ó¿Úº¯Êý±àºÅ¡£onTransact()½«case-by-caseµØ½âÎöcodeÖµ£¬´ÓÊý¾Ý°üÀïÈ¡³öº¯Êý²ÎÊý£¬µ÷ÓýӿÚÀàÖÐÏàÓ¦µÄ£¬ÒѾ­ÊµÏֵĹ«¹²½Ó¿Úº¯Êý¡£º¯ÊýÖ´ÐÐÍê±Ï£¬Èç¹ûÐèÒª·µ»ØÊý¾Ý¾ÍÔÙ¹¹½¨Ò»¸öbinder_transaction_data°ü½«·µ»ØÊý¾Ý°üÌîÈëÆäÖС£

ÄÇô¸÷¸öBinderʵÌåµÄonTransact()ÓÖÊÇʲôʱºòµ÷ÓÃÄØ£¿Õâ¾ÍÐèÒªÇý¶¯²ÎÓëÁË¡£Ç°ÃæËµ¹ý£¬BinderʵÌåÐëÒªÒÔBinde´«Êä½á¹¹flat_binder_objectÐÎʽ·¢Ë͸øÆäËü½ø³Ì²ÅÄܽ¨Á¢BinderͨÐÅ£¬¶øBinderʵÌåÖ¸Õë¾Í´æ·ÅÔڸýṹµÄhandleÓòÖС£Çý¶¯¸ù¾ÝBinderλÖÃÊý×é´Ó´«ÊäÊý¾ÝÖлñÈ¡¸ÃBinderµÄ´«Êä½á¹¹£¬ÎªËü´´½¨Î»ÓÚÄÚºËÖеÄBinder½Úµã£¬½«BinderʵÌåÖ¸Õë¼Ç¼ÔڸýڵãÖС£Èç¹û½ÓÏÂÀ´ÓÐÆäËü½ø³ÌÏò¸ÃBinder·¢ËÍÊý¾Ý£¬Çý¶¯»á¸ù¾Ý½ÚµãÖмǼµÄÐÅÏ¢½«BinderʵÌåÖ¸ÕëÌîÈëbinder_transaction_dataµÄtarget.ptrÖзµ»Ø¸ø½ÓÊÕÏ̡߳£½ÓÊÕÏ̴߳ÓÊý¾Ý°üÖÐÈ¡³ö¸ÃÖ¸Õ룬reinterpret_cast³ÉBinder³éÏóÀಢµ÷ÓÃonTransact()º¯Êý¡£ÓÉÓÚÕâÊǸöÐ麯Êý£¬²»Í¬µÄBinderʵÌåÖÐÓи÷×ÔµÄʵÏÖ£¬´Ó¶ø¿ÉÒÔµ÷Óõ½²»Í¬BinderʵÌåÌṩµÄonTransact()¡£

5.1.2 Binder ÔÚClient¶ËµÄ±íÊö ¨C BinderÒýÓÃ

×öΪProxyÉè¼ÆÄ£Ê½µÄÒ»²¿·Ö£¬Client¶ËµÄBinderͬÑùÒª¼Ì³ÐServerÌṩµÄ¹«¹²½Ó¿ÚÀಢʵÏÖ¹«¹²º¯Êý¡£µ«Õâ²»ÊÇÕæÕýµÄʵÏÖ£¬¶øÊǶÔÔ¶³Ìº¯Êýµ÷Óõİü×°£º½«º¯Êý²ÎÊý´ò°ü£¬Í¨¹ýBinderÏòServer·¢ËÍÉêÇë²¢µÈ´ý·µ»ØÖµ¡£Îª´ËClient¶ËµÄBinder»¹ÒªÖªµÀBinderʵÌåµÄÏà¹ØÐÅÏ¢£¬¼´¶ÔBinderʵÌåµÄÒýÓ᣸ÃÒýÓûòÊÇÓÉSMgrת·¢¹ýÀ´µÄ£¬¶ÔʵÃûBinderµÄÒýÓûòÊÇÓÉÁíÒ»¸ö½ø³ÌÖ±½Ó·¢Ë͹ýÀ´µÄ£¬¶ÔÄäÃûBinderµÄÒýÓá£

ÓÉÓڼ̳ÐÁËͬÑùµÄ¹«¹²½Ó¿ÚÀ࣬Client BinderÌṩÁËÓëServer BinderÒ»ÑùµÄº¯ÊýÔ­ÐÍ£¬Ê¹Óû§¸Ð¾õ²»³öServerÊÇÔËÐÐÔÚ±¾µØ»¹ÊÇÔ¶¶Ë¡£Client BinderÖУ¬¹«¹²½Ó¿Úº¯ÊýµÄ°ü×°·½Ê½ÊÇ£º´´½¨Ò»¸öbinder_transaction_dataÊý¾Ý°ü£¬½«Æä¶ÔÓ¦µÄ±àÂëÌîÈëcodeÓò£¬½«µ÷Óøú¯ÊýËùÐèµÄ²ÎÊýÌîÈëdata.bufferÖ¸ÏòµÄ»º´æÖУ¬²¢Ö¸Ã÷Êý¾Ý°üµÄÄ¿µÄµØ£¬ÄǾÍÊÇÒѾ­»ñµÃµÄ¶ÔBinderʵÌåµÄÒýÓã¬ÌîÈëÊý¾Ý°üµÄtarget.handleÖС£×¢ÒâÕâÀïºÍServerµÄÇø±ð£ºÊµ¼ÊÉÏtargetÓòÊǸöÁªºÏÌ壬°üÀ¨ptrºÍhandleÁ½¸ö³ÉÔ±£¬Ç°ÕßÓÃÓÚ½ÓÊÕÊý¾Ý°üµÄServer£¬Ö¸Ïò BinderʵÌå¶ÔÓ¦µÄÄÚ´æ¿Õ¼ä£»ºóÕßÓÃÓÚ×÷ΪÇëÇó·½µÄClient£¬´æ·ÅBinderʵÌåµÄÒýÓ㬸æÖªÇý¶¯Êý¾Ý°ü½«Â·ÓɸøÄĸöʵÌå¡£Êý¾Ý°ü×¼±¸ºÃºó£¬Í¨¹ýÇý¶¯½Ó¿Ú·¢ËͳöÈ¥¡£¾­¹ýBC_TRANSACTION/BC_REPLY»ØºÏÍê³Éº¯ÊýµÄÔ¶³Ìµ÷Óò¢µÃµ½·µ»ØÖµ¡£

5.2 Binder ÔÚ´«ÊäÊý¾ÝÖеıíÊö

Binder¿ÉÒÔÈûÔÚÊý¾Ý°üµÄÓÐЧÊý¾ÝÖÐÔ½½ø³Ì±ß½ç´ÓÒ»¸ö½ø³Ì´«µÝ¸øÁíÒ»¸ö½ø³Ì£¬ÕâЩ´«ÊäÖеÄBinderÓýṹflat_binder_object±íʾ£¬ÈçϱíËùʾ£º

±í 6 Binder´«Êä½á¹¹£ºflat_binder_object

³ÉÔ± º¬Òå
unsigned long type

 

±íÃ÷¸ÃBinderµÄÀàÐÍ£¬°üÀ¨ÒÔϼ¸ÖÖ£º

BINDER_TYPE_BINDER£º±íʾ´«µÝµÄÊÇBinderʵÌ壬²¢ÇÒÖ¸Ïò¸ÃʵÌåµÄÒýÓö¼ÊÇÇ¿ÀàÐÍ£»

BINDER_TYPE_WEAK_BINDER£º±íʾ´«µÝµÄÊÇBinderʵÌ壬²¢ÇÒÖ¸Ïò¸ÃʵÌåµÄÒýÓö¼ÊÇÈõÀàÐÍ£»

BINDER_TYPE_HANDLE£º±íʾ´«µÝµÄÊÇBinderÇ¿ÀàÐ͵ÄÒýÓÃ

BINDER_TYPE_WEAK_HANDLE£º±íʾ´«µÝµÄÊÇBinderÈõÀàÐ͵ÄÒýÓÃ

BINDER_TYPE_FD£º±íʾ´«µÝµÄÊÇÎļþÐÎʽµÄBinder£¬Ïê¼ûϽÚ

 

unsigned long flags ¸ÃÓòÖ»¶ÔµÚÒ»´Î´«µÝBinderʵÌåʱÓÐЧ£¬ÒòΪ´Ë¿ÌÇý¶¯ÐèÒªÔÚÄÚºËÖд´½¨ÏàÓ¦µÄʵÌå½Úµã£¬ÓÐЩ²ÎÊýÐèÒª´Ó¸ÃÓòÈ¡³ö£º

µÚ0-7λ£º´úÂëÖÐÓÃFLAT_BINDER_FLAG_PRIORITY_MASKÈ¡µÃ£¬±íʾ´¦Àí±¾ÊµÌåÇëÇóÊý¾Ý°üµÄÏ̵߳Ä×îµÍÓÅÏȼ¶¡£µ±Ò»¸öÓ¦ÓóÌÐòÌṩ¶à¸öʵÌåʱ£¬¿ÉÒÔͨ¹ý¸Ã²ÎÊýµ÷Õû·ÖÅ䏸¸÷¸öʵÌåµÄ´¦ÀíÄÜÁ¦¡£

µÚ8λ£º´úÂëÖÐÓÃFLAT_BINDER_FLAG_ACCEPTS_FDSÈ¡µÃ£¬ÖÃ1±íʾ¸ÃʵÌå¿ÉÒÔ½ÓÊÕÆäËü½ø³Ì·¢¹ýÀ´µÄÎļþÐÎʽµÄBinder¡£ÓÉÓÚ½ÓÊÕÎļþÐÎʽµÄBinder»áÔÚ±¾½ø³ÌÖÐ×Ô¶¯´ò¿ªÎļþ£¬ÓÐЩServer¿ÉÒÔÓøñêÖ¾½ûÖ¹¸Ã¹¦ÄÜ£¬ÒÔ·À´ò¿ª¹ý¶àÎļþ¡£

union {
void *binder;

signed long handle;

};

µ±´«µÝµÄÊÇBinderʵÌåʱʹÓÃbinderÓò£¬Ö¸ÏòBinderʵÌåÔÚÓ¦ÓóÌÐòÖеĵØÖ·¡£

µ±´«µÝµÄÊÇBinderÒýÓÃʱʹÓÃhandleÓò£¬´æ·ÅBinderÔÚ½ø³ÌÖеÄÒýÓúš£

void *cookie; ¸ÃÓòÖ»¶ÔBinderʵÌåÓÐЧ£¬´æ·ÅÓë¸ÃBinderÓйصĸ½¼ÓÐÅÏ¢¡£

ÎÞÂÛÊÇBinderʵÌ廹ÊǶÔʵÌåµÄÒýÓö¼´ÓÊôÓëij¸ö½ø³Ì£¬ËùÒԸýṹ²»ÄÜ͸Ã÷µØÔÚ½ø³ÌÖ®¼ä´«Ê䣬±ØÐë¾­¹ýÇý¶¯·­Òë¡£ÀýÈçµ±Server°ÑBinderʵÌå´«µÝ¸øClientʱ£¬ÔÚ·¢ËÍÊý¾ÝÁ÷ÖУ¬flat_binder_object ÖеÄtypeÊÇBINDER_TYPE_BINDER£¬binderÖ¸ÏòServer½ø³ÌÓû§¿Õ¼äµØÖ·¡£Èç¹û͸´«¸ø½ÓÊն˽«ºÁÎÞÓô¦£¬Çý¶¯±ØÐë¶ÔÊý¾ÝÁ÷ÖеÄÕâ¸öBinder×öÐ޸ģº½«type¸Ã³ÉBINDER_TYPE_HANDLE£»ÎªÕâ¸öBinderÔÚ½ÓÊÕ½ø³ÌÖд´½¨Î»ÓÚÄÚºËÖеÄÒýÓò¢½«ÒýÓúÅÌîÈëhandleÖС£¶ÔÓÚ·¢ÉúÊý¾ÝÁ÷ÖÐÒýÓÃÀàÐ͵ÄBinderÒ²Òª×öͬÑùת»»¡£¾­¹ý´¦Àíºó½ÓÊÕ½ø³Ì´ÓÊý¾ÝÁ÷ÖÐÈ¡µÃµÄBinderÒýÓòÅÊÇÓÐЧµÄ£¬²Å¿ÉÒÔ½«ÆäÌîÈëÊý¾Ý°übinder_transaction_dataµÄ target.handleÓò£¬ÏòBinderʵÌå·¢ËÍÇëÇó¡£

ÕâÑù×öÒ²ÊdzöÓÚ°²È«ÐÔ¿¼ÂÇ£ºÓ¦ÓóÌÐò²»ÄÜËæ±ã²Â²âÒ»¸öÒýÓúÅÌîÈëtarget.handleÖоͿÉÒÔÏòServerÇëÇó·þÎñÁË£¬ÒòΪÇý¶¯²¢Ã»ÓÐΪÄãÔÚÄÚºËÖд´½¨¸ÃÒýÓ㬱ض¨»á±»Çý¶¯¾Ü¾ø¡£Î¨Óо­¹ýÉí·ÝÈÏ֤ȷÈϺϷ¨ºó£¬ÓÉ¡®È¨Íþ»ú¹¹¡¯£¨BinderÇý¶¯£©Ç×ÊÖÊÚÓèÄãµÄBinder²ÅÄÜʹÓã¬ÒòΪÕâʱÇý¶¯ÒѾ­ÔÚÄÚºËÖÐΪÄãʹÓøÃBinder×öÁË×¢²á£¬½»¸øÄãµÄÒýÓúÅÊǺϷ¨µÄ¡£

ϱí×ܽáÁ˵±flat_binder_object½á¹¹´©¹ýÇý¶¯Ê±Çý¶¯Ëù×öµÄ²Ù×÷£º

±í 7 Çý¶¯¶Ôflat_binder_objectµÄ²Ù×÷

Binder ÀàÐÍ£¨typeÓò£© ÔÚ·¢ËÍ·½µÄ²Ù×÷ ÔÚ½ÓÊÕ·½µÄ²Ù×÷
BINDER_TYPE_BINDER

BINDER_TYPE_WEAK_BINDER

Ö»ÓÐʵÌåËùÔڵĽø³ÌÄÜ·¢Ë͸ÃÀàÐ͵ÄBinder¡£Èç¹ûÊǵÚÒ»´Î·¢ËÍÇý¶¯½«´´½¨ÊµÌåÔÚÄÚºËÖеĽڵ㣬²¢±£´æbinder£¬cookie£¬flagÓò¡£ Èç¹ûÊǵÚÒ»´Î½ÓÊÕ¸ÃBinderÔò´´½¨ÊµÌåÔÚÄÚºËÖеÄÒýÓ㻽«handleÓòÌæ»»ÎªÐ½¨µÄÒýÓúţ»½«typeÓòÌæ»»ÎªBINDER_TYPE_(WEAK_)HANDLE

 

BINDER_TYPE_HANDLE

BINDER_TYPE_WEAK_HANDLE

»ñµÃBinderÒýÓõĽø³Ì¶¼ÄÜ·¢Ë͸ÃÀàÐÍBinder¡£Çý¶¯¸ù¾ÝhandleÓòÌṩµÄÒýÓúŲéÕÒ½¨Á¢ÔÚÄں˵ÄÒýÓá£Èç¹ûÕÒµ½ËµÃ÷ÒýÓúźϷ¨£¬·ñÔò¾Ü¾ø¸Ã·¢ËÍÇëÇó¡£ Èç¹ûÊÕµ½µÄBinderʵÌåλÓÚ½ÓÊÕ½ø³ÌÖУº½«ptrÓòÌæ»»Îª±£´æÔÚ½ÚµãÖеÄbinderÖµ£»cookieÌæ»»Îª±£´æÔÚ½ÚµãÖеÄcookieÖµ£»typeÌæ»»ÎªBINDER_TYPE_ (WEAK_)BINDER¡£

Èç¹ûÊÕµ½µÄBinderʵÌå²»ÔÚ½ÓÊÕ½ø³ÌÖУºÈç¹ûÊǵÚÒ»´Î½ÓÊÕÔò´´½¨ÊµÌåÔÚÄÚºËÖеÄÒýÓ㻽«handleÓòÌæ»»ÎªÐ½¨µÄÒýÓúÅ

BINDER_TYPE_FD ÑéÖ¤handleÓòÖÐÌṩµÄ´ò¿ªÎļþºÅÊÇ·ñÓÐЧ£¬ÎÞЧÔò¾Ü¾ø¸Ã·¢ËÍÇëÇó¡£ ÔÚ½ÓÊÕ·½´´½¨ÐµĴò¿ªÎļþºÅ²¢½«ÆäÓëÌṩµÄ´ò¿ªÎļþÃèÊö½á¹¹°ó¶¨¡£

5.2.1 ÎļþÐÎʽµÄ Binder

³ýÁËͨ³£ÒâÒåÉÏÓÃÀ´Í¨ÐŵÄBinder£¬»¹ÓÐÒ»ÖÖÌØÊâµÄBinder£ºÎļþBinder¡£ÕâÖÖBinderµÄ»ù±¾Ë¼ÏëÊÇ£º½«Îļþ¿´³ÉBinderʵÌ壬½ø³Ì´ò¿ªµÄÎļþºÅ¿´³ÉBinderµÄÒýÓá£Ò»¸ö½ø³Ì¿ÉÒÔ½«Ëü´ò¿ªÎļþµÄÎļþºÅ´«µÝ¸øÁíÒ»¸ö½ø³Ì£¬´Ó¶øÁíÒ»¸ö½ø³ÌÒ²´ò¿ªÁËͬһ¸öÎļþ£¬¾ÍÏóBinderµÄÒýÓÃÔÚ½ø³ÌÖ®¼ä´«µÝÒ»Ñù¡£

Ò»¸ö½ø³Ì´ò¿ªÒ»¸öÎļþ£¬¾Í»ñµÃÓë¸ÃÎļþ°ó¶¨µÄ´ò¿ªÎļþºÅ¡£´ÓBinderµÄ½Ç¶È£¬linuxÔÚÄں˴´½¨µÄ´ò¿ªÎļþÃèÊö½á¹¹struct fileÊÇBinderµÄʵÌ壬´ò¿ªÎļþºÅÊǸýø³Ì¶Ô¸ÃʵÌåµÄÒýÓ᣼ÈÈ»ÊÇBinderÄÇô¾Í¿ÉÒÔÔÚ½ø³ÌÖ®¼ä´«µÝ£¬¹ÊÒ²¿ÉÒÔÓÃflat_binder_object½á¹¹½«ÎļþBinderͨ¹ýÊý¾Ý°ü·¢ËÍÖÁÆäËü½ø³Ì£¬Ö»ÊǽṹÖÐtypeÓòµÄֵΪBINDER_TYPE_FD£¬±íÃ÷¸ÃBinderÊÇÎļþBinder¡£¶ø½á¹¹ÖеÄhandleÓòÔò´æ·ÅÎļþÔÚ·¢ËÍ·½½ø³ÌÖеĴò¿ªÎļþºÅ¡£ÎÒÃÇÖªµÀ´ò¿ªÎļþºÅÊǸö¾ÖÏÞÓÚij¸ö½ø³ÌµÄÖµ£¬Ò»µ©¿ç½ø³Ì¾ÍûÓÐÒâÒåÁË¡£ÕâÒ»µãºÍBinderʵÌåÓû§Ö¸Õë»òBinderÒýÓúÅÊÇÒ»ÑùµÄ£¬ÈôÒª¿ç½ø³ÌͬÑùÐèÒªÇý¶¯×öת»»¡£Çý¶¯ÔÚ½ÓÊÕBinderµÄ½ø³Ì¿Õ¼ä´´½¨Ò»¸öеĴò¿ªÎļþºÅ£¬½«ËüÓëÒÑÓеĴò¿ªÎļþÃèÊö½á¹¹struct file¹´Á¬ÉÏ£¬´Ó´Ë¸ÃBinderʵÌåÓÖ¶àÁËÒ»¸öÒýÓá£Ð½¨µÄ´ò¿ªÎļþºÅ¸²¸Çflat_binder_objectÖÐÔ­À´µÄÎļþºÅ½»¸ø½ÓÊÕ½ø³Ì¡£½ÓÊÕ½ø³ÌÀûÓÃËü¿ÉÒÔÖ´ÐÐread()£¬write()µÈÎļþ²Ù×÷¡£

´«¸öÎļþΪɶҪÕâôÂé·³£¬Ö±½Ó½«ÎļþÃûÓÃBinder´«¹ýÈ¥£¬½ÓÊÕ·½ÓÃopen()´ò¿ª²»¾ÍÐÐÁËÂð£¿ÆäʵÕ⻹ÊÇÓÐÇø±ðµÄ¡£Ê×ÏȶÔͬһ¸ö´ò¿ªÎļþ¹²ÏíµÄ²ã´Î²»Í¬£ºÊ¹ÓÃÎļþBinder´ò¿ªµÄÎļþ¹²Ïílinux VFSÖеÄstruct file£¬struct dentry£¬struct inode½á¹¹£¬ÕâÒâζ×ÅÒ»¸ö½ø³ÌʹÓÃread()/write()/seek()¸Ä±äÁËÎļþÖ¸Õ룬ÁíÒ»¸ö½ø³ÌµÄÎļþÖ¸ÕëÒ²»á¸Ä±ä£»¶øÈç¹ûÁ½¸ö½ø³Ì·Ö±ðʹÓÃͬһÎļþÃû´ò¿ªÎļþÔòÓи÷×ÔµÄstruct file½á¹¹£¬´Ó¶ø¸÷×Ô¶ÀÁ¢Î¬»¤ÎļþÖ¸Õ룬»¥²»¸ÉÈÅ¡£Æä´ÎÊÇÒ»Ð©ÌØÊâÉ豸ÎļþÒªÇóÔÚstruct fileÒ»¼¶¹²Ïí²ÅÄÜʹÓã¬ÀýÈçandroidµÄÁíÒ»¸öÇý¶¯ashmem£¬ËüºÍBinderÒ»ÑùÒ²ÊÇmiscÉ豸£¬ÓÃÒÔʵÏÖ½ø³Ì¼äµÄ¹²ÏíÄÚ´æ¡£Ò»¸ö½ø³Ì´ò¿ªµÄashmemÎļþÖ»ÓÐͨ¹ýÎļþBinder·¢Ë͵½ÁíÒ»¸ö½ø³Ì²ÅÄÜʵÏÖÄÚ´æ¹²Ïí£¬Õâ´ó´óÌá¸ßÁËÄÚ´æ¹²ÏíµÄ°²È«ÐÔ£¬µÀÀíºÍBinderÔöÇ¿ÁËIPCµÄ°²È«ÐÔÊÇÒ»ÑùµÄ¡£

5.3 Binder ÔÚÇý¶¯ÖеıíÊö

Çý¶¯ÊÇBinderͨÐŵĺËÐÄ£¬ÏµÍ³ÖÐËùÓеÄBinderʵÌåÒÔ¼°Ã¿¸öʵÌåÔÚ¸÷¸ö½ø³ÌÖеÄÒýÓö¼µÇ¼ÇÔÚÇý¶¯ÖУ»Çý¶¯ÐèÒª¼Ç¼BinderÒýÓÃ->ʵÌåÖ®¼ä¶à¶ÔÒ»µÄ¹ØÏµ£»ÎªÒýÓÃÕÒµ½¶ÔÓ¦µÄʵÌ壻ÔÚij¸ö½ø³ÌÖÐΪʵÌå´´½¨»ò²éÕÒµ½¶ÔÓ¦µÄÒýÓ㻼ǼBinderµÄ¹éÊôµØ£¨Î»ÓÚÄĸö½ø³ÌÖУ©£»Í¨¹ý¹ÜÀíBinderµÄÇ¿/ÈõÒýÓô´½¨/Ïú»ÙBinderʵÌåµÈµÈ¡£

Çý¶¯ÀïµÄBinderÊÇʲôʱºò´´½¨µÄÄØ£¿Ç°ÃæÌáµ½¹ý£¬ÎªÁËʵÏÖʵÃûBinderµÄ×¢²á£¬ÏµÍ³±ØÐë´´½¨µÚÒ»Ö»¼¦¨CΪSMgr´´½¨µÄ£¬ÓÃÓÚ×¢²áʵÃûBinderµÄBinderʵÌ壬¸ºÔðʵÃûBinder×¢²á¹ý³ÌÖеĽø³Ì¼äͨÐÅ¡£¼ÈÈ»´´½¨ÁËʵÌå¾ÍÒªÓжÔÓ¦µÄÒýÓãºÇý¶¯½«ËùÓнø³ÌÖеÄ0ºÅÒýÓö¼Ô¤Áô¸ø¸ÃBinderʵÌ壬¼´ËùÓнø³ÌµÄ0ºÅÒýÓÃÌìÈ»µØ¶¼Ö¸Ïò×¢²áʵÃûBinderרÓõÄBinder£¬ÎÞÐëÌØÊâ²Ù×÷¼´¿ÉÒÔʹÓÃ0ºÅÒýÓÃÀ´×¢²áʵÃûBinder¡£½ÓÏÂÀ´Ëæ×ÅÓ¦ÓóÌÐò²»¶ÏµØ×¢²áʵÃûBinder£¬²»¶ÏÏòSMgrË÷ÒªBinderµÄÒýÓ㬲»¶Ï½«Binder´ÓÒ»¸ö½ø³Ì´«µÝ¸øÁíÒ»¸ö½ø³Ì£¬Ô½À´Ô½¶àµÄBinderÒÔ´«Êä½á¹¹ - flat_binder_objectµÄÐÎʽ´©Ô½Çý¶¯×ö¿ç½ø³ÌµÄǨáã¡£ÓÉÓÚbinder_transaction_data ÖÐdata.offsetÊý×éµÄ´æÔÚ£¬ËùÓÐÁ÷¾­Çý¶¯µÄBinder¶¼ÌÓ²»¹ýÇý¶¯µÄÑÛ¾¦¡£Binder½«¶ÔÕâЩ´©Ô½½ø³Ì±ß½çµÄBinder×öÈçϲÙ×÷£º¼ì²é´«Êä½á¹¹µÄtypeÓò£¬Èç¹ûÊÇBINDER_TYPE_BINDER»ò BINDER_TYPE_WEAK_BINDERÔò´´½¨BinderµÄʵÌ壻Èç¹ûÊÇBINDER_TYPE_HANDLE»òBINDER_TYPE_WEAK_HANDLEÔò´´½¨BinderµÄÒýÓã»Èç¹ûÊÇBINDER_TYPE_HANDLEÔòΪ½ø³Ì´ò¿ªÎļþ£¬ÎÞÐë´´½¨ÈκÎÊý¾Ý½á¹¹¡£Ïêϸ¹ý³Ì¿É²Î¿¼±í7¡£Ëæ×ÅÔ½À´Ô½¶àµÄBinderʵÌå»òÒýÓÃÔÚ½ø³Ì¼ä´«µÝ£¬Çý¶¯»áÔÚÄÚºËÀï´´½¨Ô½À´Ô½¶àµÄ½Úµã»òÒýÓ㬵±È»Õâ¸ö¹ý³Ì¶ÔÓû§À´ËµÊÇ͸Ã÷µÄ¡£

5.3.1 Binder ʵÌåÔÚÇý¶¯ÖеıíÊö

Çý¶¯ÖеÄBinderʵÌåÒ²½Ð¡®½Úµã¡¯£¬Á¥ÊôÓÚÌṩʵÌåµÄ½ø³Ì£¬ÓÉstruct binder_node½á¹¹À´±íʾ£º

±í 8 Binder½ÚµãÃèÊö½á¹¹£ºbinder_node

³ÉÔ± º¬Òå
int debug_id;

 

ÓÃÓÚµ÷ÊÔ

 

 

struct binder_work work;
µ±±¾½ÚµãÒýÓüÆÊý·¢Éú¸Ä±ä£¬ÐèҪ֪ͨËùÊô½ø³Ìʱ£¬Í¨¹ý¸Ã³ÉÔ±¹ÒÈëËùÊô½ø³ÌµÄto-do¶ÓÁÐÀ»½ÐÑËùÊô½ø³ÌÖ´ÐÐBinderʵÌåÒýÓüÆÊýµÄÐ޸ġ£

 

union {
struct rb_node rb_node;

struct hlist_node dead_node;

};

 

ÿ¸ö½ø³Ì¶¼Î¬»¤Ò»¿ÃºìºÚÊ÷£¬ÒÔBinderʵÌåÔÚÓû§¿Õ¼äµÄÖ¸Õ룬¼´±¾½á¹¹µÄptr³ÉԱΪË÷Òý´æ·Å¸Ã½ø³ÌËùÓеÄBinderʵÌå¡£ÕâÑùÇý¶¯¿ÉÒÔ¸ù¾ÝBinderʵÌåÔÚÓû§¿Õ¼äµÄÖ¸ÕëºÜ¿ìÕÒµ½ÆäλÓÚÄں˵Ľڵ㡣rb_nodeÓÃÓÚ½«±¾½ÚµãÁ´Èë¸ÃºìºÚÊ÷ÖС£

Ïú»Ù½ÚµãʱÐ뽫rb_node´ÓºìºÚÊ÷ÖÐÕª³ý£¬µ«Èç¹û±¾½Úµã»¹ÓÐÒýÓÃûÓÐÇжϣ¬¾ÍÓÃdead_node½«½Úµã¸ôÀëµ½ÁíÒ»¸öÁ´±íÖУ¬Ö±µ½Í¨ÖªËùÓнø³ÌÇжÏÓë¸Ã½ÚµãµÄÒýÓú󣬸ýڵã²Å¿ÉÄܱ»Ïú»Ù¡£

 

struct binder_proc *proc; ±¾³ÉÔ±Ö¸Ïò½ÚµãËùÊôµÄ½ø³Ì£¬¼´Ìṩ¸Ã½ÚµãµÄ½ø³Ì¡£
struct hlist_head refs; ±¾³ÉÔ±ÊǶÓÁÐÍ·£¬ËùÓÐÖ¸Ïò±¾½ÚµãµÄÒýÓö¼Á´½ÓÔڸöÓÁÐÀï¡£ÕâЩÒýÓÿÉÄÜÁ¥ÊôÓÚ²»Í¬µÄ½ø³Ì¡£Í¨¹ý¸Ã¶ÓÁпÉÒÔ±éÀúÖ¸Ïò¸Ã½ÚµãµÄËùÓÐÒýÓá£
int internal_strong_refs; ÓÃÒÔʵÏÖǿָÕëµÄ¼ÆÊýÆ÷£º²úÉúÒ»¸öÖ¸Ïò±¾½ÚµãµÄÇ¿ÒýÓøüÆÊý¾Í»á¼Ó1¡£
int local_weak_refs; Çý¶¯Îª´«ÊäÖеÄBinderÉèÖõÄÈõÒýÓüÆÊý¡£Èç¹ûÒ»¸öBinder´ò°üÔÚÊý¾Ý°üÖдÓÒ»¸ö½ø³Ì·¢Ë͵½ÁíÒ»¸ö½ø³Ì£¬Çý¶¯»áΪ¸ÃBinderÔö¼ÓÒýÓüÆÊý£¬Ö±µ½½ÓÊÕ½ø³Ìͨ¹ýBC_FREE_BUFFER֪ͨÇý¶¯ÊͷŸÃÊý¾Ý°üµÄÊý¾ÝÇøÎªÖ¹¡£
int local_strong_refs; Çý¶¯Îª´«ÊäÖеÄBinderÉèÖõÄÇ¿ÒýÓüÆÊý¡£Í¬ÉÏ¡£
void __user *ptr; Ö¸ÏòÓû§¿Õ¼äBinderʵÌåµÄÖ¸Õ룬À´×ÔÓÚflat_binder_objectµÄ binder³ÉÔ±
void __user *cookie; Ö¸ÏòÓû§¿Õ¼äµÄ¸½¼ÓÖ¸Õ룬À´×ÔÓÚflat_binder_objectµÄ cookie³ÉÔ±
nsigned has_strong_ref;

unsigned pending_strong_ref;

unsigned has_weak_ref;

unsigned pending_weak_ref

ÕâÒ»×é±êÖ¾ÓÃÓÚ¿ØÖÆÇý¶¯ÓëBinderʵÌåËùÔÚ½ø³Ì½»»¥Ê½ÐÞ¸ÄÒýÓüÆÊý
unsigned has_async_transaction£» ¸Ã³ÉÔ±±íÃ÷¸Ã½ÚµãÔÚto-do¶ÓÁÐÖÐÓÐÒì²½½»»¥ÉÐδÍê³É¡£Çý¶¯½«ËùÓз¢ËÍÍù½ÓÊն˵ÄÊý¾Ý°üÔÝ´æÔÚ½ÓÊÕ½ø³Ì»òÏ߳̿ª±ÙµÄto-do¶ÓÁÐÀï¡£¶ÔÓÚÒì²½½»»¥£¬Çý¶¯×öÁËÊʵ±Á÷¿Ø£ºÈç¹ûto-do¶ÓÁÐÀïÓÐÒì²½½»»¥Éдý´¦ÀíÔò¸Ã³ÉÔ±ÖÃ1£¬Õ⽫µ¼ÖÂе½µÄÒì²½½»»¥´æ·ÅÔÚ±¾½á¹¹³ÉÔ± ¨C asynch_todo¶ÓÁÐÖУ¬¶ø²»Ö±½ÓË͵½to-do¶ÓÁÐÀĿµÄÊÇΪͬ²½½»»¥È÷£¬±ÜÃⳤʱ¼ä×èÈû·¢ËͶˡ£
unsigned accept_fds ±íÃ÷½ÚµãÊÇ·ñͬÒâ½ÓÊÜÎļþ·½Ê½µÄBinder£¬À´×Ôflat_binder_objectÖÐflags³ÉÔ±µÄFLAT_BINDER_FLAG_ACCEPTS_FDS λ¡£ÓÉÓÚ½ÓÊÕÎļþBinder»áΪ½ø³Ì×Ô¶¯´ò¿ªÒ»¸öÎļþ£¬Õ¼ÓÃÓÐÏÞµÄÎļþÃèÊö·û£¬½Úµã¿ÉÒÔÉèÖøÃλ¾Ü¾øÕâÖÖÐÐΪ¡£
int min_priority ÉèÖô¦ÀíBinderÇëÇóµÄÏ̵߳Ä×îµÍÓÅÏȼ¶¡£·¢ËÍÏ߳̽«Êý¾ÝÌá½»¸ø½ÓÊÕÏ̴߳¦Àíʱ£¬Çý¶¯»á½«·¢ËÍÏ̵߳ÄÓÅÏȼ¶Ò²¸³Óè½ÓÊÕỊ̈߳¬Ê¹µÃÊý¾Ý¼´Ê¹¿çÁ˽ø³ÌÒ²ÄÜÒÔͬÑùÓÅÏȼ¶µÃµ½´¦Àí¡£²»¹ýÈç¹û·¢ËÍÏß³ÌÓÅÏȼ¶¹ýµÍ£¬½ÓÊÕÏ߳̽«ÒÔÔ¤ÉèµÄ×îСֵÔËÐС£

¸ÃÓòµÄÖµÀ´×ÔÓÚ flat_binder_object ÖÐflags³ÉÔ±¡£

struct list_head async_todo Òì²½½»»¥µÈ´ý¶ÓÁУ»ÓÃÓÚ·ÖÁ÷·¢Íù±¾½ÚµãµÄÒì²½½»»¥°ü

 

ÿ¸ö½ø³Ì¶¼Î¬»¤Ò»¿ÃºìºÚÊ÷£¬ÒÔBinderʵÌåÔÚÓû§¿Õ¼äµÄÖ¸Õ룬¼´±¾½á¹¹µÄptr³ÉԱΪË÷Òý´æ·Å¸Ã½ø³ÌËùÓеÄBinderʵÌå¡£ÕâÑùÇý¶¯¿ÉÒÔ¸ù¾ÝBinderʵÌåÔÚÓû§¿Õ¼äµÄÖ¸ÕëºÜ¿ìÕÒµ½ÆäλÓÚÄں˵Ľڵ㡣rb_nodeÓÃÓÚ½«±¾½ÚµãÁ´Èë¸ÃºìºÚÊ÷ÖС£

Ïú»Ù½ÚµãʱÐ뽫rb_node´ÓºìºÚÊ÷ÖÐÕª³ý£¬µ«Èç¹û±¾½Úµã»¹ÓÐÒýÓÃûÓÐÇжϣ¬¾ÍÓÃdead_node½«½Úµã¸ôÀëµ½ÁíÒ»¸öÁ´±íÖУ¬Ö±µ½Í¨ÖªËùÓнø³ÌÇжÏÓë¸Ã½ÚµãµÄÒýÓú󣬸ýڵã²Å¿ÉÄܱ»Ïú»Ù¡£

struct binder_proc *proc;

±¾³ÉÔ±Ö¸Ïò½ÚµãËùÊôµÄ½ø³Ì£¬¼´Ìṩ¸Ã½ÚµãµÄ½ø³Ì¡£

struct hlist_head refs;

±¾³ÉÔ±ÊǶÓÁÐÍ·£¬ËùÓÐÖ¸Ïò±¾½ÚµãµÄÒýÓö¼Á´½ÓÔڸöÓÁÐÀï¡£ÕâЩÒýÓÿÉÄÜÁ¥ÊôÓÚ²»Í¬µÄ½ø³Ì¡£Í¨¹ý¸Ã¶ÓÁпÉÒÔ±éÀúÖ¸Ïò¸Ã½ÚµãµÄËùÓÐÒýÓá£

int internal_strong_refs;

ÓÃÒÔʵÏÖǿָÕëµÄ¼ÆÊýÆ÷£º²úÉúÒ»¸öÖ¸Ïò±¾½ÚµãµÄÇ¿ÒýÓøüÆÊý¾Í»á¼Ó1¡£

int local_weak_refs;

Çý¶¯Îª´«ÊäÖеÄBinderÉèÖõÄÈõÒýÓüÆÊý¡£Èç¹ûÒ»¸öBinder´ò°üÔÚÊý¾Ý°üÖдÓÒ»¸ö½ø³Ì·¢Ë͵½ÁíÒ»¸ö½ø³Ì£¬Çý¶¯»áΪ¸ÃBinderÔö¼ÓÒýÓüÆÊý£¬Ö±µ½½ÓÊÕ½ø³Ìͨ¹ýBC_FREE_BUFFER֪ͨÇý¶¯ÊͷŸÃÊý¾Ý°üµÄÊý¾ÝÇøÎªÖ¹¡£

int local_strong_refs;

Çý¶¯Îª´«ÊäÖеÄBinderÉèÖõÄÇ¿ÒýÓüÆÊý¡£Í¬ÉÏ¡£

void __user *ptr;

Ö¸ÏòÓû§¿Õ¼äBinderʵÌåµÄÖ¸Õ룬À´×ÔÓÚflat_binder_objectµÄbinder³ÉÔ±

void __user *cookie;

Ö¸ÏòÓû§¿Õ¼äµÄ¸½¼ÓÖ¸Õ룬À´×ÔÓÚ flat_binder_objectµÄcookie³ÉÔ±

unsigned has_strong_ref;

unsigned pending_strong_ref;

unsigned has_weak_ref;

unsigned pending_weak_ref

ÕâÒ»×é±êÖ¾ÓÃÓÚ¿ØÖÆÇý¶¯ÓëBinderʵÌåËùÔÚ½ø³Ì½»»¥Ê½ÐÞ¸ÄÒýÓüÆÊý

unsigned has_async_transaction£»

¸Ã³ÉÔ±±íÃ÷¸Ã½ÚµãÔÚto-do¶ÓÁÐÖÐÓÐÒì²½½»»¥ÉÐδÍê³É¡£Çý¶¯½«ËùÓз¢ËÍÍù½ÓÊն˵ÄÊý¾Ý°üÔÝ´æÔÚ½ÓÊÕ½ø³Ì»òÏ߳̿ª±ÙµÄto-do¶ÓÁÐÀï¡£¶ÔÓÚÒì²½½»»¥£¬Çý¶¯×öÁËÊʵ±Á÷¿Ø£ºÈç¹ûto-do¶ÓÁÐÀïÓÐÒì²½½»»¥Éдý´¦ÀíÔò¸Ã³ÉÔ±ÖÃ1£¬Õ⽫µ¼ÖÂе½µÄÒì²½½»»¥´æ·ÅÔÚ±¾½á¹¹³ÉÔ± ¨C asynch_todo¶ÓÁÐÖУ¬¶ø²»Ö±½ÓË͵½to-do¶ÓÁÐÀĿµÄÊÇΪͬ²½½»»¥È÷£¬±ÜÃⳤʱ¼ä×èÈû·¢ËͶˡ£

unsigned accept_fds

±íÃ÷½ÚµãÊÇ·ñͬÒâ½ÓÊÜÎļþ·½Ê½µÄBinder£¬À´×Ôflat_binder_objectÖÐflags³ÉÔ±µÄFLAT_BINDER_FLAG_ACCEPTS_FDSλ¡£ÓÉÓÚ½ÓÊÕÎļþBinder»áΪ½ø³Ì×Ô¶¯´ò¿ªÒ»¸öÎļþ£¬Õ¼ÓÃÓÐÏÞµÄÎļþÃèÊö·û£¬½Úµã¿ÉÒÔÉèÖøÃλ¾Ü¾øÕâÖÖÐÐΪ¡£

int min_priority

ÉèÖô¦ÀíBinderÇëÇóµÄÏ̵߳Ä×îµÍÓÅÏȼ¶¡£·¢ËÍÏ߳̽«Êý¾ÝÌá½»¸ø½ÓÊÕÏ̴߳¦Àíʱ£¬Çý¶¯»á½«·¢ËÍÏ̵߳ÄÓÅÏȼ¶Ò²¸³Óè½ÓÊÕỊ̈߳¬Ê¹µÃÊý¾Ý¼´Ê¹¿çÁ˽ø³ÌÒ²ÄÜÒÔͬÑùÓÅÏȼ¶µÃµ½´¦Àí¡£²»¹ýÈç¹û·¢ËÍÏß³ÌÓÅÏȼ¶¹ýµÍ£¬½ÓÊÕÏ߳̽«ÒÔÔ¤ÉèµÄ×îСֵÔËÐС£

¸ÃÓòµÄÖµÀ´×ÔÓÚflat_binder_objectÖÐflags³ÉÔ±¡£

struct list_head async_todo

Òì²½½»»¥µÈ´ý¶ÓÁУ»ÓÃÓÚ·ÖÁ÷·¢Íù±¾½ÚµãµÄÒì²½½»»¥°ü

ÿ¸ö½ø³Ì¶¼ÓÐÒ»¿ÃºìºÚÊ÷ÓÃÓÚ´æ·Å´´½¨ºÃµÄ½Úµã£¬ÒÔBinderÔÚÓû§¿Õ¼äµÄÖ¸Õë×÷ΪË÷Òý¡£Ã¿µ±ÔÚ´«ÊäÊý¾ÝÖÐÕì²âµ½Ò»¸ö´ú±íBinderʵÌåµÄflat_binder_object£¬ÏÈÒԸýṹµÄbinderÖ¸ÕëΪË÷ÒýËÑË÷ºìºÚÊ÷£»Èç¹ûûÕÒµ½¾Í´´½¨Ò»¸öнڵãÌí¼Óµ½Ê÷ÖС£ÓÉÓÚ¶ÔÓÚͬһ¸ö½ø³ÌÀ´ËµÄÚ´æµØÖ·ÊÇΨһµÄ£¬ËùÒÔ²»»áÖØ¸´½¨ÉèÔì³É»ìÂÒ¡£

5.3.2 Binder ÒýÓÃÔÚÇý¶¯ÖеıíÊö

ºÍʵÌåÒ»Ñù£¬BinderµÄÒýÓÃÒ²ÊÇÇý¶¯¸ù¾Ý´«ÊäÊý¾ÝÖеÄflat_binder_object´´½¨µÄ£¬Á¥ÊôÓÚ»ñµÃ¸ÃÒýÓõĽø³Ì£¬ÓÃstruct binder_ref½á¹¹Ìå±íʾ£º

±í 9 BinderÒýÓÃÃèÊö½á¹¹£ºbinder_ref

³ÉÔ± º¬Òå
int debug_id;

 

µ÷ÊÔÓÃ

 

 

struct rb_node rb_node_desc; ÿ¸ö½ø³ÌÓÐÒ»¿ÃºìºÚÊ÷£¬½ø³ÌËùÓÐÒýÓÃÒÔÒýÓúţ¨¼´±¾½á¹¹µÄdescÓò£©ÎªË÷ÒýÌíÈë¸ÃÊ÷ÖС£±¾³ÉÔ±ÓÃ×öÁ´½Óµ½¸ÃÊ÷µÄÒ»¸ö½Úµã¡£

 

struct rb_node rb_node_node;

 

 

ÿ¸ö½ø³ÌÓÖÓÐÒ»¿ÃºìºÚÊ÷£¬½ø³ÌËùÓÐÒýÓÃÒÔ½ÚµãʵÌåÔÚÇý¶¯ÖеÄÄÚ´æµØÖ·£¨¼´±¾½á¹¹µÄnodeÓò£©ÎªËùÒýÌíÈë¸ÃÊ÷ÖС£±¾³ÉÔ±ÓÃ×öÁ´½Óµ½¸ÃÊ÷µÄÒ»¸ö½Úµã¡£

 

struct hlist_node node_entry; ¸ÃÓò½«±¾ÒýÓÃ×öΪ½ÚµãÁ´ÈëËùÖ¸ÏòµÄBinderʵÌå½á¹¹binder_nodeÖеÄrefs¶ÓÁÐ
struct binder_proc *proc; ±¾ÒýÓÃËùÊôµÄ½ø³Ì
struct binder_node *node; ±¾ÒýÓÃËùÖ¸ÏòµÄ½Úµã£¨BinderʵÌ壩
uint32_t desc; ±¾½á¹¹µÄÒýÓúÅ
int strong; Ç¿ÒýÓüÆÊý
int weak; ÈõÒýÓüÆÊý
struct binder_ref_death *death; Ó¦ÓóÌÐòÏòÇý¶¯·¢ËÍBC_REQUEST_DEATH_NOTIFICATION»òBC_CLEAR_DEATH_NOTIFICATIONÃüÁî´Ó¶øµ±BinderʵÌåÏú»ÙʱÄܹ»ÊÕµ½À´×ÔÇý¶¯µÄÌáÐÑ¡£¸ÃÓò²»Îª¿Õ±íÃ÷Óû§¶©ÔÄÁ˶ÔӦʵÌåÏú»ÙµÄ¡®Ø¬ºÄ¡¯¡£

 

¾ÍÏóÒ»¸ö¶ÔÏóÓкܶàÖ¸ÕëÒ»Ñù£¬Í¬Ò»¸öBinderʵÌå¿ÉÄÜÓкܶàÒýÓ㬲»Í¬µÄÊÇÕâЩÒýÓÿÉÄÜ·Ö²¼ÔÚ²»Í¬µÄ½ø³ÌÖС£ºÍʵÌåÒ»Ñù£¬Ã¿¸ö½ø³ÌʹÓúìºÚÊ÷´æ·ÅËùÓÐÕýÔÚʹÓõÄÒýÓᣲ»Í¬µÄÊÇBinderµÄÒýÓÿÉÒÔͨ¹ýÁ½¸ö¼üÖµË÷Òý£º

¡¤ ¶ÔӦʵÌåÔÚÄÚºËÖеĵØÖ·¡£×¢ÒâÕâÀïÖ¸µÄÊÇÇý¶¯´´½¨ÓÚÄÚºËÖеÄbinder_node½á¹¹µÄµØÖ·£¬¶ø²»ÊÇBinderʵÌåÔÚÓû§½ø³ÌÖеĵØÖ·¡£ÊµÌåÔÚÄÚºËÖеĵØÖ·ÊÇΨһµÄ£¬ÓÃ×öË÷Òý²»»á²úÉú¶þÒåÐÔ£»µ«ÊµÌå¿ÉÄÜÀ´×Ô²»Í¬Óû§½ø³Ì£¬¶øÊµÌåÔÚ²»Í¬Óû§½ø³ÌÖеĵØÖ·¿ÉÄÜÖØºÏ£¬²»ÄÜÓÃÀ´×öË÷Òý¡£Çý¶¯ÀûÓøúìºÚÊ÷ÔÚÒ»¸ö½ø³ÌÖпìËÙ²éÕÒij¸öBinderʵÌåËù¶ÔÓ¦µÄÒýÓã¨Ò»¸öʵÌåÔÚÒ»¸ö½ø³ÌÖÐÖ»½¨Á¢Ò»¸öÒýÓã©¡£

¡¤ ÒýÓúš£ÒýÓúÅÊÇÇý¶¯ÎªÒýÓ÷ÖÅäµÄÒ»¸ö32λ±êʶ£¬ÔÚÒ»¸ö½ø³ÌÄÚÊÇΨһµÄ£¬¶øÔÚ²»Í¬½ø³ÌÖпÉÄÜ»áÓÐͬÑùµÄÖµ£¬ÕâºÍ½ø³ÌµÄ´ò¿ªÎļþºÅºÜÀàËÆ¡£ÒýÓúŽ«·µ»Ø¸øÓ¦ÓóÌÐò£¬¿ÉÒÔ¿´×÷BinderÒýÓÃÔÚÓû§½ø³ÌÖеľä±ú¡£³ýÁË0ºÅÒýÓÃÔÚËùÓнø³ÌÀï¶¼¹Ì¶¨±£Áô¸øSMgr£¬ÆäËüÖµÓÉÇý¶¯¶¯Ì¬·ÖÅä¡£ÏòBinder·¢ËÍÊý¾Ý°üʱ£¬Ó¦ÓóÌÐò½«ÒýÓúÅÌîÈëbinder_transaction_data½á¹¹µÄtarget.handleÓòÖбíÃ÷¸ÃÊý¾Ý°üµÄÄ¿µÄBinder¡£Çý¶¯¸ù¾Ý¸ÃÒýÓúÅÔÚºìºÚÊ÷ÖÐÕÒµ½ÒýÓõÄbinder_ref½á¹¹£¬½ø¶øÍ¨¹ýÆänodeÓòÖªµÀÄ¿±êBinderʵÌåËùÔڵĽø³Ì¼°ÆäËüÏà¹ØÐÅÏ¢£¬ÊµÏÖÊý¾Ý°üµÄ·ÓÉ¡£

6 Binder ÄÚ´æÓ³ÉäºÍ½ÓÊÕ»º´æÇø¹ÜÀí

ÔÝÇÒÆ²¿ªBinder£¬¿¼ÂÇһϴ«Í³µÄIPC·½Ê½ÖУ¬Êý¾ÝÊÇÔõÑù´Ó·¢ËͶ˵½´ï½ÓÊն˵ÄÄØ£¿Í¨³£µÄ×ö·¨ÊÇ£¬·¢ËÍ·½½«×¼±¸ºÃµÄÊý¾Ý´æ·ÅÔÚ»º´æÇøÖУ¬µ÷ÓÃAPIͨ¹ýϵͳµ÷ÓýøÈëÄÚºËÖС£Äں˷þÎñ³ÌÐòÔÚÄں˿ռä·ÖÅäÄڴ棬½«Êý¾Ý´Ó·¢ËÍ·½»º´æÇø¸´ÖƵ½Äں˻º´æÇøÖС£½ÓÊÕ·½¶ÁÊý¾ÝʱҲҪÌṩһ¿é»º´æÇø£¬Äں˽«Êý¾Ý´ÓÄں˻º´æÇø¿½±´µ½½ÓÊÕ·½ÌṩµÄ»º´æÇøÖв¢»½ÐѽÓÊÕỊ̈߳¬Íê³ÉÒ»´ÎÊý¾Ý·¢ËÍ¡£ÕâÖÖ´æ´¢-ת·¢»úÖÆÓÐÁ½¸öȱÏÝ£ºÊ×ÏÈÊÇЧÂʵÍÏ£¬ÐèÒª×öÁ½´Î¿½±´£ºÓû§¿Õ¼ä->Äں˿ռä->Óû§¿Õ¼ä¡£LinuxʹÓÃcopy_from_user()ºÍcopy_to_user()ʵÏÖÕâÁ½¸ö¿ç¿Õ¼ä¿½±´£¬Ôڴ˹ý³ÌÖÐÈç¹ûʹÓÃÁ˸߶ËÄڴ棨high memory£©£¬ÕâÖÖ¿½±´ÐèÒªÁÙʱ½¨Á¢/È¡ÏûÒ³ÃæÓ³É䣬Ôì³ÉÐÔÄÜËðʧ¡£Æä´ÎÊǽÓÊÕÊý¾ÝµÄ»º´æÒªÓɽÓÊÕ·½Ìṩ£¬¿É½ÓÊÕ·½²»ÖªµÀµ½µ×Òª¶à´óµÄ»º´æ²Å¹»Óã¬Ö»ÄÜ¿ª±Ù¾¡Á¿´óµÄ¿Õ¼ä»òÏȵ÷ÓÃAPI½ÓÊÕÏûϢͷ»ñµÃÏûÏ¢Ìå´óС£¬ÔÙ¿ª±ÙÊʵ±µÄ¿Õ¼ä½ÓÊÕÏûÏ¢Ìå¡£Á½ÖÖ×ö·¨¶¼Óв»×㣬²»ÊÇÀ˷ѿռä¾ÍÊÇÀË·Ñʱ¼ä¡£

Binder²ÉÓÃÒ»ÖÖȫвßÂÔ£ºÓÉBinderÇý¶¯¸ºÔð¹ÜÀíÊý¾Ý½ÓÊÕ»º´æ¡£ÎÒÃÇ×¢Òâµ½BinderÇý¶¯ÊµÏÖÁËmmap()ϵͳµ÷Óã¬Õâ¶Ô×Ö·ûÉ豸ÊDZȽÏÌØÊâµÄ£¬ÒòΪmmap()ͨ³£ÓÃÔÚÓÐÎïÀí´æ´¢½éÖʵÄÎļþϵͳÉÏ£¬¶øÏóBinderÕâÑùûÓÐÎïÀí½éÖÊ£¬´¿´âÓÃÀ´Í¨ÐŵÄ×Ö·ûÉ豸û±ØÒªÖ§³Ömmap()¡£BinderÇý¶¯µ±È»²»ÊÇΪÁËÔÚÎïÀí½éÖʺÍÓû§¿Õ¼ä×öÓ³É䣬¶øÊÇÓÃÀ´´´½¨Êý¾Ý½ÓÊյĻº´æ¿Õ¼ä¡£ÏÈ¿´mmap()ÊÇÈçºÎʹÓõģº

fd = open("/dev/binder", O_RDWR);

mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);

ÕâÑùBinderµÄ½ÓÊÕ·½¾ÍÓÐÁËһƬ´óСΪMAP_SIZEµÄ½ÓÊÕ»º´æÇø¡£mmap()µÄ·µ»ØÖµÊÇÄÚ´æÓ³ÉäÔÚÓû§¿Õ¼äµÄµØÖ·£¬²»¹ýÕâ¶Î¿Õ¼äÊÇÓÉÇý¶¯¹ÜÀí£¬Óû§²»±ØÒ²²»ÄÜÖ±½Ó·ÃÎÊ£¨Ó³ÉäÀàÐÍΪPROT_READ£¬Ö»¶ÁÓ³É䣩¡£

½ÓÊÕ»º´æÇøÓ³ÉäºÃºó¾Í¿ÉÒÔ×öΪ»º´æ³Ø½ÓÊպʹæ·ÅÊý¾ÝÁË¡£Ç°ÃæËµ¹ý£¬½ÓÊÕÊý¾Ý°üµÄ½á¹¹Îªbinder_transaction_data£¬µ«ÕâÖ»ÊÇÏûϢͷ£¬ÕæÕýµÄÓÐЧ¸ººÉλÓÚdata.bufferËùÖ¸ÏòµÄÄÚ´æÖС£ÕâÆ¬ÄÚ´æ²»ÐèÒª½ÓÊÕ·½Ìṩ£¬Ç¡Ç¡ÊÇÀ´×Ômmap()Ó³ÉäµÄÕâÆ¬»º´æ³Ø¡£ÔÚÊý¾Ý´Ó·¢ËÍ·½Ïò½ÓÊÕ·½¿½±´Ê±£¬Çý¶¯»á¸ù¾Ý·¢ËÍÊý¾Ý°üµÄ´óС£¬Ê¹ÓÃ×î¼ÑÆ¥ÅäËã·¨´Ó»º´æ³ØÖÐÕÒµ½Ò»¿é´óСºÏÊʵĿռ䣬½«Êý¾Ý´Ó·¢ËÍ»º´æÇø¸´ÖƹýÀ´¡£Òª×¢ÒâµÄÊÇ£¬´æ·Åbinder_transaction_data½á¹¹±¾ÉíÒÔ¼°±í4ÖÐËùÓÐÏûÏ¢µÄÄÚ´æ¿Õ¼ä»¹ÊǵÃÓɽÓÊÕÕßÌṩ£¬µ«ÕâЩÊý¾Ý´óС¹Ì¶¨£¬ÊýÁ¿Ò²²»¶à£¬²»»á¸ø½ÓÊÕ·½Ôì³É²»±ã¡£Ó³ÉäµÄ»º´æ³ØÒª×ã¹»´ó£¬ÒòΪ½ÓÊÕ·½µÄÏ̳߳ؿÉÄÜ»áͬʱ´¦Àí¶àÌõ²¢·¢µÄ½»»¥£¬Ã¿Ìõ½»»¥¶¼ÐèÒª´Ó»º´æ³ØÖлñȡĿµÄ´æ´¢Çø£¬Ò»µ©»º´æ³ØºÄ½ß½«²úÉúµ¼ÖÂÎÞ·¨Ô¤ÆÚµÄºó¹û¡£

ÓзÖÅä±ØÈ»ÓÐÊÍ·Å¡£½ÓÊÕ·½ÔÚ´¦ÀíÍêÊý¾Ý°üºó£¬¾ÍҪ֪ͨÇý¶¯ÊÍ·Ådata.bufferËùÖ¸ÏòµÄÄÚ´æÇø¡£ÔÚ½éÉÜBinderЭÒéʱÒѾ­Ìáµ½£¬ÕâÊÇÓÉÃüÁîBC_FREE_BUFFERÍê³ÉµÄ¡£

ͨ¹ýÉÏÃæ½éÉÜ¿ÉÒÔ¿´µ½£¬Çý¶¯Îª½ÓÊÕ·½·Öµ£ÁË×îΪ·±ËöµÄÈÎÎñ£º·ÖÅä/ÊÍ·Å´óС²»µÈ£¬ÄÑÒÔÔ¤²âµÄÓÐЧ¸ººÉ»º´æÇø£¬¶ø½ÓÊÕ·½Ö»ÐèÒªÌṩ»º´æÀ´´æ·Å´óС¹Ì¶¨£¬×î´ó¿Õ¼ä¿ÉÒÔÔ¤²âµÄÏûϢͷ¼´¿É¡£ÔÚЧÂÊÉÏ£¬ÓÉÓÚmmap()·ÖÅäµÄÄÚ´æÊÇÓ³ÉäÔÚ½ÓÊÕ·½Óû§¿Õ¼äÀïµÄ£¬ËùÓÐ×ÜÌåЧ¹û¾ÍÏ൱ÓÚ¶ÔÓÐЧ¸ººÉÊý¾Ý×öÁËÒ»´Î´Ó·¢ËÍ·½Óû§¿Õ¼äµ½½ÓÊÕ·½Óû§¿Õ¼äµÄÖ±½ÓÊý¾Ý¿½±´£¬Ê¡È¥ÁËÄÚºËÖÐÔÝ´æÕâ¸ö²½Ö裬ÌáÉýÁËÒ»±¶µÄÐÔÄÜ¡£Ë³±ãÔÙÌáÒ»µã£¬LinuxÄÚºËʵ¼ÊÉÏûÓдÓÒ»¸öÓû§¿Õ¼äµ½ÁíÒ»¸öÓû§¿Õ¼äÖ±½Ó¿½±´µÄº¯Êý£¬ÐèÒªÏÈÓÃcopy_from_user()¿½±´µ½Äں˿ռ䣬ÔÙÓÃcopy_to_user()¿½±´µ½ÁíÒ»¸öÓû§¿Õ¼ä¡£ÎªÁËʵÏÖÓû§¿Õ¼äµ½Óû§¿Õ¼äµÄ¿½±´£¬mmap()·ÖÅäµÄÄÚ´æ³ýÁËÓ³Éä½øÁ˽ÓÊÕ·½½ø³ÌÀ»¹Ó³Éä½øÁËÄں˿ռ䡣ËùÒÔµ÷ÓÃcopy_from_user()½«Êý¾Ý¿½±´½øÄں˿ռäÒ²Ï൱ÓÚ¿½±´½øÁ˽ÓÊÕ·½µÄÓû§¿Õ¼ä£¬Õâ¾ÍÊÇBinderÖ»ÐèÒ»´Î¿½±´µÄ¡®ÃØÃÜ¡¯¡£

7 Binder ½ÓÊÕÏ̹߳ÜÀí

BinderͨÐÅʵ¼ÊÉÏÊÇλÓÚ²»Í¬½ø³ÌÖеÄÏß³ÌÖ®¼äµÄͨÐÅ¡£¼ÙÈç½ø³ÌSÊÇServer¶Ë£¬ÌṩBinderʵÌ壬Ïß³ÌT1´ÓClient½ø³ÌC1ÖÐͨ¹ýBinderµÄÒýÓÃÏò½ø³ÌS·¢ËÍÇëÇó¡£SΪÁË´¦ÀíÕâ¸öÇëÇóÐèÒªÆô¶¯Ïß³ÌT2£¬¶ø´ËʱÏß³ÌT1´¦ÓÚ½ÓÊÕ·µ»ØÊý¾ÝµÄµÈ´ý״̬¡£T2´¦ÀíÍêÇëÇó¾Í»á½«´¦Àí½á¹û·µ»Ø¸øT1£¬T1±»»½Ðѵõ½´¦Àí½á¹û¡£ÔÚÕâ¹ý³ÌÖУ¬T2·Â·ðT1ÔÚ½ø³ÌSÖеĴúÀí£¬´ú±íT1Ö´ÐÐÔ¶³ÌÈÎÎñ£¬¶ø¸øT1µÄ¸Ð¾õ¾ÍÊÇÏó´©Ô½µ½SÖÐÖ´ÐÐÒ»¶Î´úÂëÓֻص½ÁËC1¡£ÎªÁËʹÕâÖÖ´©Ô½¸ü¼ÓÕæÊµ£¬Çý¶¯»á½«T1µÄһЩÊôÐÔ¸³¸øT2£¬ÌرðÊÇT1µÄÓÅÏȼ¶nice£¬ÕâÑùT2»áʹÓúÍT1ÀàËÆµÄʱ¼äÍê³ÉÈÎÎñ¡£ºÜ¶à×ÊÁÏ»áÓá®Ïß³ÌÇ¨ÒÆ¡¯À´ÐÎÈÝÕâÖÖÏÖÏó£¬ÈÝÒ×ÈÃÈ˲úÉúÎó½â¡£Ò»À´Ï̸߳ù±¾²»¿ÉÄÜÔÚ½ø³ÌÖ®¼äÌøÀ´ÌøÈ¥£¬¶þÀ´T2³ýÁ˺ÍT1ÓÅÏȼ¶Ò»Ñù£¬ÆäËüûÓÐÏà֮ͬ´¦£¬°üÀ¨Éí·Ý£¬´ò¿ªÎļþ£¬Õ»´óС£¬ÐźŴ¦Àí£¬Ë½ÓÐÊý¾ÝµÈ¡£

¶ÔÓÚServer½ø³ÌS£¬¿ÉÄÜ»áÓÐÐí¶àClientͬʱ·¢ÆðÇëÇó£¬ÎªÁËÌá¸ßЧÂÊÍùÍù¿ª±ÙÏ̳߳ز¢·¢´¦ÀíÊÕµ½µÄÇëÇó¡£ÔõÑùʹÓÃÏ̳߳ØÊµÏÖ²¢·¢´¦ÀíÄØ£¿ÕâºÍ¾ßÌåµÄIPC»úÖÆÓйء£ÄÃsocket¾ÙÀý£¬Server¶ËµÄsocketÉèÖÃΪÕìÌýģʽ£¬ÓÐÒ»¸öרÃŵÄÏß³ÌʹÓøÃsocketÕìÌýÀ´×ÔClientµÄÁ¬½ÓÇëÇ󣬼´×èÈûÔÚaccept()ÉÏ¡£Õâ¸ösocket¾ÍÏóÒ»Ö»»áÉúµ°µÄ¼¦£¬Ò»µ©ÊÕµ½À´×ÔClientµÄÇëÇó¾Í»áÉúÒ»¸öµ° ¨C ´´½¨ÐÂsocket²¢´Óaccept()·µ»Ø¡£ÕìÌýÏ̴߳ÓÏ̳߳ØÖÐÆô¶¯Ò»¸ö¹¤×÷Ï̲߳¢½«¸Õϵĵ°½»¸ø¸ÃÏ̡߳£ºóÐøÒµÎñ´¦Àí¾ÍÓɸÃÏß³ÌÍê³É²¢Í¨¹ýÕâ¸öµ¥ÓëClientʵÏÖ½»»¥¡£

¿ÉÊǶÔÓÚBinderÀ´Ëµ£¬¼ÈûÓÐÕìÌýģʽҲ²»»áϵ°£¬ÔõÑù¹ÜÀíÏ̳߳ØÄØ£¿Ò»ÖÖ¼òµ¥µÄ×ö·¨ÊÇ£¬²»¹ÜÈýÆß¶þʮһ£¬ÏÈ´´½¨Ò»¶ÑỊ̈߳¬Ã¿¸öÏ̶߳¼ÓÃBINDER_WRITE_READÃüÁî¶ÁBinder¡£ÕâЩÏ̻߳á×èÈûÔÚÇý¶¯Îª¸ÃBinderÉèÖõĵȴý¶ÓÁÐÉÏ£¬Ò»µ©ÓÐÀ´×ÔClientµÄÊý¾ÝÇý¶¯»á´Ó¶ÓÁÐÖл½ÐÑÒ»¸öÏß³ÌÀ´´¦Àí¡£ÕâÑù×ö¼òµ¥Ö±¹Û£¬Ê¡È¥ÁËÏ̳߳أ¬µ«Ò»¿ªÊ¼¾Í´´½¨Ò»¶ÑÏß³ÌÓеãÀË·Ñ×ÊÔ´¡£ÓÚÊÇBinderЭÒéÒýÈëÁËרÃÅÃüÁî»òÏûÏ¢°ïÖúÓû§¹ÜÀíÏ̳߳أ¬°üÀ¨£º

¡¤ INDER_SET_MAX_THREADS

¡¤ BC_REGISTER_LOOP

¡¤ BC_ENTER_LOOP

¡¤ BC_EXIT_LOOP

¡¤ BR_SPAWN_LOOPER

Ê×ÏÈÒª¹ÜÀíÏ̳߳ؾÍÒªÖªµÀ³Ø×ÓÓжà´ó£¬Ó¦ÓóÌÐòͨ¹ýINDER_SET_MAX_THREADS¸æËßÇý¶¯×î¶à¿ÉÒÔ´´½¨¼¸¸öÏ̡߳£ÒÔºóÿ¸öÏß³ÌÔÚ´´½¨£¬½øÈëÖ÷Ñ­»·£¬Í˳öÖ÷Ñ­»·Ê±¶¼Òª·Ö±ðʹÓÃBC_REGISTER_LOOP£¬ BC_ENTER_LOOP£¬BC_EXIT_LOOP¸æÖªÇý¶¯£¬ÒÔ±ãÇý¶¯ÊÕ¼¯ºÍ¼Ç¼µ±Ç°Ï̳߳صÄ״̬¡£Ã¿µ±Çý¶¯½ÓÊÕÍêÊý¾Ý°ü·µ»Ø¶ÁBinderµÄÏß³Ìʱ£¬¶¼Òª¼ì²éÒ»ÏÂÊDz»ÊÇÒѾ­Ã»ÓÐÏÐÖÃÏß³ÌÁË¡£Èç¹ûÊÇ£¬¶øÇÒÏß³Ì×ÜÊý²»»á³¬³öÏ̳߳Ø×î´óÏß³ÌÊý£¬¾Í»áÔÚµ±Ç°¶Á³öµÄÊý¾Ý°üºóÃæÔÙ×·¼ÓÒ»ÌõBR_SPAWN_LOOPERÏûÏ¢£¬¸æËßÓû§Ï̼߳´½«²»¹»ÓÃÁË£¬ÇëÔÙÆô¶¯Ò»Ð©£¬·ñÔòÏÂÒ»¸öÇëÇó¿ÉÄܲ»Äܼ°Ê±ÏìÓ¦¡£ÐÂÏß³ÌÒ»Æô¶¯ÓÖ»áͨ¹ýBC_xxx_LOOP¸æÖªÇý¶¯¸üÐÂ״̬¡£ÕâÑùÖ»ÒªÏß³ÌûÓкľ¡£¬×ÜÊÇÓпÕÏÐÏß³ÌÔڵȴý¶ÓÁÐÖÐËæÊ±´ýÃü£¬¼°Ê±´¦ÀíÇëÇó¡£

¹ØÓÚ¹¤×÷Ïß³ÌµÄÆô¶¯£¬BinderÇý¶¯»¹×öÁËÒ»µãССµÄÓÅ»¯¡£µ±½ø³ÌP1µÄÏß³ÌT1Ïò½ø³ÌP2·¢ËÍÇëÇóʱ£¬Çý¶¯»áÏȲ鿴һÏÂÏß³ÌT1ÊÇ·ñÒ²ÕýÔÚ´¦ÀíÀ´×ÔP2ij¸öÏß³ÌÇëÇóµ«ÉÐδÍê³É£¨Ã»Óз¢Ëͻظ´£©¡£ÕâÖÖÇé¿öͨ³£·¢ÉúÔÚÁ½¸ö½ø³Ì¶¼ÓÐBinderʵÌå²¢»¥Ïà¶Ô·¢Ê±ÇëÇóʱ¡£¼ÙÈçÇý¶¯ÔÚ½ø³ÌP2Öз¢ÏÖÁËÕâÑùµÄỊ̈߳¬±ÈÈç˵T2£¬¾Í»áÒªÇóT2À´´¦ÀíT1µÄÕâ´ÎÇëÇó¡£ÒòΪT2¼ÈÈ»ÏòT1·¢ËÍÁËÇëÇóÉÐδµÃµ½·µ»Ø°ü£¬ËµÃ÷T2¿Ï¶¨£¨»ò½«»á£©×èÈûÔÚ¶ÁÈ¡·µ»Ø°üµÄ״̬¡£Õâʱºò¿ÉÒÔÈÃT2˳±ã×öµãÊÂÇ飬×ܱȵÈÔÚÄÇÀïÏÐ×źá£¶øÇÒÈç¹ûT2²»ÊÇÏ̳߳ØÖеÄÏ̻߳¹¿ÉÒÔΪÏ̳߳طֵ£²¿·Ö¹¤×÷£¬¼õÉÙÏ̳߳ØÊ¹ÓÃÂÊ¡£

8 Êý¾Ý°ü½ÓÊÕ¶ÓÁÐÓ루Ị̈߳©µÈ´ý¶ÓÁйÜÀí

ͨ³£Êý¾Ý´«ÊäµÄ½ÓÊÕ¶ËÓÐÁ½¸ö¶ÓÁУºÊý¾Ý°ü½ÓÊÕ¶ÓÁкͣ¨Ị̈߳©µÈ´ý¶ÓÁУ¬ÓÃÒÔ»º½â¹©Ðèì¶Ü¡£µ±³¬ÊÐÀïµÄ½ø»õ£¨Êý¾Ý°ü£©Ì«¶à£¬»õÎï»á¶Ñ»ýÔÚ²Ö¿âÀ¹ºÎïµÄÈË£¨Ị̈߳©Ì«¶à£¬»áÅŶӵȴýÔÚÊÕÒøÌ¨£¬µÀÀíÊÇÒ»ÑùµÄ¡£ÔÚÇý¶¯ÖУ¬Ã¿¸ö½ø³ÌÓÐÒ»¸öÈ«¾ÖµÄ½ÓÊÕ¶ÓÁУ¬Ò²½Ðto-do¶ÓÁУ¬´æ·Å²»ÊÇ·¢ÍùÌØ¶¨Ï̵߳ÄÊý¾Ý°ü£»ÏàÓ¦µØÓÐÒ»¸öÈ«¾ÖµÈ´ý¶ÓÁУ¬ËùÓеȴý´ÓÈ«¾Ö½ÓÊÕ¶ÓÁÐÀïÊÕÊý¾ÝµÄÏß³ÌÔڸöÓÁÐÀïÅŶӡ£Ã¿¸öÏß³ÌÓÐ×Ô¼ºË½ÓеÄto-do¶ÓÁУ¬´æ·Å·¢Ë͸ø¸ÃÏ̵߳ÄÊý¾Ý°ü£»ÏàÓ¦µÄÿ¸öÏ̶߳¼Óи÷×Ô˽Óеȴý¶ÓÁУ¬×¨ÃÅÓÃÓÚ±¾Ï̵߳ȴý½ÓÊÕ×Ô¼ºto-do¶ÓÁÐÀïµÄÊý¾Ý¡£ËäÈ»Ãû½Ð¶ÓÁУ¬ÆäʵÏß³Ì˽Óеȴý¶ÓÁÐÖÐ×î¶àÖ»ÓÐÒ»¸öỊ̈߳¬¼´Ëü×Ô¼º¡£

ÓÉÓÚ·¢ËÍʱûÓÐÌØ±ð±ê¼Ç£¬Çý¶¯ÔõôÅжÏÄÄЩÊý¾Ý°ü¸ÃËÍÈëÈ«¾Öto-do¶ÓÁУ¬ÄÄЩÊý¾Ý°ü¸ÃËÍÈëÌØ¶¨Ï̵߳Äto-do¶ÓÁÐÄØ£¿ÕâÀïÓÐÁ½Ìõ¹æÔò¡£¹æÔò1£ºClient·¢¸øServerµÄÇëÇóÊý¾Ý°ü¶¼Ìá½»µ½Server½ø³ÌµÄÈ«¾Öto-do¶ÓÁС£²»¹ýÓиöÌØÀý£¬¾ÍÊÇÉϽÚ̸µ½µÄBinder¶Ô¹¤×÷Ïß³ÌÆô¶¯µÄÓÅ»¯¡£¾­¹ýÓÅ»¯£¬À´×ÔT1µÄÇëÇó²»ÊÇÌá½»¸øP2µÄÈ«¾Öto-do¶ÓÁУ¬¶øÊÇËÍÈëÁËT2µÄ˽ÓÐto-do¶ÓÁС£¹æÔò2£º¶Ôͬ²½ÇëÇóµÄ·µ»ØÊý¾Ý°ü£¨ÓÉBC_REPLY·¢Ë͵İü£©¶¼·¢Ë͵½·¢ÆðÇëÇóµÄÏ̵߳Ä˽ÓÐto-do¶ÓÁÐÖС£ÈçÉÏÃæµÄÀý×Ó£¬Èç¹û½ø³ÌP1µÄÏß³ÌT1·¢¸ø½ø³ÌP2µÄÏß³ÌT2µÄÊÇͬ²½ÇëÇó£¬ÄÇôT2·µ»ØµÄÊý¾Ý°ü½«ËͽøT1µÄ˽ÓÐto-do¶ÓÁжø²»»áÌá½»µ½P1µÄÈ«¾Öto-do¶ÓÁС£

Êý¾Ý°ü½øÈë½ÓÊÕ¶ÓÁеÄDZ¹æÔòÒ²¾Í¾ö¶¨ÁËÏ߳̽øÈëµÈ´ý¶ÓÁеÄDZ¹æÔò£¬¼´Ò»¸öÏß³ÌÖ»Òª²»½ÓÊÕ·µ»ØÊý¾Ý°üÔòÓ¦¸ÃÔÚÈ«¾ÖµÈ´ý¶ÓÁÐÖеȴýÐÂÈÎÎñ£¬·ñÔò¾ÍÓ¦¸ÃÔÚÆä˽Óеȴý¶ÓÁÐÖеȴýServerµÄ·µ»ØÊý¾Ý¡£»¹ÊÇÉÏÃæµÄÀý×Ó£¬T1ÔÚÏòT2·¢ËÍͬ²½ÇëÇóºó¾Í±ØÐëµÈ´ýÔÚËü˽Óеȴý¶ÓÁÐÖУ¬¶ø²»ÊÇÔÚP1µÄÈ«¾ÖµÈ´ý¶ÓÁÐÖÐÅŶӣ¬·ñÔò½«µÃ²»µ½T2µÄ·µ»ØµÄÊý¾Ý°ü¡£

ÕâЩDZ¹æÔòÊÇÇý¶¯¶ÔBinderͨÐÅË«·½Ê©¼ÓµÄÏÞÖÆÌõ¼þ£¬ÌåÏÖÔÚÓ¦ÓóÌÐòÉϾÍÊÇͬ²½ÇëÇó½»»¥¹ý³ÌÖеÄÏß³ÌÒ»ÖÂÐÔ£º1) Client¶Ë£¬µÈ´ý·µ»Ø°üµÄÏ̱߳ØÐëÊÇ·¢ËÍÇëÇóµÄỊ̈߳¬¶ø²»ÄÜÓÉÒ»¸öÏ̷߳¢ËÍÇëÇó°ü£¬ÁíÒ»¸öÏ̵߳ȴý½ÓÊÕ°ü£¬·ñÔò½«ÊÕ²»µ½·µ»Ø°ü£»2) Server¶Ë£¬·¢ËͶÔÓ¦·µ»ØÊý¾Ý°üµÄÏ̱߳ØÐëÊÇÊÕµ½ÇëÇóÊý¾Ý°üµÄỊ̈߳¬·ñÔò·µ»ØµÄÊý¾Ý°ü½«ÎÞ·¨Ëͽ»·¢ËÍÇëÇóµÄÏ̡߳£ÕâÊÇÒòΪ·µ»ØÊý¾Ý°üµÄÄ¿µÄBinder²»ÊÇÓû§Ö¸¶¨µÄ£¬¶øÊÇÇý¶¯¼Ç¼ÔÚÊÕµ½ÇëÇóÊý¾Ý°üµÄÏß³ÌÀÈç¹û·¢ËÍ·µ»Ø°üµÄÏ̲߳»ÊÇÊÕµ½ÇëÇó°üµÄÏß³ÌÇý¶¯½«ÎÞ´ÓÖªÏþ·µ»Ø°ü½«ËÍÍùºÎ´¦¡£

½ÓÏÂÀ´Ì½ÌÖÒ»ÏÂBinderÇý¶¯ÊÇÈçºÎµÝ½»Í¬²½½»»¥ºÍÒì²½½»»¥µÄ¡£ÎÒÃÇÖªµÀ£¬Í¬²½½»»¥ºÍÒì²½½»»¥µÄÇø±ðÊÇͬ²½½»»¥µÄÇëÇó¶Ë£¨client£©ÔÚ·¢³öÇëÇóÊý¾Ý°üºóÐëÒªµÈ´ýÓ¦´ð¶Ë£¨Server£©µÄ·µ»ØÊý¾Ý°ü£¬¶øÒì²½½»»¥µÄ·¢ËͶ˷¢³öÇëÇóÊý¾Ý°üºó½»»¥¼´½áÊø¡£¶ÔÓÚÕâÁ½ÖÖ½»»¥µÄÇëÇóÊý¾Ý°ü£¬Çý¶¯¿ÉÒÔ²»¹ÜÈýÆß¶þʮһ£¬Í³Í³¶ªµ½½ÓÊն˵Äto-do¶ÓÁÐÖÐÒ»¸ö¸ö´¦Àí¡£µ«Çý¶¯²¢Ã»ÓÐÕâÑù×ö£¬¶øÊǶÔÒì²½½»»¥×öÁËÏÞÁ÷£¬ÁîÆäΪͬ²½½»»¥È÷£¬¾ßÌå×ö·¨ÊÇ£º¶ÔÓÚij¸öBinderʵÌ壬ֻҪÓÐÒ»¸öÒì²½½»»¥Ã»Óд¦ÀíÍê±Ï£¬ÀýÈçÕýÔÚ±»Ä³¸öÏ̴߳¦Àí»ò»¹ÔÚÈÎÒâÒ»Ìõto-do¶ÓÁÐÖÐÅŶӣ¬ÄÇô½ÓÏÂÀ´·¢¸ø¸ÃʵÌåµÄÒì²½½»»¥°ü½«²»ÔÙͶµÝµ½to-do¶ÓÁÐÖУ¬¶øÊÇ×èÈûÔÚÇý¶¯Îª¸ÃʵÌ忪±ÙµÄÒì²½½»»¥½ÓÊÕ¶ÓÁУ¨Binder½ÚµãµÄasync_todoÓò£©ÖУ¬µ«ÕâÆÚ¼äͬ²½½»»¥ÒÀ¾É²»ÊÜÏÞÖÆÖ±½Ó½øÈëto-do¶ÓÁлñµÃ´¦Àí¡£Ò»Ö±µ½¸ÃÒì²½½»»¥´¦ÀíÍê±ÏÏÂÒ»¸öÒì²½½»»¥·½¿ÉÒÔÍÑÀëÒì²½½»»¥¶ÓÁнøÈëto-do¶ÓÁÐÖС£Ö®ËùÒÔÒªÕâô×öÊÇÒòΪͬ²½½»»¥µÄÇëÇó¶ËÐèÒªµÈ´ý·µ»Ø°ü£¬±ØÐëѸËÙ´¦ÀíÍê±ÏÒÔÃâÓ°ÏìÇëÇó¶ËµÄÏìÓ¦ËÙ¶È£¬¶øÒì²½½»»¥ÊôÓÚ¡®·¢Éäºó²»¹Ü¡¯£¬ÉÔ΢ÑÓʱһµã²»»á×èÈûÆäËüÏ̡߳£ËùÒÔÓÃרÃŶÓÁн«¹ý¶àµÄÒì²½½»»¥ÔÝ´æÆðÀ´£¬ÒÔÃâÍ»·¢´óÁ¿Òì²½½»»¥¼·Õ¼Server¶ËµÄ´¦ÀíÄÜÁ¦»òºÄ¾¡Ï̳߳ØÀïµÄỊ̈߳¬½ø¶ø×èÈûͬ²½½»»¥¡£

9 ×ܽá

BinderʹÓÃClient-ServerͨÐÅ·½Ê½£¬°²È«ÐԺ㬼òµ¥¸ßЧ£¬ÔÙ¼ÓÉÏÆäÃæÏò¶ÔÏóµÄÉè¼ÆË¼Ï룬¶ÀÌØµÄ½ÓÊÕ»º´æ¹ÜÀíºÍÏ̳߳عÜÀí·½Ê½£¬³ÉΪAndroid½ø³Ì¼äͨÐŵÄÖÐÁ÷íÆÖù¡£

 

 
   
2465 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
Flutter-Ä㻹ÔÚÀÄÓÃStatefulWidgetÂð
ÒÆ¶¯APP°²È«²âÊÔÒªµã
ÉîÈëdz³ö Kotlin Э³Ì
iOS ×é¼þ»¯ ¡ª¡ª ·ÓÉÉè¼ÆË¼Â··ÖÎö
ÒÆ¶¯¶Ë¿çƽ̨¿ª·¢µÄÉî¶È½âÎö
×îпγÌ
Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò¿ª·¢
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
AndroidÓ¦Óø߼¶¿ª·¢
ÒÆ¶¯»¥ÁªÍøÓ¦Óÿª·¢£¨iOS£¬Android£¬HTML5)
³É¹¦°¸Àý
±±¾© iOS¿ª·¢¼¼ÊõÉîÈëÑо¿
ijÆóÒµ Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò¿ª·¢
ÖÐÌå²Ê Android²úÆ·¼¶²âÊÔ
ÒÆ¶¯Í¨ÐÅ ÒÆ¶¯»¥ÁªÍøÓ¦Óÿª·¢Ô­Àí
ijµçÁ¦ÐÐ android¿ª·¢Æ½Ì¨×î¼Ñ