Android Binder通信原理(七):java 下的C-S

源码基于:Android R

0. 前言

在之前的几篇博文中,对Android binder 的通信原理进行的深入的剖析,这些博文包括:binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取。

在前一文中,通过实例,详细地说明了native 下 的C-S 通信原理

本文在之前的基础上,以实例的形式进一步的分析 java 下的 C-S 通信。

1. aidl

App 中使用 binder 进行通信时都会使用 aidl,这样的使用 framework 也很常见,而系统在编译的时候都会根据 aidl 的接口定义,自动编译出对应的 Java 文件。

最新的版本中 aidl 不但能够保证 Java 端的 C - S通信,也能保证 Java client - native service 的通信。

这里以PMS 的install 为例,PMS 在进行APK 安装时,会进行dex 的翻译,依赖守护进程installd 完成。

frameworks/native/cmds/installd/binder/android/os/IInstalld.aidlpackage android.os;/** {@hide} */
interface IInstalld {...
}

2. Java 端调用

frameworks/base/services/core/java/com/android/server/pm/installer.javaimport android.os.IInstalld;public class Installer extends SystemService {private volatile IInstalld mInstalld;private void connect() {IBinder binder = ServiceManager.getService("installd");if (binder != null) {...}if (binder != null) {mInstalld = IInstalld.Stub.asInterface(binder);...}}public long createAppData(String uuid, String packageName, int userId, int flags, int appId,String seInfo, int targetSdkVersion) throws InstallerException {if (!checkBeforeRemote()) return -1;try {return mInstalld.createAppData(uuid, packageName, userId, flags, appId, seInfo,targetSdkVersion);} catch (Exception e) {throw InstallerException.from(e);}}...
}

上述代码中主要注意:

  • 引用的aidl 为android.os.IInstalld;
  • 通过 getService("installd") 获取到IBinder;
  • IInstalld.Stub.asInterface() 获取代理;

主要是确定aidl 编译后的源码位置,对于Android R,framework 下的aidl 会统一到目录out\soong\.intermediates\frameworks\base\module-lib-api\android_common\gen\aidl 下。

aidl 编译后的JAVA 文件都会最终打包到 aidl*.srcjar 中,那具体的文件怎么确定呢?需要依赖frameworks 文件夹或者 system 文件夹的 *.aidl.d 文件。

如果aidl 文件是定义在frameworks 下,那么就可以到framework 下对应的目录查找对应的 *.aidl.d 文件。同样,如果aidl 是在 system 下定义,则可以到system 文件夹下查找 *.aidl.d 文件。例如这里的 IInstalld.aidl 是定义在 frameworks/native/cmds/installd 下,那就到frameworks 文件夹下对应位置找到 IIntalld.aidl.d 文件:

out/soong/.intermediates/frameworks/base/module-lib-api/android_common/gen/aidl/aidl27.tmp/frameworks/native/cmds/installd/binder/android/os/IInstalld.java : \frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl \frameworks/native/cmds/installd/binder/android/os/storage/CrateMetadata.aidlframeworks/native/cmds/installd/binder/android/os/IInstalld.aidl :
frameworks/native/cmds/installd/binder/android/os/storage/CrateMetadata.aidl :

第一行指定了 IInstalld.aidl 编译出的Java 文件位于aidl27.tmp,即上图中的 aidl27.srcjar 文件中,解压后就能找到 IInstalld.java:

package android.os;
/** {@hide} */
public interface IInstalld extends android.os.IInterface
{...public static abstract class Stub extends android.os.Binder implements android.os.IInstalld{...public static android.os.IInstalld asInterface(android.os.IBinder obj){if ((obj==null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof android.os.IInstalld))) {return ((android.os.IInstalld)iin);}return new android.os.IInstalld.Stub.Proxy(obj);}}...
}

3. Java client 与 service 通信

对于binder service 有两种方式存在,java 端和native 端。但是对于client 只负责通过getService 查找到service 的代理,并通过此代理调用transact 通信,而对于service ,驱动只会通知其BBinder,并通过 onTransact 进行处理。

而,BBinder 也有两种方式存在,java service 为JavaBBinder(继承自BBinder),而native service 为BBinder。

所以,无论client 或service 位于java 端,还是native 端,根本原因都是BpBinder 与BBinder 的通信。

对于 Java 端的 binder 通信下面这个框架图,在 Java 端的service 注册和获取 一文中详细说明。

继续上面的  IInstalld.aidl,会在 out/soong/.intermediates/frameworks/native/cmds/installd/installd/.../gen/aidl/ 目录下面编译出几个文件。

该目录下 android/os 下面是编译出来的头文件:

该目录下 frameworks/native/cmds/installd/binder/android/os 下面是编译出来的实现文件:

而,installd 在native 有个service 继承了 BnInstalld:

frameworks/native/cmds/installd/InstalldNativeService.hclass InstalldNativeService : public BinderService<InstalldNativeService>, public os::BnInstalld {
public:...
};

至此,java下 C-S 的实例已经基本说明完毕,结合实际操作可以更好的理解 binder 的通信。 

 

 

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

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

相关文章

五、卷积神经网络

文章目录 前言一、图像卷积1.1 不变性1.2 互相关运算1.3 卷积层1.4 互相关和卷积1.5 特征映射和感受野 二、填充和步幅2.1 填充2.2 步幅 三、多输入多输出通道3.1 多输入通道3.2 多输出通道3.3 11卷积层 四、汇聚层/池化层4.1 最大汇聚层与平均汇聚层4.2 填充和步幅4.3 多个通道…

Squid代理服务器

Squid代理服务器 一、Squid相关知识 1.功能 Squid 主要提供缓存加速、应用层过滤控制的功能。 2.工作机制 1&#xff0e;代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。 2&#xff0e;将获得的网页数据&#xff08;静态 Web 元素&#xff09;保存到…

4.Nginx缓存设置和CDN

文章目录 Nginx缓存设置设置缓存取消不需要内容的缓存查看nginx缓存数据 CDN概念工作原理 Nginx缓存设置 设置缓存 ##在yum配置文件中添加nginx在线源vim /etc/yum.repos.d/nginx.repo[nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$base…

从零开始 Spring Boot 59:Hibernate 日志

从零开始 Spring Boot 59&#xff1a;Hibernate 日志 图源&#xff1a;简书 (jianshu.com) Hibernate 支持多种日志模块&#xff0c;本文介绍如何在 Spring Boot 中使用 Log4j2记录 Hibernate 日志。 实际上本文是我在写上篇文章时遇到的各种坑和最终解决的记录。 首先需要添加…

【HTTP 协议1】图文详解 HTTP 请求和应答报文

文章目录 前言一、认识 HTTP 协议1, 什么是 HTTP 协议2, HTTP 协议的报文格式 二、HTTP 请求报文1, 认识方法1.1, GET 和 POST 辨析(重点)1.2, 其他方法 2, 认识 URL3, 认识 Header3.1, Host3.2, Content-Length3.3 Content-Type3.4, User-Agent3.5, Referer3.6, Cookie(重点) …

力扣单调栈专题 739. 每日温度 496.下一个更大元素I 503.下一个更大元素II 42. 接雨水 84.柱状图中最大的矩形 步骤及C++实现 总结

文章目录 739. 每日温度496.下一个更大元素 I503.下一个更大元素II方法一 数组拼接方法二 模拟遍历两边nums 42. 接雨水双指针 暴力法双指针优化单调栈 84.柱状图中最大的矩形暴力解法双指针解法单调栈 总结 739. 每日温度 暴力解法&#xff0c;双层for循环&#xff0c;时间复杂…

如何在 MATLAB 中进行图像分割(matlab仿真与图像处理系列第7期)

在 MATLAB 中进行图像分割有多种方法,下面介绍一些常用的方法: 基于阈值的二值化分割这是一种最简单的分割方法,将图像分为两个部分:背景和前景。其主要思想是,选择一个阈值,将图像中的像素值与阈值进行比较,将像素值大于阈值的像素标记为前景(白色),将像素值小于阈值…

17. 订单金额趋势分析

文章目录 题目需求思路一实现一实现二&#xff1a;使用 over(range)学习链接题目来源 题目需求 查询截止每天的最近3天内的订单金额总和以及订单金额日平均值&#xff0c;保留两位小数&#xff0c;四舍五入。 最近三天 的业务逻辑通常是基于当天往前推2天 期望结果如下&#x…

归并排序的具体实现过程

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《算法详解》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心…

【JavaEE初阶】CSS

摄影分享~ 文章目录 一.CSS基本规范1. CSS基本语法规范2.CSS选择器 二.CSS常用属性1. 字体属性2.文本属性3.背景属性4.圆角矩形5.元素的显示模式块级元素行内元素 6.盒子模型边框内边距外边距 7.弹性布局 一.CSS基本规范 层叠样式表。(Cascading Style Sheets) CSS 能够对网页…

【深度学习】AIGC ,ControlNet 论文,原理,训练,部署,实战,教程

论文&#xff1a;https://arxiv.53yu.com/pdf/2302.05543 代码&#xff1a;https://github.com/lllyasviel/ControlNet 得分几个博客完成这个事情的记录了&#xff0c;此篇是第一篇&#xff0c;摘录了一些论文内容。ControlNet 的原理极为朴实无华&#xff08;对每个block添加…

BPMNJS 在HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不过…