Binder系列8—如何使用Binder

Posted by Gityuan on November 22, 2015

自定义binder架构的 client/ server组件

一、Native层Binder

源码结构:

1.1 服务端

将名为”service.myservice”的BnMyService服务添加到ServiceManager,并启动服务

1.2 客户端

获取名为”service.myservice”的服务,再进行类型,最后调用远程方法sayHello()

1.3 创建MyService

(1)IMyService.h

主要功能:

(2)IMyService.cpp

1.4 原理图

native_binder

1.5 运行

(1)编译生成 利用Android.mk编译上述代码,在Android的源码中,通过mm编译后,可生成两个可执行文件ServerDemo,ClientDemo。

(2)执行

首先将这两个ServerDemo,ClientDemo可执行文件push到手机

如果push不成功,那么先执行adb remount,再执行上面的指令;如果还不成功,可能就是权限不够。

如果上述开启成功,通过开启两个窗口运行(一个运行client端,另一个运行server端)

(3)结果

服务端:

native_server

客户端:

native_client

二、Framework层Binder

源码结构:

Server端

  1. ServerDemo.java:可执行程序
  2. IMyService.java: 定义IMyService接口
  3. MyService.java:定义MyService

Client端

  1. ClientDemo.java:可执行程序
  2. IMyService.java: 与Server端完全一致
  3. MyServiceProxy.java:定义MyServiceProxy

2.1 Server端

(1)ServerDemo.java

可执行程序

(2)IMyService.java

定义sayHello()方法,DESCRIPTOR属性

(3)MyService.java

2.2 Client端

(1)ClientDemo.java

可执行程序

public class ClientDemo {
    public static void main(String[] args) throws RemoteException {
        System.out.println("Client start");
        IBinder binder = ServiceManager.getService("MyService"); //获取名为"MyService"的服务
        IMyService myService = new MyServiceProxy(binder); //创建MyServiceProxy对象
        myService.sayHello("binder"); //通过MyServiceProxy对象调用接口的方法
        System.out.println("Client end");
    }
}

(2)IMyService.java

与Server端的IMyService是一致,基本都是拷贝一份过来。

(3)MyServiceProxy.java

2.3 原理图

framework_binder

2.4 运行

首先将ServerDemo,ClientDemo可执行文件,以及ServerDemo.jar,ClientDemo.jar都push到手机

如果push不成功,那么先执行adb remount,再执行上面的指令;如果还不成功,可能就是权限不够。

如果上述开启成功,通过开启两个窗口运行(一个运行client端,另一个运行server端)

结果

服务端:

framework_server

客户端:

framework_client

http://gityuan.com/2015/11/22/binder-use/