StrictMode嚴(yán)格模式

StrictMode是Android2.3加入的一個工具類檀蹋,用于幫助開發(fā)者發(fā)現(xiàn)代碼中的一些不規(guī)范的問題蛇受。比如網(wǎng)絡(luò)操作,磁盤操作等耗時操作對主線程的影響挑庶。
官網(wǎng)鏈接 https://developer.android.com/reference/android/os/StrictMode.html

1麻削、使用

在Application的衍生類的onCreate()方法中調(diào)用即可劳跃,因為我們只需要在調(diào)試時使用红碑,所以注意在發(fā)行版中屏蔽此段代碼

 @Override
    public void onCreate() {
        if (!AppConfigs.isRelease) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectDiskReads()
                    .detectDiskWrites()
                    .detectNetwork()   // or .detectAll() for all detectable problems
                    .penaltyLog()
                    .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectLeakedSqlLiteObjects()
                    .detectLeakedClosableObjects()
                    .penaltyLog()  
                    .penaltyDeath()
                    .build());
        }
}

2赶站、StrictMode原理

StrictMode原理很簡單诈茧,其實就是Android源碼在相應(yīng)的代碼段預(yù)留了檢測代碼产喉,比如文件open

@Override
public FileDescriptor open(String path, int flags, int mode) throws ErrnoException {
  BlockGuard.getThreadPolicy().onReadFromDisk();
    if ((mode & O_ACCMODE) != O_RDONLY) {
      BlockGuard.getThreadPolicy().onWriteToDisk();
    }
    return os.open(path, flags, mode);
}

3、常用方法介紹

setThreadPolicy()對當(dāng)前線程應(yīng)用監(jiān)測

detectNetwork() 用于檢查UI線程中是否有網(wǎng)絡(luò)請求操作
detectDiskReads() 和 detectDiskWrites() 磁盤讀寫檢查
noteSlowCall針對執(zhí)行比較耗時的檢查
noteSlowCall針對執(zhí)行比較耗時的檢查敢会,用戶可自定義檢測曾沈,使用示例如下

如果線程操作耗時大于500毫秒需要提示給開發(fā)者,noteSlowCall就可以實現(xiàn)這個功能

public class TaskExecutor {
    private static long SLOW_CALL_THRESHOLD = 500;
    public void executeTask(Runnable task) {
        long startTime = SystemClock.uptimeMillis();
        task.run();
        long cost = SystemClock.uptimeMillis() - startTime;
        if (cost > SLOW_CALL_THRESHOLD) {
            StrictMode.noteSlowCall("slowCall cost=" + cost);
        }
    }
}

執(zhí)行一個耗時2000毫秒的任務(wù)

TaskExecutor executor = new TaskExecutor();
executor.executeTask(new Runnable() {
  @Override
    public void run() {
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

penaltyDeath()鸥昏,當(dāng)觸發(fā)違規(guī)條件時塞俱,直接Crash掉當(dāng)前應(yīng)用程序。
penaltyDeathOnNetwork()吏垮,當(dāng)觸發(fā)網(wǎng)絡(luò)違規(guī)時障涯,Crash掉當(dāng)前應(yīng)用程序。
penaltyDialog()膳汪,觸發(fā)違規(guī)時像樊,顯示對違規(guī)信息對話框。
penaltyFlashScreen()旅敷,會造成屏幕閃爍生棍,不過一般的設(shè)備可能沒有這個功能。
penaltyDropBox()媳谁,將違規(guī)信息記錄到 dropbox 系統(tǒng)日志目錄中(/data/system/dropbox)涂滴,你可以通過如下命令進(jìn)行插件:

adb shell dumpsys dropbox dataappstrictmode --print
permitCustomSlowCalls()友酱、permitDiskReads ()、permitDiskWrites()柔纵、permitNetwork: 如果你想關(guān)閉某一項檢測缔杉,可以使用對應(yīng)的permit方法。*
如果某些操作是你認(rèn)為沒有問題的搁料,可以手動關(guān)閉對該段代碼的檢測或详,代碼示例如下

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder(old)
.permitDiskWrites()
.build());
//TODO: do things you think is ok
StrictMode.setThreadPolicy(old);

detectAll()表示對當(dāng)前線程所有方法應(yīng)用監(jiān)測

setVmPolicy對虛擬機應(yīng)用監(jiān)測

detectActivityLeaks() 用戶檢查 Activity 的內(nèi)存泄露情況
detectLeakedClosableObjects()用于資源沒有正確關(guān)閉時提醒
detectLeakedSqlLiteObjects() 和detectLeakedClosableObjects()的用法類似,用來檢查SQLite對象是否被正確關(guān)閉
detectLeakedRegistrationObjects() 用來檢查 BroadcastReceiver 或者ServiceConnection 注冊類對象是否被正確釋放
setClassInstanceLimit()設(shè)置某個類的同時處于內(nèi)存中的實例上限郭计,可以協(xié)助檢查內(nèi)存泄露
detectAll()表示應(yīng)用所有監(jiān)測

4霸琴、警告查看方式

penaltyDialog()彈出違規(guī)提示對話框.
penaltyLog() 在Logcat 中打印違規(guī)異常信息

5、其他

在手機的調(diào)試模式中也可以開啟嚴(yán)格模式

6昭伸、注意事項

只在開發(fā)階段啟用StrictMode梧乘,發(fā)布應(yīng)用或者release版本一定要禁用它。
嚴(yán)格模式無法監(jiān)控JNI中的磁盤IO和網(wǎng)絡(luò)請求庐杨。
應(yīng)用中并非需要解決全部的違例情況选调,比如有些IO操作必須在主線程中進(jìn)行。

本文參考http://www.cnblogs.com/yaowen/p/6024690.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灵份,一起剝皮案震驚了整個濱河市仁堪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌填渠,老刑警劉巖弦聂,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揭蜒,居然都是意外死亡横浑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門屉更,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徙融,“玉大人,你說我怎么就攤上這事瑰谜∑奂剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵萨脑,是天一觀的道長隐轩。 經(jīng)常有香客問我,道長渤早,這世上最難降的妖魔是什么职车? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上悴灵,老公的妹妹穿的比我還像新娘扛芽。我一直安慰自己,他們只是感情好积瞒,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布川尖。 她就那樣靜靜地躺著,像睡著了一般茫孔。 火紅的嫁衣襯著肌膚如雪叮喳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天缰贝,我揣著相機與錄音馍悟,去河邊找鬼。 笑死揩瞪,一個胖子當(dāng)著我的面吹牛赋朦,可吹牛的內(nèi)容都是我干的篓冲。 我是一名探鬼主播李破,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壹将!你這毒婦竟也來了嗤攻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤诽俯,失蹤者是張志新(化名)和其女友劉穎妇菱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暴区,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闯团,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仙粱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房交。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伐割,靈堂內(nèi)的尸體忽然破棺而出候味,到底是詐尸還是另有隱情,我是刑警寧澤隔心,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布白群,位于F島的核電站,受9級特大地震影響硬霍,放射性物質(zhì)發(fā)生泄漏帜慢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粱玲。 院中可真熱鬧侍咱,春花似錦、人聲如沸密幔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胯甩。三九已至昧廷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偎箫,已是汗流浹背木柬。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淹办,地道東北人眉枕。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像怜森,于是被迫代替她去往敵國和親速挑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 只要我們是人副硅,我們一定會犯錯誤姥宝。 如果有勇氣承認(rèn)錯誤,總是可以原諒的:李小龍 那么恐疲,你如何知道和糾正在Androi...
    FynnJason閱讀 2,761評論 0 11
  • Android 2.3提供一個稱為嚴(yán)苛模式(StrictMode)的調(diào)試特性腊满,Google稱該特性已經(jīng)使數(shù)百個An...
    Jinwong閱讀 3,974評論 0 2
  • StrictMode 嚴(yán)格模式 開發(fā)者經(jīng)常會無意地犯些錯誤:在主線程讀寫磁盤、訪問網(wǎng)絡(luò)培己,嚴(yán)格模式能夠把幫助開發(fā)者監(jiān)...
    璟龍閱讀 2,807評論 1 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,771評論 25 707
  • 今天晚上我和熙熙姐姐全家去惠中酒店吃自助撈面碳蛋,這里的撈面那叫一個字“香”。我們點了兩個涼菜省咨,還要了一扎鮮榨哈...
    楊尚峰閱讀 677評論 0 0