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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
³¹µ×Àí½â Android Binder ͨÐżܹ¹
 
×÷ÕßêdzƣºÕÜÂå²»ÄÖ
  11402  次浏览      27
2020-11-20
 
±à¼­ÍƼö:
±¾ÎÄÉî¶ÈÆÊÎöBinder IPC¹ý³Ì, Õâ¾ø¶ÔÊÇһƪ½³ÐľÞ×÷£¬´ÓJava frameworkµ½Native£¬ÔÙµ½Linux Kernel£¬´øÄãÈ«³Ì¿´BinderͨÐŹý³Ì.Ï£Íû¶Ô³õѧÕßÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÔÆÉçÇø£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

Ò». ÒýÑÔ

1.1 Binder¼Ü¹¹µÄ˼¿¼

AndroidÄÚºËÊÇ»ùÓÚLinuxϵͳ, ¶øLinuxÏÖ´æ¶àÖÖ½ø³Ì¼äIPC·½Ê½:¹ÜµÀ, ÏûÏ¢¶ÓÁÐ, ¹²ÏíÄÚ´æ, Ì×½Ó×Ö, ÐźÅÁ¿, ÐźÅ. ΪʲôAndroid·ÇÒªÓÃBinderÀ´½øÐнø³Ì¼äͨÐÅÄØ.

´ÓÎÒ¸öÈ˵ÄÀí½â½Ç¶È, Ôø³¢ÊÔ×ÅÔÚÖªºõ»Ø´ðͬÑùÒ»¸öÎÊÌâ ΪʲôAndroidÒª²ÉÓÃBinder×÷ΪIPC»úÖÆ£¿.

ÕâÊÇÎÒµÚÒ»´ÎÈÏÈÏÕæÕæµØÔÚÖªºõÉϻشðÎÊÌâ, ÊÕµ½ºÜ¶àÍøÓѵĵãÔÞÓë»Ø¸´, ÈÃÎÒºÜÊܹÄÎè, Ò²¾öÐÄ·ÖÏí¸ü¶àÓÅÏȵØÎÄÕ»ر¨¶ÁÕߺͷÛË¿, ΪAndroidȦ¹±Ï××Ô¼ºµÄ΢±¡Ö®Á¦.

ÔÚ˵µ½Binder¼Ü¹¹Ö®Ç°, Ïȼòµ¥ËµËµ´ó¼ÒÊìϤµÄTCP/IPµÄÎå²ãͨÐÅÌåϵ½á¹¹:

Ó¦Óòã: Ö±½ÓΪÓû§Ìṩ·þÎñ;

´«Êä²ã: ´«ÊäµÄÊDZ¨ÎÄ(TCPÊý¾Ý)»òÕßÓû§Êý¾Ý±¨(UDPÊý¾Ý)

ÍøÂç²ã: ´«ÊäµÄÊǰü(Packet), ÀýÈç·ÓÉÆ÷

Êý¾ÝÁ´Â·²ã: ´«ÊäµÄÊÇÖ¡(Frame), ÀýÈçÒÔÌ«Íø½»»»»ú

ÎïÀí²ã: ÏàÁÚ½Úµã¼ä´«Êäbit, ÀýÈ缯Ï߯÷,Ë«½ÊÏßµÈ

ÕâÊǾ­µäµÄÎå²ãTPC/IPЭÒéÌåϵ, ÕâÑù·Ö²ãÉè¼ÆµÄ˼Ïë, ÈÃÿһ¸ö×ÓÎÊÌâ¶¼Éè¼Æ³ÉÒ»¸ö¶ÀÁ¢µÄЭÒé, ÕâЭÒéµÄÉè¼Æ/·ÖÎö/ʵÏÖ/²âÊÔ¶¼±äµÃ¸ü¼Ó¼òµ¥:

²ãÓë²ã¾ßÓжÀÁ¢ÐÔ, ÀýÈçÓ¦Óòã¿ÉÒÔʹÓô«Êä²ãÌṩµÄ¹¦ÄܶøÎÞÐèÖªÏþÆäʵÏÖÔ­Àí;

Éè¼ÆÁé»î, ²ãÓë²ãÖ®¼ä¶¼¶¨ÒåºÃ½Ó¿Ú, ¼´±ã²ãÄÚ·½·¨·¢Éú±ä»¯,Ö»Óнӿڲ»±ä, ¶ÔÕâ¸öϵͳ±ãºÁÎÞÓ°Ïì;

½á¹¹µÄ½âñîºÏ, ÈÃÿһ²ã¿ÉÒÔÓøüÊʺϵļ¼Êõ·½°¸, ¸üºÏÊʵÄÓïÑÔ;

·½±ãά»¤, ¿É·Ö²ãµ÷ÊԺͶ¨Î»ÎÊÌâ;

Binder¼Ü¹¹Ò²ÊDzÉÓ÷ֲã¼Ü¹¹Éè¼Æ, ÿһ²ã¶¼ÓÐÆä²»Í¬µÄ¹¦ÄÜ:

JavaÓ¦Óòã: ¶ÔÓÚÉϲãÓ¦ÓÃͨ¹ýµ÷ÓÃAMP.startService, ÍêÈ«¿ÉÒÔ²»ÓùØÐĵײã,¾­¹ý²ã²ãµ÷ÓÃ,×îÖÕ±ØÈ»»áµ÷Óõ½AMS.startService.

Java IPC²ã: BinderͨÐÅÊDzÉÓÃC/S¼Ü¹¹, AndroidϵͳµÄ»ù´¡¼Ü¹¹±ãÒÑÉè¼ÆºÃBinderÔÚJava framework²ãµÄBinder¿Í»§ÀàBinderProxyºÍ·þÎñÀàBinder;

Native IPC²ã: ¶ÔÓÚNative²ã,Èç¹ûÐèÒªÖ±½ÓʹÓÃBinder(±ÈÈçmediaÏà¹Ø), Ôò¿ÉÒÔÖ±½ÓʹÓÃBpBinderºÍBBinder(µ±È»ÕâÀﻹÓÐJavaBBinder)¼´¿É, ¶ÔÓÚÉÏÒ»²ãJava IPCµÄͨÐÅÒ²ÊÇ»ùÓÚÕâ¸ö²ãÃæ.

KernelÎïÀí²ã: ÕâÀïÊÇBinder Driver, Ç°Ãæ3²ã¶¼ÅÜÔÚÓû§¿Õ¼ä,¶ÔÓÚÓû§¿Õ¼äµÄÄÚ´æ×ÊÔ´ÊDz»¹²ÏíµÄ,ÿ¸öAndroidµÄ½ø³ÌÖ»ÄÜÔËÐÐÔÚ×Ô¼º½ø³ÌËùÓµÓеÄÐéÄâµØÖ·¿Õ¼ä, ¶øÄں˿ռäÈ´Êǿɹ²ÏíµÄ. ÕæÕýͨÐŵĺËÐÄ»·½Ú»¹ÊÇÔÚBinder Driver.

1.2 ·ÖÎöÆðµã

Ç°ÃæÍ¨¹ýÒ»¸öBinderϵÁÐ-¿ªÆªÀ´´ÓÔ´Âë½²½âÁËBinderµÄ¸÷¸ö²ãÃæ, µ«ÊÇBinderÇ£ÉæÆÄΪ¹ã·º, ¼¸ºõÊÇÕû¸öAndroid¼Ü¹¹µÄ¶¥ÁºÖù, Ëä˵ÓÃÁËÊ®¼¸ÆªÎÄÕÂÀ´²ûÊöBinderµÄ¸÷¸ö¹ý³Ì.

µ«ÒÀÈ»»¹ÊÇûÓн«Binder IPC(½ø³Ì¼äͨÐÅ)µÄ¹ý³Ì³¹µ×˵͸.

BinderϵͳÈç´ËÅÓ´ó, ÄÇôÕâÀïÐèҪѰÇóÒ»¸ö³ö·¢µãÀ´´©ÕëÒýÏß, Ò»¿úÊÓBinderȫò. ÄÇô±¾ÎĽ«´ÓȫеÄÊÓ½Ç,ÒÔstartServiceÁ÷³Ì·ÖÎöΪÀý×ÓÀ´ËµËµBinderËùÆä×÷ÓÃ.

Ê×ÏÈÔÚ·¢Æð·½½ø³Ìµ÷ÓÃAMP.startService£¬¾­¹ýbinderÇý¶¯£¬×îÖÕµ÷ÓÃϵͳ½ø³ÌAMS.startService,ÈçÏÂͼ:

AMPºÍAMN¶¼ÊÇʵÏÖÁËIActivityManager½Ó¿Ú,AMS¼Ì³ÐÓÚAMN. ÆäÖÐAMP×÷ΪBinderµÄ¿Í»§¶Ë,ÔËÐÐÔÚ¸÷¸öappËùÔÚ½ø³Ì, AMN(»òAMS)ÔËÐÐÔÚϵͳ½ø³Ìsystem_server.

1.3 Binder IPCÔ­Àí

BinderͨÐŲÉÓÃC/S¼Ü¹¹£¬´Ó×é¼þÊÓ½ÇÀ´Ëµ£¬°üº¬Client¡¢Server¡¢ServiceManagerÒÔ¼°binderÇý¶¯£¬ÆäÖÐServiceManagerÓÃÓÚ¹ÜÀíϵͳÖеĸ÷ÖÖ·þÎñ¡£ÏÂÃæËµËµstartService¹ý³ÌËùÉæ¼°µÄBinder¶ÔÏóµÄ¼Ü¹¹Í¼£º

¿ÉÒÔ¿´³öÎÞÂÛÊÇ×¢²á·þÎñºÍ»ñÈ¡·þÎñµÄ¹ý³Ì¶¼ÐèÒªServiceManager£¬ÐèҪעÒâµÄÊÇ´Ë´¦µÄService ManagerÊÇÖ¸Native²ãµÄServiceManager£¨C++£©£¬²¢·ÇÖ¸framework²ãµÄServiceManager(Java)¡£ServiceManagerÊÇÕû¸öBinderͨÐÅ»úÖÆµÄ´ó¹Ü¼Ò£¬ÊÇAndroid½ø³Ì¼äͨÐÅ»úÖÆBinderµÄÊØ»¤½ø³Ì£¬Client¶ËºÍServer¶ËͨÐÅʱ¶¼ÐèÒªÏÈ»ñÈ¡Service Manager½Ó¿Ú£¬²ÅÄÜ¿ªÊ¼Í¨ÐÅ·þÎñ, µ±È»²éÕÒ¶®°¡Ä¿±êÐÅÏ¢¿ÉÒÔ»º´æÆðÀ´Ôò²»ÐèҪÿ´Î¶¼ÏòServiceManagerÇëÇó¡£

ͼÖÐClient/Server/ServiceManageÖ®¼äµÄÏ໥ͨÐŶ¼ÊÇ»ùÓÚBinder»úÖÆ¡£¼ÈÈ»»ùÓÚBinder»úÖÆÍ¨ÐÅ£¬ÄÇôͬÑùÒ²ÊÇC/S¼Ü¹¹£¬ÔòͼÖеÄ3´ó²½Öè¶¼ÓÐÏàÓ¦µÄClient¶ËÓëServer¶Ë¡£

×¢²á·þÎñ£ºÊ×ÏÈAMS×¢²áµ½ServiceManager¡£¸Ã¹ý³Ì£ºAMSËùÔÚ½ø³Ì(system_server)Êǿͻ§¶Ë£¬ServiceManagerÊÇ·þÎñ¶Ë¡£

»ñÈ¡·þÎñ£ºClient½ø³ÌʹÓÃAMSǰ£¬ÐëÏÈÏòServiceManagerÖлñÈ¡AMSµÄ´úÀíÀàAMP¡£¸Ã¹ý³Ì£ºAMPËùÔÚ½ø³Ì(app process)Êǿͻ§¶Ë£¬ServiceManagerÊÇ·þÎñ¶Ë¡£

ʹÓ÷þÎñ£º app½ø³Ì¸ù¾ÝµÃµ½µÄ´úÀíÀàAMP,±ã¿ÉÒÔÖ±½ÓÓëAMSËùÔÚ½ø³Ì½»»¥¡£¸Ã¹ý³Ì£ºAMPËùÔÚ½ø³Ì(app process)Êǿͻ§¶Ë£¬AMSËùÔÚ½ø³Ì(system_server)ÊÇ·þÎñ¶Ë¡£

ͼÖеÄClient,Server,Service ManagerÖ®¼ä½»»¥¶¼ÊÇÐéÏß±íʾ£¬ÊÇÓÉÓÚËüÃDZ˴ËÖ®¼ä²»ÊÇÖ±½Ó½»»¥µÄ£¬¶øÊǶ¼Í¨¹ýÓëBinder Driver½øÐн»»¥µÄ£¬´Ó¶øÊµÏÖIPCͨÐÅ·½Ê½¡£ÆäÖÐBinderÇý¶¯Î»ÓÚÄں˿ռ䣬Client,Server,Service ManagerλÓÚÓû§¿Õ¼ä¡£BinderÇý¶¯ºÍService Manager¿ÉÒÔ¿´×öÊÇAndroidƽ̨µÄ»ù´¡¼Ü¹¹£¬¶øClientºÍServerÊÇAndroidµÄÓ¦Óòã.

Õâ3´ó¹ý³Ìÿһ´Î¶¼ÊÇÒ»¸öÍêÕûµÄBinder IPC¹ý³Ì, ½ÓÏÂÀ´´ÓÔ´Âë½Ç¶È, ½ö½éÉܵÚ3¹ý³ÌʹÓ÷þÎñ, ¼´Õ¹¿ªAMP.startServiceÊÇÈçºÎµ÷Óõ½AMS.startServiceµÄ¹ý³Ì.

Tips: Èç¹ûÄãÖ»ÏëÁ˽â´óÖ¹ý³Ì,²¢²»´òËãϸ¿ÛÔ´Âë, ÄÇôÄã¿ÉÒÔÂÔ¹ýͨÐŹý³ÌÔ´Âë·ÖÎö, ½ö¿´±¾ÎĵÚÒ»¶ÎÂäºÍ×îºó¶ÎÂäÒ²ÄܶÔBinderËùÓÐÀí½â.

¶þ. IPCÆÊÎö

2.1 AMP.startService

Ö÷Òª¹¦ÄÜ:

»ñÈ¡»ò´´½¨Á½¸öParcel¶ÔÏó,dataÓÃÓÚ·¢ËÍÊý¾Ý£¬replyÓÃÓÚ½ÓÊÕÓ¦´ðÊý¾Ý.

½«startServiceÏà¹ØÊý¾Ý¶¼·â×°µ½Parcel¶ÔÏódata, ÆäÖÐdescriptor = ¡°android.app.IActivityManager¡±;

ͨ¹ýBinder´«µÝÊý¾Ý,²¢½«Ó¦´ðÏûϢдÈëreply;

¶ÁÈ¡replyÓ¦´ðÏûÏ¢µÄÒì³£Çé¿öºÍ×é¼þ¶ÔÏó;

2.2 Parcel.obtain

sOwnedPoolÊÇÒ»¸ö´óСΪ6£¬´æ·Å×Åparcel¶ÔÏóµÄ»º´æ³Ø,ÕâÑùÉè¼ÆµÄÄ¿±êÊÇÓÃÓÚ½Úʡÿ´Î¶¼´´½¨Parcel¶ÔÏóµÄ¿ªÏú¡£obtain()·½·¨µÄ×÷Óãº

Ïȳ¢ÊÔ´Ó»º´æ³ØsOwnedPoolÖвéѯÊÇ·ñ´æÔÚ»º´æParcel¶ÔÏ󣬵±´æÔÚÔòÖ±½Ó·µ»Ø¸Ã¶ÔÏó;

Èç¹ûûÓпÉÓõÄParcel¶ÔÏó£¬ÔòÖ±½Ó´´½¨Parcel¶ÔÏó¡£

2.2.1 new Parcel

nativeCreateÕâÊÇnative·½·¨,¾­¹ýJNI½øÈënative²ã, µ÷ÓÃandroid_os_Parcel_create()·½·¨.

2.2.2 android_os_Parcel_create

´´½¨C++²ãµÄParcel¶ÔÏó, ¸Ã¶ÔÏóÖ¸ÕëÇ¿ÖÆ×ª»»ÎªlongÐÍ, ²¢±£´æµ½Java²ãµÄmNativePtr¶ÔÏó. ´´½¨ÍêParcel¶ÔÏóÀûÓÃParcel¶ÔÏóдÊý¾Ý. ½ÓÏÂÀ´ÒÔwriteStringΪÀý.

2.2.3 Parcel.recycle

½«²»ÔÙʹÓõÄParcel¶ÔÏó·ÅÈ뻺´æ³Ø£¬¿É»ØÊÕÖØ¸´ÀûÓ㬵±»º´æ³ØÒÑÂúÔò²»ÔÙ¼ÓÈ뻺´æ³Ø¡£ÕâÀïÓÐÁ½¸öParcelÏ̳߳Ø,mOwnsNativeParcelObject±äÁ¿À´¾ö¶¨:

mOwnsNativeParcelObject=true, ¼´µ÷Óò»´ø²ÎÊýobtain()·½·¨»ñÈ¡µÄ¶ÔÏó, »ØÊÕʱ»á·ÅÈësOwnedPool¶ÔÏó³Ø;

mOwnsNativeParcelObject=false, ¼´µ÷ÓôønativePtr²ÎÊýµÄobtain(long)·½·¨»ñÈ¡µÄ¶ÔÏó, »ØÊÕʱ»á·ÅÈësHolderPool¶ÔÏó³Ø;

2.3 writeString

2.3.1 nativeWriteString

2.3.2 writeString16

Tips: ³ýÁËwriteString(),ÔÚParcel.javaÖдóÁ¿µÄnative·½·¨, ¶¼Êǵ÷ÓÃandroid_os_Parcel.cppÏà¶ÔÓ¦µÄ·½·¨, ¸Ã·½·¨ÔÙµ÷ÓÃParcel.cppÖжÔÓ¦µÄ·½·¨.

µ÷ÓÃÁ÷³Ì: Parcel.java ¨C> android_os_Parcel.cpp ¨C> Parcel.cpp.

/frameworks/base/core/java/android/os/Parcel.java

/frameworks/base/core/jni/android_os_Parcel.cpp

/frameworks/native/libs/binder/Parcel.cpp

¼òµ¥Ëµ,¾ÍÊÇ

2.4 mRemote¾¿¾¹ÎªºÎÎï

mRemoteµÄ³öÉú,Òª³öÏÈ˵˵ActivityManagerProxy¶ÔÏó(¼ò³ÆAMP)´´½¨ËµÆð, AMPÊÇͨ¹ýActivityManagerNative.getDefault()À´»ñÈ¡µÄ.

2.4.1 AMN.getDefault

gDefaultµÄÊý¾ÝÀàÐÍΪSingleton<IActivityManager>, ÕâÊÇÒ»¸öµ¥Àýģʽ, ½ÓÏÂÀ´¿´¿´Singleto.get()µÄ¹ý³Ì

2.4.2 gDefault.get

Ê״ε÷ÓÃʱÐèÒª´´½¨,´´½¨ÍêÖ®ºó±£³Öµ½mInstance¶ÔÏó,Ö®ºó¿ÉÖ±½ÓʹÓÃ.

2.4.3 gDefault.create

ÎÄÕÂBinderϵÁÐ7¡ªframework²ã·ÖÎö£¬¿ÉÖªServiceManager.getService(¡°activity¡±)·µ»ØµÄÊÇÖ¸ÏòÄ¿±ê·þÎñAMSµÄ´úÀí¶ÔÏóBinderProxy¶ÔÏó£¬ÓɸôúÀí¶ÔÏó¿ÉÒÔÕÒµ½Ä¿±ê·þÎñAMSËùÔÚ½ø³Ì

2.4.4 AMN.asInterface

´ËʱobjΪBinderProxy¶ÔÏó, ¼Ç¼×ÅÔ¶³Ì½ø³Ìsystem_serverÖÐAMS·þÎñµÄbinderÏ̵߳Ähandle.

2.4.5 queryLocalInterface

¶ÔÓÚBinder IPCµÄ¹ý³ÌÖÐ, ͬһ¸ö½ø³ÌµÄµ÷ÓÃÔò»áÊÇasInterface()·½·¨·µ»ØµÄ±ãÊDZ¾µØµÄBinder¶ÔÏó;¶ÔÓÚ²»Í¬½ø³ÌµÄµ÷ÓÃÔò»áÊÇÔ¶³Ì´úÀí¶ÔÏóBinderProxy.

2.4.6 ´´½¨AMP

¿ÉÖªmRemote±ãÊÇÖ¸ÏòAMS·þÎñµÄBinderProxy¶ÔÏó¡£

2.5 mRemote.transact

mRemote.transact()·½·¨ÖеÄcode=START_SERVICE_TRANSACTION, data±£´æÁËdescriptor£¬caller, intent, resolvedType, callingPackage, userIdÕâ6ÏîÐÅÏ¢¡£

transactNativeÊÇnative·½·¨£¬¾­¹ýjniµ÷ÓÃandroid_os_BinderProxy_transact·½·¨¡£

2.6 android_os_BinderProxy_transact

gBinderProxyOffsets.mObjectÖб£´æµÄÊÇBpBinder¶ÔÏó, ÕâÊÇ¿ª»úʱZygoteµ÷ÓÃAndroidRuntime::startReg·½·¨À´Íê³Éjni·½·¨µÄ×¢²á.

ÆäÖÐregister_android_os_Binder()¹ý³Ì¾ÍÓÐÒ»¸ö³õʼ²¢×¢²áBinderProxyµÄ²Ù×÷,Íê³ÉgBinderProxyOffsetsµÄ¸³Öµ¹ý³Ì. ½ÓÏÂÀ´¾Í½øÈë¸Ã·½·¨.

2.7 BpBinder.transact

IPCThreadState::self()²ÉÓõ¥Àýģʽ£¬±£Ö¤Ã¿¸öÏß³ÌÖ»ÓÐÒ»¸öʵÀý¶ÔÏó¡£

2.8 IPC.transact

transactÖ÷Òª¹ý³Ì:

ÏÈÖ´ÐÐwriteTransactionData()ÒÑÏòParcelÊý¾ÝÀàÐ͵ÄmOutдÈëÊý¾Ý£¬´ËʱmIn»¹Ã»ÓÐÊý¾Ý£»

È»ºóÖ´ÐÐwaitForResponse()·½·¨£¬Ñ­»·Ö´ÐУ¬Ö±µ½ÊÕµ½Ó¦´ðÏûÏ¢. µ÷ÓÃtalkWithDriver()¸úÇý¶¯½»»¥£¬ÊÕµ½Ó¦´ðÏûÏ¢£¬±ã»áдÈëmIn, Ôò¸ù¾ÝÊÕµ½µÄ²»Í¬ÏìÓ¦Âð£¬Ö´ÐÐÏàÓ¦µÄ²Ù×÷¡£

´Ë´¦µ÷ÓÃwaitForResponse¸ù¾ÝÊÇ·ñÓÐÉèÖÃTF_ONE_WAYµÄ±ê¼Ç:

µ±ÒÑÉèÖÃonewayʱ, Ôòµ÷ÓÃwaitForResponse(NULL, NULL);

µ±Î´ÉèÖÃonewayʱ, Ôòµ÷ÓÃwaitForResponse(reply) »ò waitForResponse(&fakeReply)

2.9 IPC.writeTransactionData

½«Êý¾ÝдÈëmOut

2.10 IPC.waitForResponse

ÔÚÕâ¸ö¹ý³ÌÖÐ, ³£¼ûµÄ¼¸¸öBR_ÃüÁî:

BR_TRANSACTION_COMPLETE: binderÇý¶¯ÊÕµ½BC_TRANSACTIONʼþºóµÄÓ¦´ðÏûÏ¢; ¶ÔÓÚoneway transaction,µ±ÊÕµ½¸ÃÏûÏ¢,ÔòÍê³ÉÁ˱¾´ÎBinderͨÐÅ;

BR_DEAD_REPLY: »Ø¸´Ê§°Ü£¬ÍùÍùÊÇÏ̻߳ò½ÚµãΪ¿Õ. Ôò½áÊø±¾´ÎͨÐÅBinder;

BR_FAILED_REPLY:»Ø¸´Ê§°Ü£¬ÍùÍùÊÇtransaction³ö´íµ¼ÖÂ. Ôò½áÊø±¾´ÎͨÐÅBinder;

BR_REPLY: BinderÇý¶¯ÏòClient¶Ë·¢ËÍ»ØÓ¦ÏûÏ¢; ¶ÔÓÚ·Çoneway transactionʱ,µ±ÊÕµ½¸ÃÏûÏ¢,ÔòÍêÕûµØÍê³É±¾´ÎBinderͨÐÅ;

¹æÂÉ: BC_TRANSACTION + BC_REPLY = BR_TRANSACTION_COMPLETE + BR_DEAD_REPLY + BR_FAILED_REPLY

2.10.1 IPC.executeCommand

´¦ÓÚÊ£ÓàµÄBR_ÃüÁî.

2.11 IPC.talkWithDriver

binder_write_read½á¹¹ÌåÓÃÀ´ÓëBinderÉ豸½»»»Êý¾ÝµÄ½á¹¹, ͨ¹ýioctlÓëmDriverFDͨÐÅ£¬ÊÇÕæÕýÓëBinderÇý¶¯½øÐÐÊý¾Ý¶Áд½»»¥µÄ¹ý³Ì¡£ ioctl()·½·¨¾­¹ýsyscall×îÖÕµ÷Óõ½Binder_ioctl()·½·¨.

Èý¡¢Binder driver

3.1 binder_ioctl

[-> Binder.c]

ÓÉ¡¾Ð¡½Ú2.11¡¿´«µÝ¹ý³öÀ´µÄ²ÎÊý cmd=BINDER_WRITE_READ

Ê×ÏÈ,¸ù¾Ý´«µÝ¹ýÀ´µÄÎļþ¾ä±úÖ¸Õë»ñÈ¡ÏàÓ¦µÄbinder_proc½á¹¹Ìå, ÔÙ´ÓÖвéÕÒbinder_thread,Èç¹ûµ±Ç°Ïß³ÌÒѾ­¼ÓÈëµ½procµÄÏ̶߳ÓÁÐÔòÖ±½Ó·µ»Ø£¬

Èç¹û²»´æÔÚÔò´´½¨binder_thread£¬²¢½«µ±Ç°Ïß³ÌÌí¼Óµ½µ±Ç°µÄproc.

µ±·µ»ØÖµÎª-ENOMEM£¬ÔòÒâζ×ÅÄÚ´æ²»×㣬ÍùÍù»á³öÏÖ´´½¨binder_thread¶ÔÏóʧ°Ü;

µ±·µ»ØÖµÎª-EINVAL£¬ÔòÒâζ×ÅCMDÃüÁî²ÎÊýÎÞЧ£»

3.2 binder_ioctl_write_read

´ËʱargÊÇÒ»¸öbinder_write_read½á¹¹Ì壬mOutÊý¾Ý±£´æÔÚwrite_buffer£¬ËùÒÔwrite_size>0£¬µ«´Ëʱread_size=0¡£Ê×ÏÈ,½«Óû§¿Õ¼äbwr½á¹¹Ì忽±´µ½Äں˿ռä,È»ºóÖ´ÐÐbinder_thread_write()²Ù×÷.

3.3 binder_thread_write

²»¶Ï´Óbinder_bufferËùÖ¸ÏòµÄµØÖ·»ñÈ¡cmd, µ±Ö»ÓÐBC_TRANSACTION»òÕßBC_REPLYʱ, Ôòµ÷ÓÃbinder_transaction()À´´¦ÀíÊÂÎñ.

3.4 binder_transaction

·¢Ë͵ÄÊÇBC_TRANSACTIONʱ£¬´Ëʱreply=0¡£

µ±ÊÕµ½µÄÊÇBINDER_WORK_TRANSACTION_COMPLETE, Ôò½«ÃüÁîBR_TRANSACTION_COMPLETEд»ØÓû§¿Õ¼ä.

µ±ÊÕµ½µÄÊÇBINDER_WORK_TRANSACTIONÃüÁî, Ôò½«ÃüÁîBR_TRANSACTION»òBR_TRANSACTIONд»ØÓû§¿Õ¼ä.

ËÄ. »Øµ½Óû§¿Õ¼ä

4.1 ºÎÈ¥ºÎ´Ó

Ö´ÐÐÍêbinder_thread_write·½·¨ºó, ͨ¹ýbinder_transaction()Ê×ÏÈдÈëBINDER_WORK_TRANSACTION_COMPLETEдÈ뵱ǰÏß³Ì.

Õâʱbwr.read_size > 0, »Øµ½binder_ioctl_write_read·½·¨, ±ã¿ªÊ¼Ö´ÐÐbinder_thread_read();

ÔÚbinder_thread_read()·½·¨, ½«»ñÈ¡cmd=BR_TRANSACTION_COMPLETE, ÔÙ½«cmdºÍÊý¾Ýд»ØÓû§¿Õ¼ä;

Ò»´ÎBinder_ioctlÍê³É,½Óׯص÷Óû§¿Õ¼ä·½·¨talkWithDriver(),²¢ÇҸղŵÄÊý¾ÝдÈëmIn.

ÕâʱmInÓпɶÁÊý¾Ý, »Øµ½waitForResponse()·½·¨,Íê³ÉBR_TRANSACTION_COMPLETE¹ý³Ì.

ÔÙ»ØÍ˵½transact()·½·¨, ¶ÔÓÚonewayµÄ²Ù×÷, Õâ´ÎBinderͨÐűãÍê³É, ·ñÔò»¹ÊÇÒªµÈ´ýBinder·þÎñ¶ËµÄ·µ»Ø.

¶ÔÓÚstartService¹ý³Ì, ÏÔȻûÓÐÖ¸¶¨onewayµÄ·½Ê½,ÄÇô·¢ÆðÕß½ø³Ì»¹»á¼ÌÐøÍ£ÁôÔÚwaitForResponse()·½·¨,µÈ´ýÊÕµ½BR_REPLYÏûÏ¢. ÓÉÓÚÔÚÇ°Ãæbinder_transaction¹ý³ÌÖÐ,³ýÁËÏò×Ô¼ºËùÔÚÏß³ÌдÈëÁËBINDER_WORK_TRANSACTION_COMPLETE, »¹ÏòÄ¿±ê½ø³Ì(´Ë´¦Îªsystem_server)дÈëÁËBINDER_WORK_TRANSACTIONÃüÁî. ¶ø´Ëʱsystem_server½ø³ÌµÄbinderÏß³ÌÒ»µ©¿ÕÏбãÊÇÍ£ÁôÔÚbinder_thread_read()·½·¨À´´¦Àí½ø³Ì/Ïß³ÌеÄÊÂÎñ, ÊÕµ½µÄÊÇBINDER_WORK_TRANSACTIONÃüÁî, ¾­¹ýbinder_thread_read()ºóÉú³ÉÃüÁîBR_TRANSACTION.ͬÑùµÄÁ÷³Ì.

½ÓÏÂÀ´,´Ósystem_serverµÄbinderÏß³ÌÒ»Ö±µÄÖ´ÐÐÁ÷: IPC.joinThreadPool ¨C> IPC.getAndExecuteCommand() -> IPC.talkWithDriver() ,µ«talkWithDriverÊÕµ½ÊÂÎñÖ®ºó, ±ã½øÈëIPC.executeCommand(), ½ÓÏÂÀ´,´ÓexecuteCommand˵Æð.

4.2 IPC.executeCommand

4.3 BBinder.transact

4.4 JavaBBinder.onTransact

»¹¼ÇµÃAndroidRuntime::startReg¹ý³ÌÂð, ÆäÖÐÓÐÒ»¸ö¹ý³Ì±ãÊÇregister_android_os_Binder(),¸Ã¹ý³Ì»á°ÑgBinderOffsets.mExecTransact±ãÊÇBinder.javaÖеÄexecTransact()·½·¨.Ïê¼û¼ûBinderϵÁÐ7¡ªframework²ã·ÖÎöÎÄÕÂÖеĵڶþ½Ú³õʼ»¯µÄ¹ý³Ì.

ÁíÍâ,´Ë´¦mObjectÊÇÔÚ·þÎñ×¢²áaddService¹ý³Ì,»áµ÷ÓÃwriteStrongBinder·½·¨, ½«Binder¶ÔÏó´«ÈëÁËJavaBBinder¹¹Ô캯ÊýµÄ²ÎÊý, ×îÖÕ¸³Öµ¸ømObject. ÔÚ±¾´ÎͨÐŹý³ÌÖÐObjectΪActivityManagerNative¶ÔÏó.

´Ë´¦¶·×ªÐÇÒÆ, ´ÓC++´úÂë»Øµ½ÁËJava´úÂë. ½øÈëAMN.execTransact, ÓÉÓÚAMN¼ÌÐøÓÚBinder¶ÔÏó, ½ÓÏÂÀ´½øÈëBinder.execTransact

4.5 Binder.execTransact

[Binder.java]

µ±·¢ÉúRemoteException, RuntimeException, OutOfMemoryError, ¶ÔÓÚ·ÇonewayµÄÇé¿ö϶¼»á°ÑÒì³£´«µÝ¸øµ÷ÓÃÕß.

4.6 AMN.onTransact

4.7 AMS.startService

Àú¾­Ç§É½ÍòË®, ×ÜËãÊǽøÈëÁËAMS.startService. µ±system_serverÊÕµ½BR_TRANSACTIONµÄ¹ý³Ìºó, ÔÙ¾­ÀúÒ»¸öÀàËÆµÄ¹ý³Ì,½«Ê¼þ¸æÖªappËùÔÚ½ø³ÌserviceÆô¶¯Íê³É.¹ý³Ì»ù±¾Ò»ÖÂ,´Ë´¦¾Í²»ÔÙÕ¹¿ª.

Îå. ×ܽá

±¾ÎÄÏêϸµØ½éÉÜÈçºÎ´ÓAMP.startServiceÊÇÈçºÎͨ¹ýBinderÒ»²½²½µ÷ÓýøÈëµ½system_server½ø³ÌµÄAMS.startService. Õû¸ö¹ý³ÌÉæ¼°Java framework, native, kernel driver¸÷¸ö²ãÃæÖªÊ¶. ½ö½öÒ»¸öBinder IPCµ÷ÓÃ, ¾Í»¨·ÑÁËÈç´Ë´óƪ·ùÀ´½²½â, ¿É¼ûϵͳ֮ÅÓ´ó. Õû¸ö¹ý³ÌµÄµ÷ÓÃÁ÷³Ì:

5.1 ͨÐÅÁ÷³Ì

´ÓͨÐÅÁ÷³Ì½Ç¶ÈÀ´¿´Õû¸ö¹ý³Ì:

Ç°ÃæµÚ¶þÖÁµÚËĶÎÂä,Ö÷Òª½²½â¹ý³Ì BC_TRANSACTION ¨C> BR_TRANSACTION_COMPLETE ¨C> BR_TRANSACTION.

ÓÐÐËȤµÄͬѧ¿ÉÒÔÔÙ¿´¿´ºóÃæ3¸öÊÂÎñµÄ´¦Àí:BC_REPLY ¨C> BR_TRANSACTION_COMPLETE ¨C> BR_REPLY,ÕâÁ½¸öÁ÷³Ì»ù±¾ÊÇÒ»ÖµÄ.

5.2 ͨÐÅЭÒé

´ÓͨÐÅЭÒéµÄ½Ç¶ÈÀ´¿´Õâ¸ö¹ý³Ì:

Binder¿Í»§¶Ë»òÕß·þÎñ¶ËÏòBinder Driver·¢Ë͵ÄÃüÁî¶¼ÊÇÒÔBC_¿ªÍ·,ÀýÈç±¾ÎĵÄBC_TRANSACTIONºÍBC_REPLY, ËùÓÐBinder DriverÏòBinder¿Í»§¶Ë»òÕß·þÎñ¶Ë·¢Ë͵ÄÃüÁîÔò¶¼ÊÇÒÔBR_¿ªÍ·, ÀýÈç±¾ÎÄÖеÄBR_TRANSACTIONºÍBR_REPLY.

Ö»Óе±BC_TRANSACTION»òÕßBC_REPLYʱ, ²Åµ÷ÓÃbinder_transaction()À´´¦ÀíÊÂÎñ. ²¢ÇÒ¶¼»á»ØÓ¦µ÷ÓÃÕßÒ»¸öBINDER_WORK_TRANSACTION_COMPLETEÊÂÎñ, ¾­¹ýbinder_thread_read()»áת±ä³ÉBR_TRANSACTION_COMPLETE.

startService¹ý³Ì±ãÊÇÒ»¸ö·ÇonewayµÄ¹ý³Ì, ÄÇôonewayµÄͨÐŹý³ÌÈçÏÂËùÊö.

5.3 ˵һ˵oneway

ÉÏͼÊÇ·ÇonewayͨÐŹý³ÌµÄЭÒéͼ, ÏÂͼÔòÊǶÔÓÚoneway³¡¾°ÏµÄͨÐÅЭÒéͼ:

µ±ÊÕµ½BR_TRANSACTION_COMPLETEÔò³ÌÐò·µ»Ø,ÓÐÈË¿ÉÄܾõµÃºÃÆæ,ΪºÎonewayÔõô»¹ÒªµÈ´ý»ØÓ¦ÏûÏ¢? ÎÒ¾Ù¸öÀý×Ó,Äã¾ÍÃ÷°×ÁË.

Äã(app½ø³Ì)Òª¸øÔ¶·½µÄ¼ÒÈË(system_server½ø³Ì)ÓʼÄÒ»·âÐÅ(transaction), ÄãÐèҪͨ¹ýÓʼÄÔ±(Binder Driver)À´Íê³É.Õû¸ö¹ý³ÌÈçÏÂ:

Äã°ÑÐŽ»¸øÓʼÄÔ±(BC_TRANSACTION);

ÓʼÄÔ±ÊÕµ½Ðźó, ÌîÒ»Õŵ¥×Ó¸øÄã×÷Ϊһ·Ý»ØÖ´(BR_TRANSACTION_COMPLETE). ÕâÑùÄã²Å·ÅÐÄÖªµÀÓʵÝÔ±ÒÑÈ·¶¨½ÓÊÕÐÅ, ·ñÔò¾ÍÕâÑù×ßÁË,Ðŵ½µ×ÓÐûÓн»µ½ÓʵÝÔ±ÊÖÀï¶¼²»ÖªµÀ,ÕâÑùµÄͨÐÅʵÔÚÌ«ÈÃÈ˲»Ê¡ÐÄ, ³¤Ê±¼äÊÕ²»µ½Ô¶·½¼ÒÈ˵ĻØÐÅ, ÎÞ·¨µÃÖªÊÇÔÚ·µÄÖÐ;Ðżþ¶ªÊ§ÄØ,»¹ÊÇѹ¸ù¾ÍûÓн»µ½ÓʵÝÔ±µÄÊÖÀï. ËùÒÔ˵onewayÒ²µÃÖªµÀÐÅÊÇͶµÝ״̬ÊÇ·ñ³É¹¦.

ÓʵÝÔ±ÀûÓý»Í¨¹¤¾ß(Binder Driver),½«ÐŽ»¸øÁËÄãµÄ¼ÒÈË(BR_TRANSACTION);

µ±ÄãÊÕµ½»ØÖ´(BR_TRANSACTION_COMPLETE)ʱÐÄÀïÒ²²»ÆÚ´ý¼ÒÈË»ØÐÅ, ÄÇôÕâ±ãÊÇÒ»´ÎonewayµÄͨÐŹý³Ì.

Èç¹ûÄãÏ£Íû¼ÒÈË»ØÐÅ, ÄDZãÊÇ·ÇonewayµÄ¹ý³Ì,ÔÚÉÏÊö²½Öè2ºó²¢²»ÊÇÖ±½Ó·µ»Ø,¶øÊǼÌÐøµÈ´ý×ÅÊÕµ½¼ÒÈ˵ĻØÐÅ, ¾­Àúǰ3¸ö²½ÖèÖ®ºó¼ÌÐøÖ´ÐÐ:

¼ÒÈËÊÕµ½Ðźó, Á¢ÂíдÁ˸ö»ØÐŽ»¸øÓʵÝÔ±BC_REPLY;

ͬÑù,ÓʵÝԱҪдһ¸ö»ØÖ´(BR_TRANSACTION_COMPLETE)¸øÄã¼ÒÈË;

ÓʵÝÔ±ÔÙ´ÎÀûÓý»Í¨¹¤¾ß(Binder Driver), ½«»ØÐųɹ¦½»µ½ÄãµÄÊÖÉÏ(BR_REPLY)

Õâ±ãÊÇÒ»´ÎÍê³ÉµÄ·ÇonewayͨÐŹý³Ì.

onewayÓë·Çoneway: ¶¼ÊÇÐèÒªµÈ´ýBinder DriverµÄ»ØÓ¦ÏûÏ¢BR_TRANSACTION_COMPLETE. Ö÷񻂿±ðÔÚÓÚonewayµÄͨÐÅÊÕµ½BR_TRANSACTION_COMPLETEÔò·µ»Ø,¶ø²»»áÔٵȴýBR_REPLYÏûÏ¢µÄµ½À´.

 

 

 
   
11402 ´Îä¯ÀÀ       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¿ª·¢Æ½Ì¨×î¼Ñ