android Aidl原理分析

  • aidl的创建
  • server端使用
  • Client的使用

aidl是为了解决进程间通信的,也是binder的最好体现,下面分析一下:

先是aidl文件的创建

interface testtt{/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);int test(int dec);
}

第一个方法告诉我们binder通信支持的基本数据类型,会自动创建,第二个方法是我们定义的。
再来看server端:

public class MyService extends Service {public MyService() {}@Overridepublic IBinder onBind(Intent intent) {return binder;}Binder binder = new testttt.Stub(){@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {}@Overridepublic int test(int dec) throws RemoteException {return 0;}};
}

返回在client端绑定server的时候返回binder对象,而这个binder对象需要判断是否为跨进程。
最后看clent端:

ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {testttt test = testttt.Stub.asInterface(service);try {test.test(3);} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {}};

asInterface方法返回aidl接口类对象,而实现接口的是Myservice中的stub类,因此test.test方法最终调用的是Myservice中的stub类中的test方法。
因编译器自己生成的testtt.java文件,重点分析这个文件:

public interface testttt extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.uyun.testmap.testmap.testttt
{
private static final java.lang.String DESCRIPTOR = "com.uyun.testmap.testmap.testttt";
/** Construct the stub at attach it to the interface. */
public Stub()
{this.attachInterface(this, DESCRIPTOR);
}
/*** Cast an IBinder object into an com.uyun.testmap.testmap.testttt interface,* generating a proxy if needed.*/
public static com.uyun.testmap.testmap.testttt asInterface(android.os.IBinder obj)
{if ((obj==null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof com.uyun.testmap.testmap.testttt))) {return ((com.uyun.testmap.testmap.testttt)iin);}return new com.uyun.testmap.testmap.testttt.Stub.Proxy(obj);
}

我们看asInterface方法,IBinder 通过DESCRIPTOR查找aidl接口真正实现对象,若为本地引用,则直接返回,若为跨进程应用,返回Stub.Proxy代理对象,再进入:

private static class Proxy implements com.uyun.testmap.testmap.testttt
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public int test(int dec) 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.writeInt(dec);
mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}

这里调用test方法,即调用mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0);,而mRemote是asInterface中的参数obj,即MyService中的参数binder,transact方法调用onTransact方法

/*** Default implementation rewinds the parcels and calls onTransact.  On* the remote side, transact calls into the binder to do the IPC.*/public final boolean transact(int code, Parcel data, Parcel reply,int flags) throws RemoteException {if (false) Log.v("Binder", "Transact: " + code + " to " + this);if (data != null) {data.setDataPosition(0);}boolean r = onTransact(code, data, reply, flags);if (reply != null) {reply.setDataPosition(0);}return r;}

而onTransact方法的实现在stub类中。

@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_test:
{
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
int _result = this.test(_arg0);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}

android Aidl原理分析相关推荐

  1. Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式

    1.概述 上一节我们写了一个AIDL的示例,实现了两个应用之间的通信,这一节我们就来一起探讨下AIDL是如何生效的. 2.什么是AIDL AIDL:Android Interface Definiti ...

  2. android 实例源码解释,Android Handler 原理分析及实例代码

    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...

  3. Android LayoutInflater原理分析,带你一步步深入了解View

    Android视图绘制流程完全解析,带你一步步深入了解View(一) 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 ...

  4. Android JNI原理分析

    引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: frameworks ...

  5. android消除锯齿原理分析

    原文地址:https://blog.csdn.net/Apple_hsp/article/details/50833300 前言 在Android中view绘画是很重要的一点,当view重写.surf ...

  6. Android LayoutInflater原理分析,带你一步步深入了解View(一)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 有段时间没写博客了,感觉都有些生疏了呢.最近繁忙的工作终于告一段落, ...

  7. android 补间动画有停顿,Android动画原理分析(一)----补间动画

    1.基本特点 补间动画(Tween动画),是android最早的动画框架,从Android1.0开始就有. 功能:可以实现移动.旋转.缩放.渐变四种效果以及这四种效果的组合形式. 实现形式:xml和代 ...

  8. Android LayoutInflater原理分析,带你一步步深入了解View(一) 郭霖学习摘要

    2019独角兽企业重金招聘Python工程师标准>>> public class MainActivity extends Activity {//----------------- ...

  9. 第十八期 Android GPS原理分析《手机就是开发板》

    如果想对Android的整个框架有一个更深层次的感性认识,我们还需要抓住一个点去研究一下.Android按照模块分成很多个系统,比如Audio,Video Out,Camera,Phone,WIFI, ...

  10. Android LeakCanary原理分析

    概述 在上一篇LeakCanary使用详细教程中,我们熟悉了LeakCanary的使用和初步描述了它的工作机制,这篇我准备从源码的角度去分析LeakCanary的工作原理: 源码分析 从上一篇中我们知 ...

最新文章

  1. 「译」JUnit 5 系列:基础入门
  2. MySQL 5.6.26 Release Note解读
  3. android 获取音乐文件的内置专辑图片
  4. [置顶]       设计模式之六大原则——单一职责原则(SRP)
  5. ASP.NET Core文件上传IFormFile于Request.Body的羁绊
  6. SQL select 语法(转)
  7. 美国世态什么样,看这条“K”线就够了
  8. 虚拟机启动后链接超时
  9. word2vec简单通俗易懂
  10. MySQL 数据库基础
  11. 使用Java FXGL构建太空游侠游戏
  12. linux创建线程pthread_create函数
  13. 边界安全 - CDN/DMZ/网络协议
  14. 下课拉~~~~~~~~~~~想写就写
  15. 使用光学鼠标传感器实现旋转(或线性)测量(转)
  16. 时间序列分析——自回归移动平均(ARMA)模型
  17. seo和sem的区别与联系
  18. Python模块selenium实例:电影分类排名数据生成json,sqlite和excel(openpyxl)文件(一)
  19. 如何利用巨象指纹浏览器在twitter上找到精准客户
  20. mac设置共享屏幕 苹果mac屏幕共享设置详细教程

热门文章

  1. 自己搭建Markdown的wiki管理系统
  2. 视频接口的种类及数据类型
  3. 如何在线将WAV转换为MP3格式
  4. 怎么才能打开dwg图纸?
  5. Java——JButton按钮
  6. 矩阵转置,矩阵加,矩阵乘Java
  7. 等保2.0三级通用要求
  8. android emoji 开源库,Emoji开源库推荐_支持emoji表情的js的开源项目总汇
  9. IEEE Latex下载
  10. 3A锂电池充电管理芯片PW4035