对象和Binder驱动 Java层的Binder AIDL 服务端 客户端 分析原理 AMS的Binder体系 结语 0 前言 Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从Linux...相关的基础概念知识开始介绍,从基础概念知识中引出Binder机制,归纳Binder机制与Linux系统的跨进程机制的优缺点,接着分析Binder的通信模型和原理,而Binder机制最佳体现就是AIDL,...的某些机制,主要想表达Binder驱动的出现的原因,如果对Linux熟悉的可以直接跳过这部分,看第五点即可 一、进程隔离 出于安全考虑,一个进程不能操作另一个进程的数据,进而一个操作系统必须具备进程隔离这个特性...Linux的动态可加载内核模块机制解决了这个问题,模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。...; Proxy(android.os.IBinder remote) { mRemote = remote;
我们都知道Android是基于Linux内核的,那我们简单介绍下Linux下的几种IPC机制。 管道(Pipe) 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。...而在linux通信机制中,目前只有socket支持C/S的通信模式,但socket有其劣势,具体参看第二条。 有更好的传输性能。...Linux的IPC机制在本身的实现中,并没有安全措施,得依赖上层协议来进行安全控制。...而Binder机制的UID/PID是由Binder机制本身在内核空间添加身份标识,安全性高;并且Binder可以建立私有通道,这是linux的通信机制所无法实现的(Linux访问的接入点是开放的)。...函数,这里的mRemote是BinderProxy类,关于这一点我们在Native层分析的时候再给出 mRemote.transact(START_ACTIVITY_TRANSACTION
Android Binder设计与实现 - 设计篇,其中深入到了底层原理实现,篇幅很长,需要耐心看完 Binder机制是安卓自己的一套跨进程通信机制,对此需要有进程的概念,Java--线程中有提到进程,当然Linux...Proxy implements com.aruba.serviceapplication.IMyAidlInterface { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; }...@Override public android.os.IBinder asBinder() { return mRemote;...@Override public android.os.IBinder asBinder() { return mRemote;
boolean _status = mRemote.transact(Stub.TRANSACTION_demo, _data, _reply, 0); 拿到mRemote后,调用它的transact方法...我们可以大概看看出,Proxy实现了IDemoInterface的方法,内部实现是通过mRemote去调用的。...这个mRemote就是bindService拿到的IBinder service,也就是BinderProxy....接下来执行 mRemote.transact(Stub.TRANSACTION_getDemo, _data, _reply, 0); 这里的mRemote,我们现在知道,他是BinderProxy.调用了...调用mRemote.transact(),返回值会写入到Parcel对象中。 从Parcel对象中读出返回值并return。
探秘mRemote 涉及代码:需要解决两个问题,一个是mRemote哪里来,另一个是mRemote的transact方法 mRemote.transact(START_SERVICE_TRANSACTION..., data, reply, 0); mRemote哪里来 搜寻发现,ActivityManagerProxy 类的构造方法进行赋值,而 ActivityManagerProxy(AMP) 这个类又被...= remote; } } 可知mRemote便是指向AMS服务的BinderProxy对象。...mRemote的transact方法 [-> Binder.java::BinderProxy] final class BinderProxy implements IBinder { public...boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException; mRemote
Proxy implements com.toly1994.tolyservice.IMusicPlayerService { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; }...@Override public android.os.IBinder asBinder() { return mRemote;...try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact...try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact
《个人平时笔记,看到的同学欢迎指正错误》 1、安卓它是一种基于Linux内核的移动操作系统。Linux上可以通过命名管道、共享内存、信号量等来进行进程间通信。...Android开发艺术探索》一书中定义:从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux...class Proxy implements com.fivefloor.bo.myview.IBookManager { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; }...@Override public android.os.IBinder asBinder() { return mRemote;
private static class Proxy implements com.zzw.testaidl.IUserAidl { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; }...@Override public android.os.IBinder asBinder() { return mRemote;...Proxy关键代码: //mRemote是服务端返回的IBinder实例 IUserAidl.Stub _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact...我们知道mRemote是IUserAidl.Stub,他是继承Binder的,在Binder查看到transact函数 /** * Default implementation rewinds
static class Proxy implements net.sxkeji.shixinandroiddemo2.IMyAidl { private android.os.IBinder mRemote...; //代理的远端 IBinder Proxy(android.os.IBinder remote) { mRemote = remote; } //获取代理的...Binder @Override public android.os.IBinder asBinder() { return mRemote; } public....bean.Person> _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact...} return _result; } @Override public IBinder asBinder() { return mRemote
BpInterface(const sp& remote) : BpRefBase(remote) BpRefBase::BpRefBase(const sp& o) : mRemote...; } inline IBinder* remote() const { return mRemote; } private:...BpRefBase& o); BpRefBase& operator=(const BpRefBase& o); IBinder* const mRemote...; RefBase::weakref_type* mRefs; std::atomic mState; }; 从上面继承流程可以得到这个remote()返回的就是mRemote...,而mRemote其实是最开始的参数BpBinder(0)。
Proxy implements com.me.guanpj.binder.UserManager { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote;...} @Override public android.os.IBinder asBinder() { return mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; } @Override...public android.os.IBinder asBinder() { return mRemote; } public
private static class Proxy implements IServiceManager { private IBinder mRemote...; Proxy(IBinder remote){ mRemote = remote; }...data.writeInterfaceToken(DESCRIPTOR); _data.writeString(name); boolean _status = mRemote.transact...ServiceManagerProxy implements IServiceManager { public ServiceManagerProxy(IBinder remote){ mRemote...private IBinder mRemote; private IServiceManager mServiceManager; }}这样,我们使用ServiceManager.addService
(o.get()), mRefs(NULL), mState(0) { extendObjectLifetime(OBJECT_LIFETIME_WEAK); if (mRemote)...{ mRemote->incStrong(this); // Removed on first IncStrong()....mRefs = mRemote->createWeak(this); // Held for our entire lifetime. } } mRemote是一个IBinder* 指针,它最终的指向为...BpBinder,也就是说BpServiceManager的mRemote指向了BpBinder。...reply.readExceptionCode() : err; } remote()指的是mRemote,也就是BpBinder。
FIRST_CALL_TRANSACTION + 37); TRANSACTION_captivePortalCheckComplete = (FIRST_CALL_TRANSACTION + 38); mRemote...TRANSACTION): _data = Parcel() _reply = Parcel() _data.writeInterfaceToken(DESCRIPTOR) mRemote.transact...(netId) if disableOthers: _data.writeInt32(1) else: _data.writeInt32(0) mRemote.transact...= Parcel.obtain() _result = None try: _data.writeInterfaceToken(DESCRIPTOR) mRemote.transact...getDhcpInfo(): _data = Parcel() _reply = Parcel() _data.writeInterfaceToken(DESCRIPTOR) mRemote.transact
class Proxy implements my.itgungnir.ipc.binder.IBookManager { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; }...@Override public android.os.IBinder asBinder() { return mRemote;...try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact
static class Proxy implements kim.hsl.aidl_demo.IMyAidlInterface { private android.os.IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; } @Override public...android.os.IBinder asBinder() { return mRemote; } public java.lang.String...} else { _data.writeInt(0); } boolean _status = mRemote.transact..._result; try { _data.writeInterfaceToken(DESCRIPTOR); boolean _status = mRemote.transact
} private static class Proxy implements IRemoteService { private IBinder mRemote...; Proxy(android.os.IBinder remote) { mRemote = remote; }...@Override public android.os.IBinder asBinder() { return mRemote;...try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact...然后调用 mRemote的 transact()方法(其实就是调用 BinderProxy的 transact()方法)。
1、Linux内核基础知识 进程隔离/虚拟地址空间 为保证操作系统不同进程间数据互不干扰,进程直接是相互隔离的,这样即使A进程发生崩溃,B进程也不会受到影响。...传统的 Linux有很多通信机制,但是 Binder 并不是 Linux 内核的一部分,它是怎么做到访问内核空间的呢?...Linux 的动态可加载内核模块(Loadable Kernel Module,LKM)机制解决了这个问题;模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。...3、为什么Android使用Binder机制 Linux 本身就支持很多通信机制,比如 Socket,管道,共享内存。...其实在Proxy的构造方法中,传入了一个IBinder对象,保存为成员变量mRemote,这里的add实现,其实是调用了mRemote的transact方法,将请求发送到了真正的服务端来实现,那么Proxy
BpRefBase(remote) { } BpRefBase初始化 Binder.cpp BpRefBase::BpRefBase(const sp& o) : mRemote...(o.get()), mRefs(NULL), mState(0) { extendObjectLifetime(OBJECT_LIFETIME_WEAK); if (mRemote)...{ mRemote->incStrong(this); mRefs = mRemote->createWeak(this); } } new BpServiceManager...(),在初始化过程中,比较重要工作的是类BpRefBase的mRemote指向new BpBinder(0),从而BpServiceManager能够利用Binder进行通过通信。...BpServiceManager巧妙将通信层与业务层逻辑合为一体, 1.通过继承接口IServiceManager实现了接口中的业务逻辑函数; 2.通过成员变量mRemote= new BpBinder
领取专属 10元无门槛券
手把手带您无忧上云