经常遇到binder泄露的问题,要怎么分析呢
一 加log
1: binder 驱动log :要先其他log锁定时间点,因为他的进程号一直是0 所以不建议这里加log。
可以直接打印对应的文件信息:/dev/binderfs/binder_logs/state
2: writeStrongBinder 客户端只要有binder请求,都会调用这个接口
对应的服务端也会调用这个readStrongBinder接口(native层对应的接口也有)
3:给binder 传入自己的 ProxyTransactListener 可以实现客户端调用开始结束等的监听
参考 MediaProvider里面的Binder.setProxyTransactListener(mTransactListener);
4: BinderProxy内部的map缓存也会在set的时候打印关键信息
加log信息:看对应进程的binder连接数,kenel看node数,必要时候打印堆栈信息以获取具体泄露调用链,或hprop文件查看对应的泄露对象和调用链。
打印hprop文件
Debug.dumpHprofData("/data/system/dropbox/" + file);
打印堆棧信息:
Log.i("ygn",new Exception("Custom Exception")
二 案例总结
赞以赞一并贴出来