我们知道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