从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)自身部分

  1. 注释0

Stub类继承自 Binder,说明这个类是用于进程间传输的。

  1. 注释1 Stub()

构造方法,把自身和标记自身的descriptor传入,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值