【邓凡平】再论Android中的广播和RPC

史欣嘉

2017/12/31 发布于 技术 分类

2017年,droidcon 第2次来到中国,并将于2017年11月在北京盛大开幕。参会人群包括业界领袖、技术大咖、技术开发者、大众创业者及领域从业者。大会将邀请来自Google、微软、Facebook、Ebay、Intel、Telenav、阿里巴巴、腾讯、小米、乐视、联想等国内外安卓技术与应用领域的大咖,沿袭历年国际大会特色,聚焦行业最前沿技术,碰撞切磋技术火花。

文字内容
1. 再论Android中的广播和RPC 邓凡平
2. 内容: • All is about information • 广播 • IPC和RPC-Theory • 解密Binder • commonRPC展示 http://blog.csdn.net/innost
3. All is about information The Information: A History, a Theory, a Flood —by James Gleick Sony Mobile Communications AB
4. All is about information Take a closer look at: ① “贾君鹏,你妈妈喊你回家吃饭” ② “@贾君鹏,你妈妈喊你回家吃饭” Sony Mobile Communications AB
5. 广播——原理 ① “贾君鹏,你妈妈喊你回家吃饭” 广播接收者a 广播接收者b 广播系统的特点:  发送者只管发送消息,不考虑谁接收  接收者只关注自己感兴趣的消息 广播者 广播接收者c Android平台里的实现方式 ...... 发送者:  Context.sendBroadcast系列API 接收者:  AndroidManifest.xml中编写静态 BroadcastReceiver标签,设置广播过滤条件  程序通过registerReceiver动态注册广播接收者 Sony Mobile Communications AB
6. 广播——Android平台示例 A: 广播者发送广播 B:广播接收者的处理——注册广播接收者 静态注册者 对什么广播感兴趣 动态注册者 filter:IntentFilter,对什么广播感兴趣 Sony Mobile Communications AB
7. 广播——Android平台示例 B:广播接收者的处理——坐等广播 区分广播信息 Sony Mobile Communications AB
8. 广播——广播发送方法的改进和其他 1 发送者的三种玩法 2 Subscriber/Publisher模式 A: 广播者发送广播 ①群发,接收者无优先级,不能中断 ②接收者可设置优先级,高优先级可中断广播继续发送 ③广播发了,后来的接收者却接收不到,怎么处理? 发送者发送Sticky广播,该广播的内容由系统保存。当新的 广播注册者到来,由系统将广播内容返给它 其他的广播机制?  UDP组播?  D-BUS?  Uevent? Publisher/Subscriber模型 Sony Mobile Communications AB
9. IPC/RPC——Theory ② “@贾君鹏,你妈妈喊你回家吃饭” public sendMessage(){ String msg = “Your Mother ...for dinner”; mrJiaJunPeng.tell(msg); } who do what argument infor. information Sony Mobile Communications AB
10. IPC/RPC——Theory ①IPC Caller mrJiaJunPeng Proccess A mrJiaJunPeng和Caller 在一个进程里。普通的 函数调用 ②RPC Caller Proccess A mrJiaJunPeng Proccess B mrJiaJunPeng在另外一个进程里....,如何通信? 三个关键问题: 1 发给谁? 2 发什么内容? 3 怎么发? Sony Mobile Communications AB
11. IPC/RPC——Theory ②RPC Caller Proccess A mrJiaJunPeng Proccess B 三个关键问题之怎么发? 通信方法:  socket  pipe  shared memory  http?  webservice? Binder: 1. Kernel里有个binder设备,纯软件层 (drivers/staging/android/binder.c) 2. 需要binder通信的app都会打开这个设备 3. 剩下就是角色(交互协议)的问题了 Sony Mobile Communications AB
12. IPC/RPC——Theory ②RPC Caller Proccess A mrJiaJunPeng Proccess B 三个关键问题之 发给谁? 发什么内容? 发给谁:  socket/http/webservice:地址+端口号/url  pipe:fd  shared memory:/soname(shm_open) 发什么内容: 1 完全自己组织数据 Binder: 1 封装了binder的协议 This is Binder,Nothing new 2 基于http等标准协议之上的协议 Sony Mobile Communications AB
13. Why everybody think Binder is difficult? 1 代码比较复杂,派生和继承关系较多,又使用了模板类,宏等 2 业务和通信混在一起。这和binder之前的RPC手段都不相同 回顾:非binder的RPC是怎样的呢? 1 建立通信连接 2 组织业务层数据/协议,发送和接收 Binder:二合一 1 像本地函数一样调用 Sony Mobile Communications AB
14. 解密Binder——Native Binder(服务端)(2) 通讯和业务怎么结合? ①通讯层收到请求,调用onTransact ②每个函数调用都有一个code,根据code,调用不同的业务函数 Sony Mobile Communications AB
15. Java层的Binder 代码实践 1 编写AIDL文件,类似java的interface 业务函数 参数问题: 1 string、int等基本数据类型可直接传递 2 复杂数据类型需要编写单独的aidl文件和java文件 3 参数前的修饰in/out/inout要小心 复杂参数: 1单独编写一个aidl文件 2 编写一个类。数据的打包/解包 在该类中完成 Sony Mobile Communications AB
16. commonRPC展示 AIDL的痛点: 1 每一类型的业务逻辑都需要写一个AIDL 2 如果需要修改API,就要重新编译SDK 3 如果参数复杂,又得写AIDL文件和打包/解包类 解决办法: 1 Binder是业务+通讯混在一起 2 如果上帝的归上帝,凯撒的归凯撒? Client端App RPCClient 通讯函数: 1 call 2 notify Service端App call(String request) notify(String responseOrinfo) RPCService Sony Mobile Communications AB
17. commonRPC展示 Sony Mobile Communications AB
18. commonRPC展示——客户端 剩下就是业务+参数: 1 对外是对象 2 传输时转换成json字符串 sale:业务层函数 SaleRequest:消费请求 callAsyncWithName:是call的封装 1 name:服务端函数名 2 info:参数 call函数的参数: 1 pid:客户端进程号 2 info:带函数名+原info的info Sony Mobile Communications AB
19. commonRPC展示——服务端 name:client端调用的函数 request:json字符串,可还原回原对象, 比如SaleRequest data:其他可序列化对象,比如bitmap 其他功能: 1 自动connect,reconnect 2 函数调用可阻塞,也可非阻塞 3 服务端可通知客户端 客户端死亡通知 开源地址:https://gitee.com/innost/commonRPC Sony Mobile Communications AB
20. Sony Mobile Communications AB
21. 谢谢! 謝謝! Thanks! Gracias! ありがとうございます! 감사합니다!