原理(基于Andorid8"/>
从AIDL来看Binder的通信原理(基于Andorid8
通过 startService()
和 bindService()
两种方式开启,在framwork框架层中没有发现流程中使用add_service方法(甚至都没出现ServiceManager)。
↑ 这就看出无论自定义Service最后在不在ServiceManager中,Android本身是不希望我们通过ServiceManager的途径去获取使用自定义Service的。
上述第二条的结论,原因是什么?我不是很清楚,但是基于结论来看:
只要一个进程持有另一进程的BinderProxy类,那我还去找 ServiceManager干什么,这不更加省事吗?
所以,在自定义的流程中把ServiceManager忽略掉,我们就不用考虑Service到底有没有注册在ServiceManager中了。
[](()2. 从AIDL上看Binder
==================================================================================
AIDL本质上是在Java层对Binder进行了封装。所以Android8.0前后AMS是否使用了AIDL,本质都是使用Binder + 代理模式,只是说使用了 AIDL通过编译时生成代码,节省了一些代码的编写,提高了开发效率。
那么我们就从编译时产生的代码开始,来看看Binder的运作机制,这里使用的例子是:[使用AIDL来进行进程间通信]((),就是一个 Service远程服务 + User类 + IUserManager代理类
[](()2.1 用于进程传输的Stub类
在编译文件产生的 IUserManager中,它是一个接口类,同时它有一个静态内部类 Stub
:
// IUserManager.java
// 0
public static abstract class Stub extends android.os.Binder implements com.rikkatheworld.aidl_demo.IUserManager {
private static final java.lang.String DESCRIPTOR = “com.rikkatheworld.aidl_demo.IUserManager”;
// 1
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
// 2
public static com.rikkatheworld.aidl_demo.IUserManager asInterface(android.os.IBinder obj) {
…
}
// 3
@Override
public android.os.IBinder asBinder() {
return this;
}
// 4
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
…
}
// 5
private static class Proxy implements com.rikkatheworld.aidl_demo.IUserManager {
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote) {
mRemote = remote;
}
…
// 6
@Override
public com.rikkatheworld.aidl_demo.User getUser(java.lang.String name) throws android.os.RemoteException {
…
}
}
}
Stub类分成两个部分,一个是自己本身的成员方法,另一个是Proxy类,先来看看这些成员。
(1)自身部分
- 注释0
Stub类继承自 Binder
,说明这个类是用于进程间传输的。
- 注释1
Stub()
构造方法,把自身和标记自身的descriptor传入,
更多推荐
从AIDL来看Binder的通信原理(基于Andorid8
发布评论