美文网首页
Binder(三)简析

Binder(三)简析

作者: tzlf | 来源:发表于2021-09-02 17:07 被阅读0次

接下来以简单的ITest.aidl为例,介绍Binder的调用结构

1.ITest.aidl的源码如下

图1

2. AS下编译ITest.aidl,生成ITest.java

图2-1 图2-2 图2-3 图2-4 图2-5 图2-6

3. 接下来是服务端开发

图3-1

这里简单起见只是打印log

4. 实际调用

简单起见,使用ServiceManager注册服务,忽略selinux相关权限

a)服务端注册服务:

ServiceManager.addService("test",new TestImp());

b)客户端获取服务

IBinder   b = ServiceManager.getService("test");

ITest test = ITest .Stub.asInterface(b);

test .test(1,2);

注意上面图2-3 里的asInterface方法

图4

如果客户端和服务端处于同一进程,那么就是直接强转为(com.test.ITest),否则用com.test.ITest.Stub.Proxy包装,其中ServiceManager.getService("test")返回的是BinderProxy,BinderProxy是在JNI里生成

5.Binder调用流程

图5

在test方法中,将接口名,参数打包,调用mRemote.transact

mRemote其实就是BinderProxy。

而在服务端的onTransact,解析客户端传过来的参数,调用对应的test方法(TestImp继承实现)

整个流程分为:

1. 客户端test .test(1,2);

2.客户端test方法打包参数

3.mRemote.transact

4.内核传递数据

5.服务端binder.onTransact

6.服务端解析参数

7.TestImp.test(int a, long b)

其中3-5之间可以划分为传输层层,只用于Binder传递数据

而其他步骤都可归为业务层,如客户端打包参数,服务端解析参数,调用对应函数test

相关文章

  • Binder(三)简析

    接下来以简单的ITest.aidl为例,介绍Binder的调用结构 1.ITest.aidl的源码如下 2. AS...

  • Binder简析

    1.Binder简介 我们知道,在Android操作系统中,每个进程都拥有属于自己的独立虚拟地址空间(用户空间+内...

  • Android 中的 Binder

    Binder简析 直观来说,Binder 是 Android 中的一个类,是继承了 IBinder 接口;从 IP...

  • LCODER性能优化:启动优化

    一、 APP启动流程简析 点击桌面APP图标,Launcher进程采用Binder IPC向System_serv...

  • IPC(二)Binder初探

    Binder 讨论到Binder相关知识应该三天三夜也讨论不完,简书的 隔壁老李头 大佬,花了15篇博客,重头到位...

  • 黑色的天空

    啊!简析又惊醒了,这已经是第三次了,自从简析从那个噩梦里回来,已经有三天了。简析不明白,为什么她会回来,回...

  • 黑色的天空

    啊!简析又惊醒了,这已经是第三次了,自从简析从那个噩梦里回来,已经有三天了。简析不明白,为什么她会回来,回...

  • 简析 Binder 数据传输流程

    本文是一篇流程解析,而非源码解析,虽然文章中包含对源码的解读,但源码中的细节基本已经砍光,仅保留主要部分。 所有源...

  • mybatis-spring解析

    1、概述 原生Mybatis源码简析(上)原生Mybatis源码简析(下)在介绍原生Mybatis源码简析文章中,...

  • 简析 Swift 的模块系统

    简析 Swift 的模块系统 简析 Swift 的模块系统

网友评论

      本文标题:Binder(三)简析

      本文链接:https://www.haomeiwen.com/subject/jlgsrltx.html