±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËÃæÏò¶ÔÏóµÄ 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½ø³Ì¼äͨÐŵÄÖÐÁ÷íÆÖù¡£
|