StrictMode是怎样监控主线程I/O的?
2016-06-06 本文已影响316人
来自地球的专项测试
setThreadPolicy之后就会调用下面这个函数,分别是“setBlockGuardPolicy”用于保存线程规则到Java代码的。而“Binder.setThreadStrictModePolicy"则是保存线程规则到Binder, 在跨进程调用中也可以触发的Thread Policy并处理。注意的是,研究了半天代码,发现后者基本上就是保存而已,并没有进行是否主线程I/O的判断。
那跟着,我们就重点说说Java的setBlockGuardPolicy, 通过设置BlockGuard,线程规则和对应的处理方式通过全局变量threadPolicy保存下来。
当需要使用的时候,则调用BlockGuard.getThreadPolicy来获取规则设置
使用的时候很简单,例如在BlockGuardOS.java(全部文件接口的实现)去执行BlockGuard.getThradPolicy().onWriteToDisk()来处理这否主线程I/O并执行生成crash或者获取堆栈。
正如上面所说,下面就是onWriteToDisk真实处理的代码,可以看到它会打印堆栈。
除了文件,数据库也进行了主线程I/O的监控, 通过一切数据库操作入口:execute函数执行applyBlockGuardPolicy,达成了同步去监控是否有主线程读写并产生对应处理的效果。