Android之binder详解

binder系统架构

在这里插入图片描述
如上图系统架构主要有4部分构成
1、binder驱动,为binder提供底层操作函数,主要函数是ioctl()
2、serviceManager:这是有deamon,为binder提供查询,注册等功能,对于binder服务,通常使用唯一的字符串作为标识。
3、binder服务端:binder服务的提供者
4、binder客户端:binder服务的使用者

一、层次设计

binder层次关系图
如上图所示,binder的层次关系图可分为三个部分,
最上层为framework的各种binder服务类和接口类。
最底层的为binder驱动,主要提供了open,ioctl和close这三个接口。
中间两层分别为binder核心类和IPCThreadState,
binder核心类提供Ibinder和Bbinder和Bpbinder,IPCThreadState提供了与Bnbinder和Bpbinder的在驱动层的交互接口。

所以:从整体上来说,分为两层比较合适,运用层为framework的服务类和接口类以及为它提供基础功能的binder核心类,我们可以将这一层叫做binder的运用逻辑层,而IPCThreadState和驱动可以叫做数据链路层,主要提供硬件业务员的交互。

二、binder服务的使用

sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService("xxx");//查找已经注册名为"xxx"的binder服务,返回IBinder的引用对象
ICameraService service = ICameraService.stub.asInterface(binder);//,实际使用的时候需要将这个引用对用转换为代理对象。

用defaultServiceManager()来获取serviceManager服务的引用对象,然后调用getService来获取注册了的Binder服务,如果查找到名称对应的服务则返回该服务的IBinder,否则返回NULL。IBinder是一个引用对象,实际使用的时候,需要将引用对象转为为代理对象方可使用:

想一下、既然defaultServiceManager()可能会不存在返回NULL,我们为什么没有判断它的返回值勒?
答: ServiceManager会在运用启动之前启动,而且不会停止,所以我们可以不用检查返回值为NULL的情况。

三:java开发binder服务

第一步:编写aidl文件。

interface IExampleService{
   
	int get();
	void set(int value);
};

aidl解析器会根据我们编写接口来自动生成服务器和客户端的java代码。

第二步:编写server的代码

public class ExampleService extends Service{
   
	int mValue;
	private final IExampleService.Stub mInstance = new 	IExampleService.Stub(){
   
	public int get(){
   
		return mValue
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroidbinde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder跨进程通信,在app端对它的任何api方法等使用自如2、可以单独android系统源码中任何binder析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行跨进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种跨进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向跨进程通信10、使用socket实现一个可以让app执行shell命令的程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值