启动速度与执行效率优化项目实战(四),android 开发入门与实战网盘
严苛的老师
是的,聪明如你果然猜对了。StrictMode 就是用来指定一系列策略(policy),对相应规则(rule)进行检查并且做出反应。
这些策略大致包括 Android 的编码规范,例如监控在主线程(UI 线程)中的操作,等等。
StrictMode 有不同的策略,每种策略又用不同的规则(rule),每种规则又对应不同的方法,一旦规则被违反,这些对应的方法就会被用来做出反应。
注意 :
在 Debug 模式启用 StrictMode,别在 Release 模式启用。用户的小心脏是很脆弱的,假如一点点违规就导致应用崩溃,或者弹窗,那用户会把你的应用删除了。
特别地, 调用 JNI 实现的磁盘读写操作和网络操作不会激活 StrictMode。
[](
)策略类型
目前,有两种类型的策略:
Thread Policy : 线程策略应用到特定的线程。
VM Policy : VM 是 Virtual Machine 的缩写,表示“虚拟机”,不要搞错以为是 Virtual Memory(虚拟内存)。应用于虚拟机进程中的所有线程。
ThreadPolicy.Builder 中的一些方法:
detectAll() : 侦测一切潜在违规
detectCustomSlowCalls() : 侦测自定义的耗时操作
detectDiskReads() : 侦测磁盘读
detectDiskWrites() : 侦测磁盘写
detectNetwork() : 侦测网络操作
permitAll() : 禁用所有侦测
permitDiskReads() : 允许磁盘读
VmPolicy.Builder 中的一些方法 :
detectAll() : 侦测一切潜在违规
detectActivityLeaks() : 侦测 Activity(活动)泄露
detectLeakedClosableObjects() : 当显式中止方法调用之后,假如可被 Closeable 类或其他的对象没有被关闭。
[](
)处罚
Penalty 是英语“处罚”的意思,所以凡是以 penalty 开头的方法都表示违规时要做出什么反应。
对于每个策略,我们可以指定多个处罚形式,而处罚也是从最不严重的到最严重(从打印日志到直接 crash(崩溃))依次执行。
暂时还没有机制能使监测到的违规与特定的处罚对应。
penaltyDeath() : 违规时,直接使应用崩溃。
penaltyDialog() : 违规时,向开发者显示一个恼人的 Dialog 对话框。
penaltyLog() : 违规时,将违规信息写入系统日志。
[](
)使用
StrictMode 使用起来非常简单。
[](
)设置策略
你可以在你的 Application(应用)或者应用中的 Activity 的 onCreate()方法中设置启用 StrictMode 的策略。不过为了更全面的监测,最好就放在 Application 的 onCreate()方法中,一劳永逸。
设置 StrictMode 可以通过 setVmPolicy(StrictMode.VmPolicy)或 setThreadPolicy(StrictMode.ThreadPolicy)。
setVmPolicy(StrictMode.VmPolicy)或 setThreadPolicy(StrictMode.ThreadPolicy)方法的参数是用 VmPolicy.Builder 或 ThreadPolicy.Builder 来构建的。
举例:
@Override
public void onCreate() {
super.onCreate();
// 分别为 MainThread 和 VM 设置 Strict Mode
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.detectResourceMismatches()
.detectCustomSlowCalls()
.penaltyDeath()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.detectLeakedRegistrationObjects()
.detectActivityLeaks()
.penaltyDeath()
.build());
}
}
[](
)扩充 StrictMode
1.用 getThreadPolicy() 或 getVmPolicy()获得当前策略。
2.用 setThreadPolicy() or setVmPolicy()来扩充它。
举例:
StrictMode.ThreadPolicy oldThreadPolicy = Str
ictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
.permitDiskWrites() // 在原有策略的规则基础上,不监测读写磁盘
.build());
StrictMode.VmPolicy oldVmPolicy = StrictMode.getVmPolicy();
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(oldVmPolicy)
.detectFileUriExposure() // 在原有策略的规则基础上,监测文件 URI 暴露
.build());
[](
)StrictMode 的日志形式
评论