±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËBinderÊÇʲô£¿Androidϵͳ¿ò¼Ü¡¢BinderͨÐÅ¡¢Binder¿ò¼Ü¡¢BinderÖÐʹÓõÄÉè¼ÆÄ£Ê½¡¢BinderÓëÄÚ´æÓ³Éämmap¡£
±¾ÎÄÀ´×ÔÓÚ¾ò½ð£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
ǰÑÔ
Binder×öΪAndroidÖкËÐÄ»úÖÆ£¬¶ÔÓÚÀí½âAndroidϵͳÊDZز»¿ÉÉٵ쬹ØÓÚbinderµÄÎÄÕÂÒ²Óкܶ࣬µ«ÊÇÿ´Î¿´×ܸоõ¿´µÄ²»ÊǺܶ®£¬µ½µ×ʲô²ÅÊÇbinder»úÖÆ£¿ÎªÊ²Ã´ÒªÊ¹ÓÃbinder»úÖÆ£¿binder»úÖÆÓÖÊÇÔõÑùÔËÐеÄÄØ£¿ÕâЩÎÊÌâÖ»ÊÇÁ˽âbinder»úÖÆÊDz»¹»µÄ£¬ÐèÒª´ÓAndroidµÄÕûÌåϵͳ³ö·¢À´·ÖÎö£¬ÔÚÎÒÕÒÁ˺ܶà×ÊÁϺó£¬ÕæÕýµÄŪ¶®ÁËbinder»úÖÆ£¬ÏàÐÅ¿´ÍêÕâÆªÎÄÕ´ó¼ÒÒ²¿ÉÒÔŪ¶®binder»úÖÆ¡£
1¡¢BinderÊÇʲô£¿
ÒªÀí½âbinder£¬ÏÈÒªÖªµÀIPC£¬Inter-process communication
,Ò²¾ÍÊǽø³ÌÖÐÏ໥ͨÐÅ£¬BinderÊÇAndroidÌṩµÄÒ»Ì×½ø³Ì¼äÏ໥ͨÐÅ¿ò¼Ü¡£ÓÃÀ´¶à½ø³Ì¼ä·¢ËÍÏûÏ¢£¬Í¬²½ºÍ¹²ÏíÄÚ´æ¡£ÒÑÓеĽø³Ì¼äͨÐÅ·½Ê½ÓÐһϼ¸ÖÖ£º

1¡¢Files Îļþϵͳ£¨°üÀ¨ÄÚ´æÓ³É䣩
2¡¢Sockets
3¡¢Pipes ¹ÜµÀ
4¡¢¹²ÏíÄÚ´æ
5¡¢Intents, ContentProviders, Messenger
6¡¢Binder
AndroidϵͳÖеÄBinder¿ò¼ÜͼÈçÏ£º

ÄÃActivity¾ÙÀý´ÓÉÏͼ¿ÉÒÔ¿´³öÀ´£ºActivityÊÇÓÉActivityManagerÀ´¿ØÖƵ쬶øActivityManagerÆäʵÊÇͨ¹ýBinder»ñÈ¡ActivityManagerService·þÎñÀ´¿ØÖÆActivityµÄ£¬²¢ÇÒActivityManagerÊÇAndroidϵͳFrameWork²ãµÄ£¬ºÍÓ¦ÓÃÖеÄactivity²»ÊÇͬһ¸ö½ø³Ì¡£
ÖØµã£º
1¡¢BinderÊÇAndroidÌṩµÄÒ»Ì×½ø³Ì¼äͨÐÅ¿ò¼Ü¡£
2¡¢ÏµÍ³·þÎñActivityManagerService,LocationManagerService£¬µÈ¶¼ÊÇÔÚµ¥¶À½ø³ÌÖеģ¬Ê¹ÓÃbinderºÍÓ¦ÓýøÐÐͨÐÅ¡£
2¡¢Androidϵͳ¿ò¼Ü

ÈçÉÏͼ£¬Androidϵͳ·Ö³ÉÈý²ã¡£×îÉϲãÊÇapplicationÓ¦Óò㣬µÚ¶þ²ãÊÇFramework²ã£¬µÚÈý²ãÊÇnative²ã¡£
ÓÉÏÂͼ¿ÉÖª¼¸µã£º
1¡¢AndroidÖеÄÓ¦ÓòãºÍϵͳ·þÎñ²ã²»ÔÚͬһ¸ö½ø³Ì£¬ÏµÍ³·þÎñÔÚµ¥¶ÀµÄ½ø³ÌÖС£
2¡¢AndroidÖв»Í¬Ó¦ÓÃÊôÓÚ²»Í¬µÄ½ø³ÌÖС£
AndroidÓ¦ÓúÍϵͳservicesÔËÐÐÔÚ²»Í¬½ø³ÌÖÐÊÇΪÁ˰²È«£¬Îȶ¨£¬ÒÔ¼°ÄÚ´æ¹ÜÀíµÄÔÒò£¬µ«ÊÇÓ¦ÓúÍϵͳ·þÎñÐèҪͨÐźͷÖÏíÊý¾Ý¡£
Óŵã
°²È«ÐÔ£ºÃ¿¸ö½ø³Ì¶¼µ¥¶ÀÔËÐеģ¬¿ÉÒÔ±£Ö¤Ó¦Óòã¶Ôϵͳ²ãµÄ¸ôÀë¡£
Îȶ¨ÐÔ£ºÈç¹ûij¸ö½ø³Ì±ÀÀ£Á˲»»áµ¼ÖÂÆäËû½ø³Ì±ÀÀ£¡£
ÄÚ´æ·ÖÅ䣺Èç¹ûij¸ö½ø³ÌÒÔ¼°²»ÐèÒªÁË¿ÉÒÔ´ÓÄÚ´æÖÐÒÆ³ý£¬²¢ÇÒ»ØÊÕÏàÓ¦µÄÄÚ´æ¡£
3¡¢BinderͨÐÅ
clientÇëÇóservice·þÎñ£¬±ÈÈç˵ActivityÇëÇóActivity
ManagerService·þÎñ£¬ÓÉÓÚActivityºÍActivityManagerServiceÊÇÔÚÁ½¸ö²»Í¬µÄ½ø³ÌÖеģ¬ÄÇôÏÂͼÊÇÒ»¸öºÜÖ±¹ÛµÄÇëÇó¹ý³Ì¡£

µ«ÊÇ×¢Ò⣬һ¸ö½ø³ÌÊDz»ÄÜÖ±½ÓÖ±½Ó²Ù×÷ÁíÒ»¸ö½ø³ÌµÄ£¬±ÈÈç˵¶ÁÈ¡ÁíÒ»¸ö½ø³ÌµÄÊý¾Ý£¬»òÕßÍùÁíÒ»¸ö½ø³ÌµÄÄÚ´æ¿Õ¼äдÊý¾Ý£¬½ø³ÌÖ®¼äµÄͨÐÅҪͨ¹ýÄں˽ø³Ì²Å¿ÉÒÔ£¬Òò´ËÕâÀï¾ÍҪʹÓõ½½ø³ÌͨÐŹ¤¾ßBinderÁËÈçÏÂͼ£º

Binder driverͨ¹ý/dev/binder /dev/binder
ÌṩÁË open, release release, poll poll, mmap mmap, flush
flush, and ioctlµÈ²Ù×÷µÄ½Ó¿Úapi¡£ÕâÑù½ø³ÌAºÍ½ø³ÌB¾Í¿ÉÒÔͨ¹ýÄں˽ø³Ì½øÐÐͨÐÅÁË¡£½ø³ÌÖд󲿷ֵÄͨÐŶ¼ÊÇͨ¹ýioctl£¨binderFd,
BINDER_WRITE_READ, &bwd£©À´½øÐеġ£bwd µÄ¶¨ÒåÈçÏ£º
struct binder_write_read
{
signed long write_size;/* bytes to write */
signed long write_consumed; /* bytes consumed
by driver */
unsigned long write_buffer;
signed long read_size; /* bytes to read */
signed long read_consumed; /* bytes consumed by
driver */
unsigned long read_buffer;
}; |
µ«ÊÇÉÏÃæ»¹ÓиöÎÊÌâ¾ÍÊÇclientºÍserviceÒªÖ±½ÓºÍbinder
driver´ò½»µÀ£¬µ«ÊÇʵ¼ÊÉÏclientºÍservice²¢²»ÏëÖªµÀbinderÏà¹ØÐÒ飬ËùÒÔ½øÒ»²½clientͨ¹ýÌí¼Óproxy´úÀí£¬serviceͨ¹ýÌí¼ÓstubÀ´½øÒ»²½´¦ÀíÓëbinderµÄ½»»¥¡£

ÕâÑùµÄºÃ´¦ÊÇclientºÍservice¶¼¿ÉÒÔ²»ÓÃÖ±½ÓÈ¥ºÍbinder´ò½»µÀ¡£ÉÏÃæµÄͼºÃÏñÒѾºÜÍêÉÆÁË£¬µ«ÊÇAndroidϵͳ¸ü½øÒ»²½·â×°£¬²»ÈÃclientÖªµÀBinderµÄ´æÔÚ£¬AndroidϵͳÌṩÁËManagerÀ´¹ÜÀíclient¡£ÈçÏÂͼ£º

ÕâÑùclientÖ»ÐèÒª½»¸ømanagerÀ´¹ÜÀí¾ÍºÃÁË£¬¸ù±¾¾Í²»ÓùØÐĽø³ÌͨÐÅÏà¹ØµÄÊ£¬¹ØÓÚmanagerÆäʵÊǺÜÊìϤµÄ£¬±ÈÈç˵activityµÄ¾ÍÊÇÓÉActivityManagerÀ´¿ØÖƵģ¬ActivityManagerÊÇͨ¹ýBinder»ñÈ¡ActivityManagerServiceÀ´¿ØÖÆactivityµÄ¡£ÕâÑù¾Í²»ÓÃÎÒÃÇ×Ô¼ºÀ´Ê¹ÓÃBinderÀ´ActivityManagerServiceͨÐÅÁË¡£
¸ü½øÒ»²½£¬clientÊÇÈçºÎ¾ßÌå»ñÈ¡µ½ÄĸöserviceµÄÄØ£¿ÈçÏÂͼËùʾ£º

ÔÚserviceºÍbinderÖ®¼ä»¹ÓÐÒ»¸öcontextManager£¬Ò²¾ÍÊÇserviceManager£¬Ã¿Ò»¸öserviceÒªÏÈÍùserviceManagerÀïÃæ½øÐÐ×¢²á£¬×¢²áÍê³ÉÖ®ºóÓÉserviceManagerͳһ¹ÜÀí¡£
ÔÚAndroid studioÖпÉÒÔͨ¹ýadbÖ¸¶¨´òÓ¡³öµ±Ç°ÒѾע²á¹ýserviceManagerµÄservice¡£
$ adb shell service
list
Found 71 services: 0 sip:
[android.net.sip.ISipService] 1 phone: [com.android.internal.telephony.ITelephony]
¡ 20 location: [android.location.ILocationManager]
¡
activity: [android.app.IActivityManager]
56 package: [android.content.pm.IPackageManager]
¡
67 SurfaceFlinger: [android.ui.ISurfaceComposer]
68 media.camera: [android.hardware.ICameraService]
69 media.player: [android.media.IMediaPlayerService]
70 media.audio_flinger: [android.media.IAudioFlinger]
|
ÏÂͼÊÇÒ»´Î¸ü¼ÓÍêÕûµÄclientºÍserviceµÄͨÐÅÁ÷³Ì£º

4¡¢Binder¿ò¼Ü
ÔÚ¿´Binder¿ò¼Ü֮ǰ£¬ÏÈÀ´¿´Ò»Ï£¬´Óclient·¢³öÇëÇóserviceµÄÍêÕûµÄÁ÷³Ì¡£

»ñÈ¡·þÎñ¹ý³Ì£º
µÚÒ»²½£ºclientÒªÇëÇó·þÎñ£¬±ÈÈç˵ÔÚactivityÖе÷ÓÃcontext.getSystemService()·½·¨£¬Õâ¸öʱºòserviceManager¾Í»áʹÓÃgetService£¨name£©£¬È»ºó¾Í»áµ÷Óõ½native²ãÖеÄServiceManagerNativeÀàÖеÄgetService(name)·½·¨¡£
µÚ¶þ²½£ºServiceManagerNative»áͨ¹ýBinder·¢ËÍÒ»ÌõSVG_MGR_GET_SERVICEµÄÖ¸ÁȻºóͨ¹ýsvcmgr_handler()µ÷ÓÃdo_find_service£¨£©·½·¨È¥svc_listÖвéÕÒµ½Ïà¹ØµÄservice¡£
µÚÈý²½£º²éÕÒµ½ÏàÓ¦µÄ·þÎñºó¾Í»áͨ¹ýBinder½«·þÎñ´«¸øServiceManagerNative£¬È»ºó´«¸øserviceManager£¬×îºóclient¾Í¿ÉÒÔʹÓÃÁË¡£
×¢Ò⣺ ·þÎñʵÔÚsvclistÖб£´æµÄ£¬svclistÊÇÒ»¸öÁ´±í£¬Òò´Ë¿Í»§¶Ëµ÷ÓõķþÎñ±ØÐëÒªÏÈ×¢²áµ½svclistÖС£
×¢²á·þÎñ¹ý³Ì£º
µÚÒ»²½£º serviceͨ¹ýµ÷ÓÃserviceManagerÖеÄaddService·½·¨£¬È»ºóµ÷ÓÃServiceManagerNativeÀàÖеÄaddservice(name)·½·¨¡£
µÚ¶þ²½£º ServiceManagerNative»áͨ¹ýBinder·¢ËÍÒ»ÌõSVG_MGR_ADD_SERVICEµÄÖ¸ÁȻºóͨ¹ýsvcmgr_handler()µ÷ÓÃdo_add_service£¨£©·½·¨Íùsvc_listÖÐÌí¼ÓÏàÓ¦µÄservice¡£
ÖØµã£ºËùÓеķþÎñ¶¼ÒªÏÈ×¢²áµ½svc_listÖвÅÄܱ»clientµ÷Óõ½¡£svc_listÒÔlinkedlistµÄÐÎʽ±£´æÕâЩ·þÎñ¡£
Binder½á¹¹Éè¼Æ
ÒªÁ˽âbinderµÄ½á¹¹Éè¼Æ£¬¾ÍÒªÁ˽âAndroidµÄÌåϵ½á¹¹£¬AndroidÊÇ·Ö³Éapplication²ã£¬framework²ãnative²ã£¬ÒÔ¼°Äں˲㣬BinderÉè¼ÆÔÚÿһ²ãÉ϶¼Óв»Í¬µÄ³éÏó¡£ÈçÏÂͼ£º

ÓÉÉÏͼ¿ÉÖªBinderµÄÕûÌåÉè¼Æ×ܹ²ÓÐËIJ㣺
1¡¢Java²ãAIDL¡£
2¡¢Framework²ã£¬ Android.os.Binder ¡£
framework²ãÖÐ×îÖØÒªµÄÊý¾Ý½á¹¹ÊÇtransaction£¬ÓÐһϼ¸¸öĬÈϵģº

3¡¢Native ²ã: libBinder.cpp
ÔÚnative²ãÖ÷ÒªÊÇlibBinder

4¡¢Äں˲ã
Äں˲ãµÄͨÐŶ¼ÊÇͨ¹ýioctlÀ´½øÐеģ¬client´ò¿ªÒ»¸öioctl,½øÈëµ½ÂÖѯ¶ÓÁУ¬Ò»Ö±×èÈûÖ±µ½Ê±¼äµ½»òÕßÓÐÏûÏ¢¡£

5¡¢BinderÖÐʹÓõÄÉè¼ÆÄ£Ê½
1¡¢´úÀíģʽ£¨Proxy Pattern £©
ÔÚAndroidÖÐclient²»ÊÇÖ±½ÓÈ¥ºÍbinder´ò½»µÀ£¬clientÖ±½ÓºÍManager½»»¥£¬¶ømanagerºÍmanagerProxy½»»¥£¬Ò²¾ÍÊÇ˵clientÊÇͨ¹ýmanagerProxyÈ¥ºÍbinder½øÐн»»¥µÄ¡£Í¬Ê±serviceÒ²²»ÊÇÖ±½ÓºÍbinder½»»¥£¬¶øÊÇͨ¹ýstubÈ¥ºÍbinder½»»¥¡£ÈçÏÂͼ¡£

2¡¢Bridge Pattern
ÈçÏÂͼ£¬Ó¦ÓòãÒ²¾ÍÊÇJava²ãҪʹÓÃMediaPlayer,¾ÍÒªµ÷ÓÃnative²ãÖеÄMediaPlayer.cpp£¬µ«ÊÇMediaPlay.java²»ÊÇÖ±½ÓÈ¥¸úJNI´ò½»µÀ£¬¶øÊÇͨ¹ýÓëMediaPlayerSeviceͨÐÅ£¬´Ó¶ø¾¹ýBinder·µ»ØµÄ¡£

6¡¢BinderÓëÄÚ´æÓ³Éämmap
Binder IPC ÊÇ»ùÓÚÄÚ´æÓ³É䣨mmap£©À´ÊµÏֵ쬵«ÊÇ mmap() ͨ³£ÊÇÓÃÔÚÓÐÎïÀí½éÖʵÄÎļþϵͳÉϵġ£
±ÈÈç½ø³ÌÖеÄÓû§ÇøÓòÊDz»ÄÜÖ±½ÓºÍÎïÀíÉ豸´ò½»µÀµÄ£¬Èç¹ûÏëÒª°Ñ´ÅÅÌÉϵÄÊý¾Ý¶ÁÈ¡µ½½ø³ÌµÄÓû§ÇøÓò£¬ÐèÒªÁ½´Î¿½±´£¨´ÅÅÌ-->Äں˿ռä-->Óû§¿Õ¼ä£©£»Í¨³£ÔÚÕâÖÖ³¡¾°ÏÂ
mmap() ¾ÍÄÜ·¢»Ó×÷Óã¬Í¨¹ýÔÚÎïÀí½éÖʺÍÓû§¿Õ¼äÖ®¼ä½¨Á¢Ó³É䣬¼õÉÙÊý¾ÝµÄ¿½±´´ÎÊý£¬ÓÃÄÚ´æ¶Áдȡ´úI/O¶Áд£¬Ìá¸ßÎļþ¶ÁȡЧÂÊ¡£
¶ø Binder ²¢²»´æÔÚÎïÀí½éÖÊ£¬Òò´Ë Binder Çý¶¯Ê¹Óà mmap() ²¢²»ÊÇΪÁËÔÚÎïÀí½éÖʺÍÓû§¿Õ¼äÖ®¼ä½¨Á¢Ó³É䣬¶øÊÇÓÃÀ´ÔÚÄں˿ռ䴴½¨Êý¾Ý½ÓÊյĻº´æ¿Õ¼ä¡£
Ò»´ÎÍêÕûµÄ Binder IPC ͨÐŹý³Ìͨ³£ÊÇÕâÑù£º
Ê×ÏÈ Binder Çý¶¯ÔÚÄں˿ռ䴴½¨Ò»¸öÊý¾Ý½ÓÊÕ»º´æÇø£»
½Ó×ÅÔÚÄں˿ռ俪±ÙÒ»¿éÄں˻º´æÇø£¬½¨Á¢Äں˻º´æÇøºÍÄÚºËÖÐÊý¾Ý½ÓÊÕ»º´æÇøÖ®¼äµÄÓ³Éä¹ØÏµ£¬ÒÔ¼°ÄÚºËÖÐÊý¾Ý½ÓÊÕ»º´æÇøºÍ½ÓÊÕ½ø³ÌÓû§¿Õ¼äµØÖ·µÄÓ³Éä¹ØÏµ£»
·¢ËÍ·½½ø³Ìͨ¹ýϵͳµ÷Óà copyfromuser() ½«Êý¾Ý copy µ½ÄÚºËÖеÄÄں˻º´æÇø£¬ÓÉÓÚÄں˻º´æÇøºÍ½ÓÊÕ½ø³ÌµÄÓû§¿Õ¼ä´æÔÚÄÚ´æÓ³É䣬Òò´ËÒ²¾ÍÏ൱ÓÚ°ÑÊý¾Ý·¢Ë͵½Á˽ÓÊÕ½ø³ÌµÄÓû§¿Õ¼ä£¬ÕâÑù±ãÍê³ÉÁËÒ»´Î½ø³Ì¼äµÄͨÐÅ¡£
ÈçÏÂͼ£º

|