android Aidl原理分析
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原理分析相关推荐
- Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
1.概述 上一节我们写了一个AIDL的示例,实现了两个应用之间的通信,这一节我们就来一起探讨下AIDL是如何生效的. 2.什么是AIDL AIDL:Android Interface Definiti ...
- android 实例源码解释,Android Handler 原理分析及实例代码
Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...
- Android LayoutInflater原理分析,带你一步步深入了解View
Android视图绘制流程完全解析,带你一步步深入了解View(一) 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 ...
- Android JNI原理分析
引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: frameworks ...
- android消除锯齿原理分析
原文地址:https://blog.csdn.net/Apple_hsp/article/details/50833300 前言 在Android中view绘画是很重要的一点,当view重写.surf ...
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 有段时间没写博客了,感觉都有些生疏了呢.最近繁忙的工作终于告一段落, ...
- android 补间动画有停顿,Android动画原理分析(一)----补间动画
1.基本特点 补间动画(Tween动画),是android最早的动画框架,从Android1.0开始就有. 功能:可以实现移动.旋转.缩放.渐变四种效果以及这四种效果的组合形式. 实现形式:xml和代 ...
- Android LayoutInflater原理分析,带你一步步深入了解View(一) 郭霖学习摘要
2019独角兽企业重金招聘Python工程师标准>>> public class MainActivity extends Activity {//----------------- ...
- 第十八期 Android GPS原理分析《手机就是开发板》
如果想对Android的整个框架有一个更深层次的感性认识,我们还需要抓住一个点去研究一下.Android按照模块分成很多个系统,比如Audio,Video Out,Camera,Phone,WIFI, ...
- Android LeakCanary原理分析
概述 在上一篇LeakCanary使用详细教程中,我们熟悉了LeakCanary的使用和初步描述了它的工作机制,这篇我准备从源码的角度去分析LeakCanary的工作原理: 源码分析 从上一篇中我们知 ...
最新文章
- 「译」JUnit 5 系列:基础入门
- MySQL 5.6.26 Release Note解读
- android 获取音乐文件的内置专辑图片
- [置顶] 设计模式之六大原则——单一职责原则(SRP)
- ASP.NET Core文件上传IFormFile于Request.Body的羁绊
- SQL select 语法(转)
- 美国世态什么样,看这条“K”线就够了
- 虚拟机启动后链接超时
- word2vec简单通俗易懂
- MySQL 数据库基础
- 使用Java FXGL构建太空游侠游戏
- linux创建线程pthread_create函数
- 边界安全 - CDN/DMZ/网络协议
- 下课拉~~~~~~~~~~~想写就写
- 使用光学鼠标传感器实现旋转(或线性)测量(转)
- 时间序列分析——自回归移动平均(ARMA)模型
- seo和sem的区别与联系
- Python模块selenium实例:电影分类排名数据生成json,sqlite和excel(openpyxl)文件(一)
- 如何利用巨象指纹浏览器在twitter上找到精准客户
- mac设置共享屏幕 苹果mac屏幕共享设置详细教程