Android

Android开发之StrictMode

2019-08-01  本文已影响0人  wind_sky

一. 简介

StrictMode(严格模式)是在Android 2.3(API 9)开始引入的类,StrictMode就是用来指定一系列策略(policy),对相应规则(rule)进行检查并给出反应。StrictMode有多种不同的策略,每一种策略又有不同的规则,当开发者违背某个规则时,每个策略都有不同的方法去显示提醒用户。

1. 策略类型

目前,有两种类型的策略:

Thread Policy : 线程策略应用到特定的线程。

VM Policy : VM是Virtual Machine的缩写,表示“虚拟机”,不要搞错以为是Virtual Memory(虚拟内存)。应用于虚拟机进程中的所有线程。

1)ThreadPolicy.Builder中的一些方法:
2)VmPolicy.Builder中的一些方法 :

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

上一篇下一篇

猜你喜欢

热点阅读