Android开发之StrictMode
一. 简介
StrictMode(严格模式)是在Android 2.3(API 9)开始引入的类,StrictMode就是用来指定一系列策略(policy),对相应规则(rule)进行检查并给出反应。StrictMode有多种不同的策略,每一种策略又有不同的规则,当开发者违背某个规则时,每个策略都有不同的方法去显示提醒用户。
1. 策略类型
目前,有两种类型的策略:
Thread Policy : 线程策略应用到特定的线程。
VM Policy : VM是Virtual Machine的缩写,表示“虚拟机”,不要搞错以为是Virtual Memory(虚拟内存)。应用于虚拟机进程中的所有线程。
1)ThreadPolicy.Builder中的一些方法:
-
detectAll() : 监测一切潜在违规
-
detectCustomSlowCalls() : 监测自定义的耗时操作
-
detectDiskReads() : 监测磁盘读
-
detectDiskWrites() : 监测磁盘写
-
detectNetwork() : 监测网络操作
-
permitAll() : 禁用所有监测
-
permitDiskReads() : 允许磁盘读
2)VmPolicy.Builder中的一些方法 :
-
detectAll() : 监测一切潜在违规
-
detectActivityLeaks() : 监测 Activity 泄露
-
detectLeakedClosableObjects() : 当显式中止方法调用之后,假如可被Closeable类或其他的对象没有被关闭。
2. Penalty
Penalty是 “处罚”的意思,所以凡是以penalty开头的方法都表示违规时要做出什么反应。
对于每个策略,我们可以指定多个处罚形式,而处罚也是从最不严重的到最严重(从打印日志到直接crash(崩溃))依次执行。
暂时还没有机制能使监测到的违规与特定的处罚对应。
penaltyDeath() : 违规时,直接使应用崩溃。
penaltyDialog() : 违规时,向开发者显示一个Dialog对话框。
penaltyLog() : 违规时,将违规信息写入系统日志。
二. 使用
1. 设置策略
你可以在你的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()
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.detectLeakedRegistrationObjects()
.detectActivityLeaks()
.penaltyLog()
.build());
}
}
2. 扩展策略
即在原有策略基础上,进行扩充,有以下两步:
1)用getThreadPolicy() 或getVmPolicy()获得当前策略,并保存
2)用setThreadPolicy() or setVmPolicy()来扩充它
StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.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());
这种方法可以用来在某种我们自己了解的情况下,忽略原有策略。
注:
(1)StrictMode 输出的日志都是以StrictMode开头的
(2)在debug模式使用,不要在release模式使用,以免给用户带来影响
(3)调用JNI实现的磁盘读写操作和网络操作不会激活StrictMode