【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(一)

简介: 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(一)

文章目录

前言

一、分析 AIDL 文件生成的 Java 源文件

1、IMyAidlInterface.java 中的类结构

2、DESCRIPTOR 描述符

3、Stub 构造方法

4、Stub.asInterface 方法

5、Stub.onTransact 方法

6、Stub.Proxy 代理类

前言

在上一篇博客 【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 ) 创建了 AIDL 文件 , 并编译生成了 AIDL 文件对应的 Java 源文件 , 现在开始分析生成在 " AIDL_Demo\app\build\generated\aidl_source_output_dir\debug\out\kim\hsl\aidl_demo " 目录 中的 " IMyAidlInterface.java " 源文件 ;






一、分析 AIDL 文件生成的 Java 源文件


分析 【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 ) 二、编译工程生成 AIDL 文件对应的 Java 源文件 2、生成的 AIDL 对应 Java 源文件 章节中 , 编译 AIDL 文件生成的源码 ;



1、IMyAidlInterface.java 中的类结构


生成的类是 IMyAidlInterface.java , 继承了 android.os.IInterface 接口 ;


public interface IMyAidlInterface extends android.os.IInterface


其中定义了两个内部类 ,


内部类 1 11 如下 : IMyAidlInterface 的默认实现 ;

/** Default implementation for IMyAidlInterface. */
  public static class Default implements kim.hsl.aidl_demo.IMyAidlInterface


内部类 2 22 如下 : IPC 机制的本地实现 ;

/** Local-side IPC implementation stub class. */
  public static abstract class Stub 
    extends android.os.Binder 
    implements kim.hsl.aidl_demo.IMyAidlInterface



2、DESCRIPTOR 描述符


在 Stub 内部类中 , 定义的常量 DESCRIPTOR 是 AIDL 文件的 " 包名.类名 " , 用于查找 Binder 用的 ;


private static final java.lang.String DESCRIPTOR = "kim.hsl.aidl_demo.IMyAidlInterface";



3、Stub 构造方法


Stub 的构造方法中 , 调用了 Binder 的 attachInterface 方法 , 传入了 AIDL 文件的全类名 ; 作用是将该 AIDL 接口与 Binder 进行关联 ;


 

/** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }


4、Stub.asInterface 方法


Stub 中定义了 asInterface 方法 , 该方法的作用是将 android.os.IBinder 对象转为 AIDL 接口对象 ; 传入的 DESCRIPTOR 描述符 , 用于描述用户想要哪个 Binder , android.os.IBinder 对象调用 queryLocalInterface 方法 , 检查本地服务是否存在 ;


如果可以找到本地服务对应的接口 , 可以直接返回本地服务 ;

如果没有找到本地服务 , 就会返回一个 Stub 代理 ;

详细的过程参考下面的代码 :


 

/**
     * 将IBinder对象强制转换为kim.hsl.aidl_demo.IMyAidlInterface接口,必要时生成代理。
     */
    public static kim.hsl.aidl_demo.IMyAidlInterface asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      // 传入 DESCRIPTOR 描述符 , 用于描述用户想要哪个 Binder
      // android.os.IBinder 对象调用 queryLocalInterface 方法 , 检查本地服务
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      // 如果可以找到本地服务对应的接口 , 可以直接返回本地服务 
      if (((iin!=null)&&(iin instanceof kim.hsl.aidl_demo.IMyAidlInterface))) {
        return ((kim.hsl.aidl_demo.IMyAidlInterface)iin);
      }
      // 如果没有找到本地服务 , 就会返回一个 Stub 代理 
      return new kim.hsl.aidl_demo.IMyAidlInterface.Stub.Proxy(obj);
    }


IBinder 是一个接口 , 其中定义了一堆常量标识符 ;


transact 方法对应 Binder 底层发起 IPC 的请求函数 ;


public interface IBinder {
    /**
     * 对对象执行常规操作。
     * 
     * @param code 要执行的操作。
     *    这应该是介于{@link #FIRST_CALL_TRANSACTION}和{@link #LAST_CALL_TRANSACTION}之间的数字。
     * @param data 要发送到目标的封送数据。不能为null。
     *    如果不发送任何数据,则必须创建此处给出的空地块。
     * @param reply 要从目标接收的封送数据。如果您对返回值不感兴趣,则可能为null。
     * @param flags 其他操作标志。正常RPC为0,单向RPC为{@link#FLAG_ONEWAY}。
     *
     * @return 从{@link Binder#onTransact}返回结果。成功的调用通常返回true;false通常表示未理解事务代码。
     */
    public boolean transact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags)
        throws RemoteException;
}


目录
相关文章
|
13天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
30天前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
51 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
30天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
85 4
|
30天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
41 5
|
30天前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
61 5
|
30天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
41 5
|
30天前
|
Java 数据库连接 数据库
【潜意识Java】使用 Ruoyi 框架开发企业级应用,从零开始的实践指南和分析问题
本文介绍了基于Spring Boot的开源企业级框架Ruoyi,涵盖环境搭建、项目初始化及用户管理模块的创建。
140 4
|
30天前
|
SQL Java API
|
30天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
61 1
|
30天前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
38 0

热门文章

最新文章