监控android binder size

我们知道binder是android中跨进程通信的一大亮点,但binder通信时如果待传数据较大,可能会出现binder call失败,那怎么才能监控传输多大的size呢。

frameworks/base/core/java/android/os/Binder.java#661
687    private boolean execTransact(int code, long dataObj, long replyObj,
688            int flags) {
689        Parcel data = Parcel.obtain(dataObj);
690        Parcel reply = Parcel.obtain(replyObj);
......
702            res = onTransact(code, data, reply, flags);
......
723        checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
724        reply.recycle();
725        data.recycle();

看到binder服务端里面有个checkParcel,这个就是关键,每次java层面收到的binder call 都会调用此方法,无论成功还是失败,那么接收端也是同理,其code如下,发送请求之前就会调用checkParcel

frameworks/base/core/java/android/os/Binder.java#750

749    public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
750        Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");

既然发送和接收都会调用checkParcel,那么问题就归一了,看下其实现


658    static void checkParcel(IBinder obj, int code, Parcel parcel, String msg) {

660        if (CHECK_PARCEL_SIZE && parcel.dataSize() >= 800*1024) {
663            StringBuilder sb = new StringBuilder();
664            sb.append(msg);
665            sb.append(": on ");
......
679            Slog.wtfStack(TAG, sb.toString());
680        }

只是一个if条件,然后封装字符串,输出wtf的log。如此而已,那么,手机厂商们就可以修改这个if条件了。随你怎么造。

例如:

1,设置版本控制,例如debug版本开、release版本关闭;

2,通过属性动态设置care的size,如将persist属性的值赋值给CHECK_PARCEL_SIZE,就可以完成动态监控;

到此就了解完毕了。

 

下面简单说下WTF log的输出,只是调用了Log.wtf,而且指定了输出到system

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值