写点什么

启动速度与执行效率优化项目实战(四),android 开发入门与实战网盘

用户头像
Android架构
关注
发布于: 2 小时前

严苛的老师


是的,聪明如你果然猜对了。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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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 的日志形式

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
启动速度与执行效率优化项目实战(四),android开发入门与实战网盘