使用严格模式提高代码质量

昔日凭借单元测试,严格模式,崩溃日志分析三大法宝,
我同其他同事,一起把360手机卫士的错误率,降到了万分之三以下。
时至今日仍然未见到比较好的,使用StrictMode的代码工具类或者教程,
今天拿出来分享一下,给有志提高代码质量的猿。

为什么需要严格模式

有些问题不能被立刻发现,容易造成很多莫名其妙的现象。

或者短期没有异常现象,影响到了长期的稳定。

例如:内测泄露,文件资源不释放,数据库不关闭等。

为了能够即时发现这些错误,安卓引入了严格模式这个概念。

严格模式的含义

严格模式是一个开关,开启之后一些严格检查的代码会生效。
检查到问题后会主动崩溃报错。

严格模式的精神

尽快暴露错误,而不是隐藏和绕过错误。

严格模式有两个特点:

  1. 什么时候出错,什么时候就会报错;
  2. 哪里出错,就会在哪里报错。

怎样开启

严格模式是默认关闭等,这样用户体验是稳定的,不受影响。

测试过程中,通过开关软件开启严格模式,这样能发现更多问题。

工具类

package ovo.top.app;

import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;

import java.io.File;

/**
 * 参考//www.greatytc.com/p/98f348fc7688 
 * Created by 曹建峰(windcao@hotmail.com) on 2017/2/22.
 * 单独控制activity开关
 */
public class StrictModeManager {
    private static final String STRICT_MODE_CFG = "ovo.top.stictmode.cfg/enable";
    private static final String ACTIVITY_LEAKS_DETECT_CFG = "ovo.top.stictmode.cfg/enable/activity_leaks_detect";
    private static final boolean DEBUG = false;
    private static boolean sIsInStrictMode = false;
    private static boolean sEnableActivityLeaksDetect = false;
    private static boolean sIsFlgChecked = false;

    public static void init() {
        checkStrictModeCfg();
        if (sIsInStrictMode) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            if (sEnableActivityLeaksDetect) {
                builder.detectAll();
            } else {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    builder.detectLeakedClosableObjects();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        builder.detectLeakedRegistrationObjects();
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
                            builder.detectFileUriExposure();
                        }
                    }
                }
                builder.detectLeakedSqlLiteObjects();
            }

            builder.penaltyLog().penaltyDropBox().penaltyDeath();
            StrictMode.setVmPolicy(builder.build());

            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectNetwork()
                    .penaltyLog()
                    .penaltyDropBox()
                    .penaltyDialog()
                    .build());
        }
    }

    public static boolean isInStrictMode() {
        checkStrictModeCfg();
        return sIsInStrictMode;
    }

    /**
     * 有些情况下我们希望立刻发现错误,有任何异常都曝光出来,而不是带着错误继续执行。这样可以尽快发现错误。
     * 这种情况下将刚捕获的异常放到handleException就可以了。
     * 严格模式下,这些被处理的Exception 仍会立刻抛出。而非严格的模式下,会写日志。
     * @param e
     * @param msg
     */
    public static void handleException(Exception e, String msg) {
        if (isInStrictMode()) {
            throw new RuntimeException(msg, e);
        } else if (DEBUG) {
            Log.e("Exception", msg, e);
        }
    }

    private static void checkStrictModeCfg() {
        if (sIsFlgChecked == false) {
            File strictModeCfgFile = new File(Environment.getExternalStorageDirectory(), STRICT_MODE_CFG);
            sIsInStrictMode = strictModeCfgFile.exists();

            File activityLeaksCfgFile = new File(Environment.getExternalStorageDirectory(), ACTIVITY_LEAKS_DETECT_CFG);
            sEnableActivityLeaksDetect = activityLeaksCfgFile.exists();

            sIsFlgChecked = true;
        }
    }
}

使用方法:

在Application的onCreate中添加一行代码
  public void onCreate() {
        StrictModeManager.init();
        super.onCreate();
 }

开启开关:

caojianfeng$ adb shell mkdir /sdcard/ovo.top.stictmode.cfg/
caojianfeng$ adb shell mkdir /sdcard/ovo.top.stictmode.cfg/enable
caojianfeng$ adb shell mkdir /sdcard/ovo.top.stictmode.cfg/enable/activity_leaks_detect

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,039评论 25 707
  • Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个An...
    Ten_Minutes阅读 842评论 0 2
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    Mr希灵阅读 21,956评论 7 278
  • 在这家大房企工作了五年多,终于有了到总部出差的机会。在总部停留了四天,对总部印象如下。 第一,总部工作环境一流。地...
    肯登攀阅读 388评论 0 0
  • 1、 三位老师教学服务经验分享中,你的最大收获是什么?(请结合第一周学习内容) 我的整体收获:完整的教学服务系统要...
    Alicia2017阅读 259评论 1 2