Android Framework实战开发-Binder专题讲解之aidl文件的详细分析

Android AIDL 跨进程通信实战:从绑定、回调到Binder避坑指南 在Android应用架构中,跨进程通信(IPC)是实现模块隔离、后台长任务保活和跨应用能力开放的关键技术。Binder作为Android系统底层的通信机制,通过共享内存与内核驱动高效传递数据,而AIDL则是定义跨进程调用接口的标准化工具,编译后自动生成Binder通信代码,让开发者能以方法级调用的方式完成进程间交互。理解Binder线程模型、事务缓冲区限制以及Parcelable序列化规则,是避免TransactionTooLargeException和死锁等问题的前提。在实际应用中,从音乐播放器到支付SD 阅读详情
AI摘要

本文详细介绍了Android中AIDL(Android Interface Definition Language)的作用及其工作原理,用于实现应用层的跨进程通信。AIDL帮助减少冗余的通信协议代码,通过自动生成Stub类和Stub.Proxy类简化服务端和客户端的交互。讲解了如何使用AIDL定义接口,编译生成Java文件,并分析了生成文件的内容,包括Stub和Stub.Proxy的角色。此外,还展示了实际使用中Stub的服务器端实现和Stub.Proxy的客户端调用流程。

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)

大家平时做应用开发时候也经常会遇到有跨进程通信的需求,这里大部分通信可能就会回答,就是用aidl,service。确实这个aidl和service的方式是应用开发中对binder接触层面应该属于最为接近的一层。因为其他的接口方式跨进程通信,比如startActivtiy,ContentProvider,broadcast,这些都是系统组件接口直接帮我们做好的,连binder的影子都看不见,自然也就对binder相对比较陌生。
本节就来重点介绍一下深入讲解分析应用层面binder通信的方式及原理,这一部分属于binder讲解的中级部分,这节课来讲解一下binder的aidl生成java文件的源码分析:
为什么要AIDL,它存在意义是?
在使用binder service进行跨进程通信经常我们会写aidl,那首先大家肯定会有疑问,那aidl到底是什么?AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。所以说aidl他只是一个语言,主要目的就是来帮助binder跨进程通信的接口定义而设计的一个语言,后缀是 .aidl结尾,他有自己的语法,不过基本和java比较类似,最后会通过一个aidl.exe把整个aidl文件都转换成对应的java文件,因为编译接口啥事我们java程序在使用当然要变成java 修改类文件,那这里同学肯定会说为什么不直接用java,还要搞个新语言,其实这里就问到了最关键的部分。
这里有以下原因:
1、如果要java语言实现那会导致要写很多重复的固定代码,写的代码量比较大,稍微不小心容易出错
2、这一部分完全可以让脚本根据某些配置文件来生成对应的java代码,而这个配置文件的正类似我们今天看到的aidl
本质如下图所示:
在这里插入图片描述

这里我们来按照上图来一步步实现:
1、明确哪个是客户端,哪个是服务
首先应用层跨进程通信时候,我们都一般会定义一个Service,因为Android中Service组件是可以运行于独立的进程即Service代码可能是在某一个apk下面,但是它运行的进程却不是这个apk的包名对应的进程,所以一般演示跨进程通信完全可以一个apk实现,这个Service就是我们真正的服务端,也是真正的业务实现端,客户端就是调用这个Service发起端,这个具体是在Activity中实现还是Service一般都是可以,一般我们为了方便就在Activity中进行跨进程通信的调用,即Activity作为客户端。
2、确定通信过程中的接口(即通信要获取的信息)
这个就是所说的aidl文件,它来定义好对应的通信接口接口,比如这里我们定义一个学生信息获取接口:
IStudentInterface .aidl

interface IStudentInterface {
    int getStudentId(String name);//定义一个根据学生名字查询学号的接口
}

aidl文件的转换
这个aidl文件写好后,点击make编译一下工程,在编译过程就会被aidl.exe转成对应的java文件,具体查看这个java文件,可以在android studio点击如下路径:
在这里插入图片描述
如果想要直接使用aidl.exe来命令生成也是完全可以
先到安卓sdk\build-tools\29.0.2下有aidl.exe

aidl.exe -IF:\binder_drivers_code\ServiceDemo\app\src\main\aidl\com\example\servicedemo  F:\binder_drivers_code\ServiceDemo\app\src\main\aidl\com\example\servicedemo\IStudentInterface.aidl

"-I"与"F:\binder_drivers_code***"之间是没有空格的,最后就会在F:\binder_drivers_code\ServiceDemo\app\src\main\aidl\com\example\servicedemo生成一个IStudentInterface.java
在这里插入图片描述
这里相信大家已经明白了aidl是怎么一回事,它的本质目的就是为了帮助我们减少编写那些重复不变化的通信协议代码,这个完全可以让机器根据我们的描述配置文件来生成,这个描述配置文件其实就是我们的aidl文件

3、那我们已经生成了这个java文件,那我这个java文件到底内容是什么呢?
其实上面的图也提前展示了,它主要分别一部分是Stub 类和Stub .Proxy类

  public static abstract class Stub extends android.os.Binder implements com.example.servicedemo.IStudentInterface1
  {
       。。省略
    public static com.example.servicedemo.IStudentInterface1 asInterface(android.os.IBinder obj)
    {
         。。省略
      return new com.example.servicedemo.IStudentInterface1.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    //服务端,这个时候服务端驱动获取数据后,一系列调用会回调到onTransact
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
           。。省略
        case TRANSACTION_getStudentId:
        {
          data.enforceInterface(descriptor);
          java.lang.String _arg0;
          _arg0 = data.readString();
          int _result = this.getStudentId(_arg0);//这个地方就会真正调用Service中实现的那个getStudentId方法
          reply.writeNoException();
          reply.writeInt(_result);
          return true;
        }
            。。省略
      }
    }
    private static class Proxy implements com.example.servicedemo.IStudentInterface1
    {
     。。省略
      @Override public int getStudentId(java.lang.String name) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeString(name);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getStudentId, _data, _reply, 0);//客户端调用getStudent最后是通过mRemote调用到远程,并等待获取结果
          if (!_status && getDefaultImpl() != null) {
            return getDefaultImpl().getStudentId(name);
          }
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      public static com.example.servicedemo.IStudentInterface1 sDefaultImpl;
    }
       。。省略
  }

这里Stub就是远程端的具体真实实现,一般在服务端Serivce中实现,而Stub.Proxy类则是主要给客户端提供调用远程端的接口。对应的实际使用Stub类和Stub.Proxy类如下截图:
Stub的服务端实现截图:
在这里插入图片描述
Stub.Proxy的具体使用调用过程:
在这里插入图片描述
这里的asInterface上面代码也展示,其实就是
new com.example.servicedemo.IStudentInterface1.Stub.Proxy(obj);构造了一个Stub.Proxy本地对象。
最后总结一下aidl转成java文件后看到的一个跨进程调用的图:
在这里插入图片描述

Android源码分析 - Framework层的Binder(客户端篇) 本篇以分支作为基础解析我们在之前的文章中,从驱动层面分析了是怎样工作的,但驱动只涉及传输部分,待传输对象是怎么产生的呢,这就是层的工作了。我们要彻底了解的工作原理,不仅要去看驱动层,还得去看层以及应用层()我们还是以第一次见到的地方开始分析,我们选取方法来分析(这个方法既有入参也有返回),抛除掉它缓存和的部分,最核心的代码就一句 BinderInternal.getContextObject 我们从开始看起,这个函数是一个函数,他被实现在中 ProcessState 我们在这里可以发现一个比较关键的类,它是 阅读详情

相关推荐

Android Framework学习六:Binder原理

Binder是Android系统中的一种进程间通信(IPC)机制,涵盖机制、应用和驱动三个层面。在机制层面,Binder提供标准化的通信方式,支持不同进程间的数据交换和方法调用。在应用层面,开发者可通过继承Binder类实现自定义的跨进程通信逻辑。在驱动层面,Binder作为虚拟物理设备驱动,负责管理内存映射、线程管理等底层操作。Binder通信过程中,数据通过Binder驱动在内核态和用户态之间传递,客户端通过copy_from_user将数据拷贝到内核空间,服务端通过mmap直接访问内核空间。每个APP

zmlovelx(帅得不敢出门 程序员群31843264) 1647

【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL

因为 应用进程均是 zygote fork 出来的子进程,会复制父进程的内存AppRuntime start("com.android.internal.os.RuntimeInit", args, zygote) 启动一个普通应用或者zygote,都会注册jni所以 gRegJNI 是个结构体数组。NELEM(gRegJNI) 是计算该数组的大小 size这里主要关注 register_android_os_Binder 函数。

mike_jun的博客 1220

Android之Binder原理剖析

binder

zhuhai0613的博客 2808

新手写AIDL构建失败:...aidl.exe'' finished with non-zero exit value 1

最近学习aidl,写demo后编译报错,跟着《Android开发艺术探索》以及网上的一些aidl详解博客敲完后一直编译不过,错误日志如下: Process 'command 'C:\Users\DELL\AppData\Local\Android\Sdk\build-tools\27.0.3\aidl.exe'' finished with non-zero exit value 1 打开详细错误...

weixin_30677475的博客 571

Android Framework 架构介绍,Binder理解

一,Android Framework架构介绍 1.Android系统架构 Android本质就是在标准的Linux系统上增加了Java虚拟机Dalvik/ART,并在Dalvik/ART虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。 Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。 Android架构 Linux 内核 原生.

Chin_Style的博客 6037

AIDL & Binder机制和原理

而该Bp客户端的实例化流程,首先会先通过Parcel的readStrongBinder实例化一个BpBinder,然后一般会通过调用对应接口类中的asInterface方法将BpBinder转化为一个真正的Bp接口客户端,其实这个转化就是实例化一个Bp客户端,实例化时,会将BpBinder作为构造传参传入Bp客户端中。在C++层面的Binder相关类中,所谓的Bn端就是Binder的服务端,在此例中,Cameraservice的Bn端,显然就是之前AIDL自动生成的BnCameraService。

shuizhizhiyin的专栏 1920

Android AIDL——实现机制浅析

1.基于前面写的aidl使用,这段时间准备研究ActivityManager框架,对aidl进行了更深入的研究,因为android框架大量使用了进程通信机制,所以,在研究android framework前认真研究一下AIDL的实现机制十分有必要的   2.前面讲了aidl是 Android Interface definition language的缩写,它是一种进程通信接口的描述,通过sdk

zhaoweixing1989的专栏 1万+

binder 讲解1

一、AIDL 与 asStub() 的核心关系​ AIDL 的核心目标是定义跨进程通信的接口。编译器会根据 AIDL 文件生成以下关键类:IYourInterface:用户定义的接口(继承自 IInterface)。 IYourInterface.Stub:服务端的基类(继承自 Binder,并实现 IYourInterface),负责处理客户端调用。 IYourInterface.Proxy:客户端的代理类,负责将方法调用封装为 Binder 事务。 而 asStub() 通常是 IYourInterfa

yanzhe999999999的博客 695

Framework添加AIDL文件

  Framework编译AIDL文件   今天下午下载一个开源的Android系统,编译中老遇到如下aidl错误,思考了很久,终于找到解决办法。AIDL是什么?不清楚的可以google。这里重点是如何在android framework中添加新的接口。如下例子,如果没有添加AILD文件,编译系统的时候会出现如下错误。   frameworks/base/core/java/androi...

凌乱的碎片~ 639

Framework开发专题系列四:Binder基础

Binder 是 Android 系统中最核心的进程间通信(IPC)机制,贯穿 Java 层、Native 层与硬件抽象层。本文面向 ROM 开发者,系统讲解 Binder 架构在 Framework 中的五种典型应用形态:AIDL(Android 接口定义语言)、Native Binder(C++/libbinder)、HIDL(硬件接口定义语言)、AsyncChannel(异步双向通道) 及 Messenger(信使)。

学无止境 801

aidl.exe下载

aidl.exe文件,安卓开发使用

【android Framework 探究】浅谈AIDL和Binder

先聊聊binder,本文不是讲binder,android中的binder框架说实话,要从内核-》驱动-》native-》JNI -》Framework-》app层,牵扯的知识点从内核调度,虚拟内存,内存映射,数据结构,线程管理和设计模式,覆盖面太大了,要真正吃透binder需要大量的时间投入,甚至可能走很多弯路,我的建议 对应用开发者,需要熟练掌握AIDL编写方式,理解Binder作者在android框架进程通讯的设计原理,理解常接触的Stub,Proxy这些角色的概念和Parcel序列化传输。 当然.

lucky_tom的专栏 901

AIDL简单实例下载

AIDL简单实例下载,有两个项目分别是客户端和服务端。也有在同个项目里面的两个module

Android Binder实战开发指南之开篇

        Android Binder实战开发指南之开篇 前言   网上关于Binder的原理和深入探讨的文章不在少数,其中有许多大牛的文章和博客令人恍然大悟,有种遁入空门冲突有木有,读过理解过给人一种大彻大悟的感觉。但是乎关于Binder实际工作中运用到的,专门的篇章比较少。在本篇章中我就从四个维度来以实战角度出发来归纳总结,Binder在实际开发中可能的四个场景。带领读者打怪升级,开...

IT先森 1989

CTP高频Tick数据:五档期货Level2深度解析20241224

高频Tick五档期货Level2数据,作为一种先进的金融市场分析工具,以其一秒四次的高频更新,为投资者揭示了市场的微观结构。本文将深入探讨这一数据如何帮助投资者洞察市场动态,优化交易策略,实现投资收益的最大化。

level2Tick的博客 1218

拓扑优化背后的科学:ANSYS Workbench中的算法与原理

本文深入解析了ANSYS Workbench中拓扑优化的科学原理与算法实现,重点介绍了密度法(SIMP)和灵敏度分析等核心算法。通过分层架构解析和参数调优实战,展示如何有效进行模型验证与多物理场耦合优化,帮助工程师提升结构设计效率与性能。

weixin_29250403的博客 417

hal深入剖析之aidl实战-android framework车机车载手机系统开发

创建最重要的aidl接口文件,需要在第一步创建的目录下`-- mytest编写aidl内容:String key;int value;还是就是parcelable都是需要进行结构化,成员属性写清楚到aidl。

learnframework的博客 6162

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 820

Android Binder【篇三:透视 Framework Java 通信机制】

Binder是Android系统提供的一种IPC( 进程间通信) 机制,在Java层中如果想要利用Binder进行跨进程的通信, 也得定义一个类似ITest的接口,不过这是一个aidl文件。阿斗(aidl的谐音) 本来是扶不起的, 可是我们有了AIDL工具,就有可能将他扶起!即AIDL是Binder系统面向Java层的一种实现机制。 参考:Android中AIDL的使用详解 一、AIDL简单演示 AIDL是Android中IPC(Inter-Process Communication)方式中的一...

qq_27672101的博客 2751

Hyper-V虚拟机 安装 银河麒麟V10桌面版

如何在windows 11 Hyper-V 虚拟机中 安装 银河麒麟V10桌面版。

m0_46756112的博客 3418

纳米尺度仿真软件:Quantum Espresso_(13).非线性光学性质计算

通过 Quantum Espresso,可以高效地计算材料的非线性光学性质,包括二阶和三阶非线性极化率。这些性质在许多现代技术中具有重要的应用价值。在准备输入文件时,需要详细描述系统的晶格结构和原子位置,选择合适的基组和赝势,并设置计算参数和微扰设置。通过优化计算参数和使用并行计算,可以提高计算效率和精度。最后,使用适当的工具进行结果分析和可视化,可以更好地理解材料的非线性光学行为。

kkchenjj的博客 1278

Android Framework——进程间通讯学习,从Binder使用看起_activitymanager binder transaction

先看谷歌官方开发者文档的介绍 我们可以利用AIDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在安卓中,编写进程间通信的代码较为繁琐,Android 会使用AIDL 帮我们处理这类问题。我们先从一个典型的AIDL实例入手来探究。我们来定义一个 aidl 接口文件其中用到了User对象,所以上文还定义了该User.aidl,该对象实现Parcelable接口。我们找到。/***/可以看到生成了。

2401_84102892的博客 1186

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384
上一篇: Android FrameWork开发之binder驱动的源码分析1
下一篇: Android Framework实战开发-binder通信常见(oneway,in,out,inout)元素介绍及binder双向通信的实现
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值