【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;
}


目录
相关文章
|
1天前
|
Java
用java搞定时任务,将hashmap里面的值存到文件里面去
本文介绍了如何使用Java的`Timer`和`TimerTask`类创建一个定时任务,将HashMap中的键值对写入到文本文件中,并提供了完整的示例代码。
8 1
用java搞定时任务,将hashmap里面的值存到文件里面去
|
1天前
|
Java 程序员
深入理解Java中的异常处理机制
本文将深入探讨Java中的异常处理机制,通过详细的示例代码和解释,帮助读者更好地理解和应用Java异常处理。我们将从基本概念入手,逐步深入到高级特性,如自定义异常、异常链以及最佳实践。
|
1天前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
16 3
|
6天前
|
Java
深入理解Java中的异常处理机制
【9月更文挑战第34天】在Java的世界里,异常处理是代码健壮性的守护神。本文将带你探索Java异常处理的奥秘,从基础语法到高级技巧,我们一步步揭开异常处理的面纱。你将学会如何捕获、声明和处理异常,以及如何自定义异常类型。让我们开始这段旅程,让代码更加稳健和可靠吧!
|
1天前
|
Java
利用GraalVM将java文件变成exe可执行文件
这篇文章简明地介绍了如何使用GraalVM将一个简单的Java程序编译成exe可执行文件,首先通过javac命令编译Java文件生成class文件,然后使用native-image命令将class文件转换成独立的exe文件,并展示了如何运行这个exe文件。
6 0
利用GraalVM将java文件变成exe可执行文件
|
2天前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
38 1
|
3天前
|
Java
深入浅出Java异常处理机制
【9月更文挑战第37天】在Java编程的世界里,异常处理是一项基础而重要的技能。它就像是我们生活中的急救箱,遇到意外时能及时救治,避免程序崩溃。本文将通过生动的例子和易于理解的语言,带你了解Java中的异常处理机制,从基本的try-catch语句到自定义异常的创建,让你的程序更加健壮和可靠。准备好了吗?让我们一起走进Java异常处理的大门,探索它的奥秘吧!
|
8天前
|
Java 编译器 开发者
Java中的异常处理机制:从基础到进阶
本文深入探讨Java编程语言中的异常处理机制,从基础知识出发,逐步解析异常的分类、捕获和处理方法。通过实际案例分析,展示如何在开发过程中有效利用异常处理提高代码的稳定性和可维护性。进一步探讨了自定义异常的创建和使用场景,以及在Java中进行异常处理的最佳实践。文章旨在为Java开发者提供一个全面而详细的异常处理指南,帮助开发者更好地理解和运用Java的异常处理机制。
|
23小时前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
8 0
|
1天前
|
Java Maven Spring
用Spring导致的无法运行Java文件的问题的解决方案
本文提供了解决在IntelliJ IDEA社区版中使用Spring Initializr插件创建Spring项目后,Java文件无法运行的问题的方法,主要是通过加载Maven项目来解决。
10 0