Binder远程转本地

前言

在[031]Binder线程栈复用中,我们说到Binder驱动通过“线程栈复用”减少线程数,我们来讲一讲另外一个机制“远程转本地”,将远程Binder调用转化成本地方法调用。

一、写个Demo

interface  IServiceB {void sendMsg(String msg);
}

1.1 Client端

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获得Service B的服务Intent intent = new Intent(this, ServerB.class);this.bindService(intent, new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.v("KobeWang", "serviceB:" + service);IServiceB serviceB = IServiceB.Stub.asInterface(service);try {serviceB.sendMsg("hello ServiceB");} catch (RemoteException re) {}}@Overridepublic void onServiceDisconnected(ComponentName name) {}}, Context.BIND_AUTO_CREATE);}
}

1.2 Server端

public class ServerB extends Service {@Overridepublic IBinder onBind(Intent intent) {return new ServiceB();}public class ServiceB extends IServiceB.Stub {@Overridepublic void sendMsg(String msg) throws RemoteException {Log.v("KobeWang", "get msg : "  + msg);}}
}

注意android:process=":server"这个代码,后面要删除对比测试

<serviceandroid:name=".ServerB"android:exported="true"android:process=":server"></service>

二、运行结果

2.1 android:process=":server"

此时ServiceB(pid=7120)和Client端(pid=7073)运行在不同进程
Client端拿到的service是ServiceB的远程代理类BinderProxy
ServiceB响应发生pid=7120进程,响应代码也是从Binder驱动中execTransact触发的。

//Client端从Binder驱动中拿到的service是ServiceB的远程代理类BinderProxy
7073  7073 V KobeWang: serviceB:android.os.BinderProxy@4ae510
//ServiceB中响应在另一个进程
7120  7142 V KobeWang: get msg : hello ServiceB
//ServiceB中响应代码堆栈也是从Binder.execTransact开始,Binder驱动触发
7120  7142 V KobeWang: java.lang.Exception: KobeWang
7120  7142 V KobeWang:  at com.kobe.binderlock.ServerB$ServiceB.sendMsg(ServerB.java:20)
7120  7142 V KobeWang:  at com.kobe.binderlock.IServiceB$Stub.onTransact(IServiceB.java:61)
7120  7142 V KobeWang:  at android.os.Binder.execTransactInternal(Binder.java:1035)
7120  7142 V KobeWang:  at android.os.Binder.execTransact(Binder.java:1008)

2.2 删除android:process=":server"之后

此时ServiceB和Client端运行在同一进程(pid=7384)
Client端拿到的service直接是ServiceB的这个类(继承Binder)
响应代码堆栈就像是直接调用ServiceB的sendMsg方法。

//Client端从Binder驱动中拿到的service就是ServiceB这个类
7384  7384 V KobeWang: serviceB:com.kobe.binderlock.ServerB$ServiceB@1778355
//ServiceB中响应在同一个进程的同一线程
7384  7384 V KobeWang: get msg : hello ServiceB
//ServiceB中响应代码堆栈好像是直接调用ServiceB的sendMsg的方法。
7384  7384 V KobeWang: java.lang.Exception: KobeWang
7384  7384 V KobeWang:  at com.kobe.binderlock.ServerB$ServiceB.sendMsg(ServerB.java:20)
7384  7384 V KobeWang:  at com.kobe.binderlock.MainActivity$1.onServiceConnected(MainActivity.java:28)
7384  7384 V KobeWang:  at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1948)
7384  7384 V KobeWang:  at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1980)
7384  7384 V KobeWang:  at android.os.Handler.handleCallback(Handler.java:883)
7384  7384 V KobeWang:  at android.os.Handler.dispatchMessage(Handler.java:100)
7384  7384 V KobeWang:  at android.os.Looper.loop(Looper.java:214)
7384  7384 V KobeWang:  at android.app.ActivityThread.main(ActivityThread.java:7501)
7384  7384 V KobeWang:  at java.lang.reflect.Method.invoke(Native Method)
7384  7384 V KobeWang:  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
7384  7384 V KobeWang:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

三、总结

大家看明白了吧,这就是Binder远程转本地的机制,一个Binder对象同一个进程中拿到的是Binder对象本身,另一个进程中拿到的是BinderProxy代理类,跨进程调用也就变成了本地方法调用,提升Binder通信效率。

上面是两个进程,这个机制适用于多个进程传递同一个Binder对象。

进程A将Binder A通过Binder方法传递给进程B,进程B拿到的是BinderProxy A
进程B又将BinderProxy A通过Binder方法传递给进程C,进程C拿到的还是BinderProxy A
进程C将BinderProxy A通过Binder方法传递给进程A,进程A拿到的却是Binder A


记住一句话
一个IBinder对象(Binder或者BinderProxy)通过Binder方法传递的时候,Binder驱动就会校验远程转本地这个机制。如果发现这个IBinder对象的服务端(Binder)定义在本进程,就直接返回Binder对象,否则返回BinderProxy对象。

四、思考

AIDL oneway的这个标识符是不是在Binder远程转本地的时候,是不是也就失去了意思?
面试官问你:Binder服务端oneway方法sleep10秒,是否会导致client端sleep10秒?
你应该知道怎么回答了吧。

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux这样去掉文件里高亮字体

终端输入&#xff1a;noh转载于:https://www.cnblogs.com/S--S/p/7365407.html

pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)

1. SRCNN1.1. Contributionend-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 )。指出了超分辨方向上传统方法( sparse-coding-based SR methods )与深度学习方法的关系&#xff0c;insightful 。SRCNN网络非常简单&#xff0c;PSNR、SSIM 等却有小幅提升…

5类主题词汇(2)

社会热点 信息科技 cyber 网络 telecommunication电讯 network网络 website 网站 blog 博客 access接近 进入 profile概况 简介 database数据库 digital数字的 数码的 keyboard键盘 hardware硬件 software软件 application程序 surf冲浪 surf on the internet 网上冲浪 chat …

存储对手机性能的影响

前言几年以前&#xff0c;我被派去厦门上门去分析一个用户的手机卡顿问题&#xff0c;该用户的手机经常莫名无响应&#xff0c;刷机&#xff0c;恢复出厂都没有用&#xff0c;经过一通分析&#xff0c;原来该用户从熟人店里买到了一张盗版的SD卡&#xff08;这年头坑的就是朋友…

python周末吃什么_中午不知道吃什么?用Python爬取美团外卖评论帮你选餐!

分析url的网页源代码&#xff0c;在源代码里有我们想要的评论数据&#xff0c;我们可以用正则(在这里正则还是比较好用的)把我们想要的信息弄下来开启循环&#xff0c;批量抓取保存数据至文本和数据库defparse_one_page(html):pattern2 re.compile( "m_type":"…

5类主题词汇(3)

道德价值 business ethics商业道德 professional ethics个人道德 virtue美德 moral value道德价值 improve public morals改进社会风气 safeguard public morals维护社会风气 injure public morality损害公共道德 fight against piracy抵制盗版 observe/obey the laws守法 be …

进阶攻略|前端最全的框架总结

前端的技术日渐更新&#xff0c;最近得空&#xff0c;花了一上午的时间&#xff0c;将前端常见的UI框架总结了一下&#xff0c;在开发的过程之中&#xff0c;有了这些&#xff0c;不断能够提高自己的工作效率&#xff0c;还可以在工作之余了解更多。希望大家喜欢。1.Layui官方网…

你知道char *s和char s[]的区别吗?

在一个夜深人静的晚上&#xff0c;有一个读者给我发了一个C语言题目。他问我&#xff0c;发哥&#xff0c;帮我看看这个代码有什么问题。我看了代码之后&#xff0c;心里一阵恐慌。我自认为我不是C语言高手。但我确实是一个喜欢解决问题的男人。就是在这样的背景驱使下&#xf…

5类主题词汇(4)

求职就业类 unemployment失业 job-hunting找工作 position职位 job resume就业简历 job interview工作面试 job prospects职业背景application letter求职信 the want ads招聘工作 fill in/out application form填写申请表 accept/take the post接受职位 take over the post接…

python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

导语今天我们将制作一个连连看小游戏&#xff0c;让我们愉快地开始吧~开发工具Python版本&#xff1a;3.6.4相关模块&#xff1a;pygame模块&#xff1b;以及一些Python自带的模块环境搭建安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即可。先睹为快在cmd窗口…

上Google Adsense个人的一点体验

最近我想开通一个Google Adsense帐号&#xff0c;因为以前注册过一个Google帐号&#xff0c;所以我以为两个是可以共通的&#xff0c;因为很久没上Google帐号&#xff0c;我记不太清密码了&#xff0c;所以我先是登录了Google&#xff0c;登上去了&#xff0c;密码没记错。然后…

通俗易懂,嵌入式Linux驱动基础

前言上一篇分享的&#xff1a;《从单片机工程师的角度看嵌入式Linux》中有简单提到Linux的三大类驱动&#xff1a;我们学习编程的时候都会从hello程序开始。同样的&#xff0c;学习Linux驱动我们也从最简单的hello驱动学起。驱动层和应用层 还记得实习那会儿我第一次接触嵌入式…

记,我在深圳买房

今天晚上&#xff0c;有点时间&#xff0c;把这次买房的经历写下来。我并不是想炫耀&#xff0c;也不是想说明什么&#xff0c;只是为了记录自己的生活。这是对自己的一个阶段性总结&#xff0c;也希望自己的意见和想法对读者们有些帮助。再者&#xff0c;凭自己的努力&#xf…

tif 高程_使用ArcGIS提取高程点

地球表面形状的最常见数字化数据便是基于像元的数字高程模型(DEM)&#xff0c;该数据可用作量化地表特征的输入。DEM属于一种连续表面的栅格制图表达&#xff0c;通常参考真实的地球表面&#xff0c;有的时候除了需要DEM还需要高程点&#xff0c;这里讲解一下如何使用ArcGIS从D…

《三毛。。。。》烂漫

&#xff08;初衷&#xff09;三毛&#xff0c;一个家喻户晓的人物&#xff0c;可她毕竟还不是流浪的三毛&#xff0c;她有深爱她的丈夫&#xff0c;父母&#xff0c;堂哥。。。。 &#xff08;概述&#xff09;本书介绍了三毛的人生遭遇&#xff0c;三毛还将自己的人生体验写成…

5类主题词汇(5)

日常应用类 complaint投诉 lodge the complaint投诉 fake products假冒产品 apply for 申请 apologize for 道歉 heartfelt welcome由衷地欢迎 letter of recommendation推荐信 decline a job offer婉拒工作机会 heartiest congratulation最衷心的祝贺 a farewell letter告别信…

你试试用心呼吸

我曾经历过掉水里&#xff0c;两次。第一次&#xff0c;是在水上乐园&#xff0c;不会游泳的我&#xff0c;从高滑梯上头朝下扎到水中。一下子&#xff0c;就感觉呼吸不了&#xff0c;非常惊恐&#xff0c;然后有人&#xff08;救生员&#xff09;揽住了我&#xff0c;我非常惊…

cython python3_30倍!使用Cython加速Python代码

原标题&#xff1a;30倍&#xff01;使用Cython加速Python代码作者&#xff1a;George Seif、Thomas Wolf、Lukas Frei编译&#xff1a;116 | 公众号海外部前言你可能经常会一次又一次地听到关于Python的抱怨&#xff0c;Python跑起来太慢了&#xff01;与许多其他编程语言相比…

Git安装及密钥的生成并上传本地文件到GitHub上

之前用的GitHub&#xff0c;不太熟练&#xff0c;一直在上传的过程中遇到了一些问题&#xff0c;看了网上诸多教程&#xff0c;总觉得很乱&#xff0c;特参考一些资料&#xff0c;总结了一篇完整的操作步骤&#xff0c;从下载安装到上传文件&#xff0c;亲测有效1.下载Git软件&…

100条常用写作谚语(1)(2)(3)(4)

文章目录勤奋 意志与成功学习方法与态度健康与心态品行与操守勤奋 意志与成功 where there is a will&#xff0c;there is a way有志者事竟成 No pains&#xff0c;no gains没有付出没有收获 Constant dropping wears away a stone水滴石穿&#xff0c;绳锯木断 Care and dil…