天天看點

Android嚴苛模式StrictMode使用詳解

嚴苛模式主要檢測兩大問題,一個是線程政策,即TreadPolicy,另一個是VM政策,即VmPolicy。

線程政策檢測的内容有

自定義的耗時調用 使用detectCustomSlowCalls()開啟

磁盤讀取操作 使用detectDiskReads()開啟

磁盤寫入操作 使用detectDiskWrites()開啟

網絡操作 使用detectNetwork()開啟

Activity洩露 使用detectActivityLeaks()開啟

未關閉的Closable對象洩露 使用detectLeakedClosableObjects()開啟

洩露的Sqlite對象 使用detectLeakedSqlLiteObjects()開啟

檢測執行個體數量 使用setClassInstanceLimit()開啟

       其實StrictMode實作原理也比較簡單,以IO操作為例,主要是通過在open,read,write,close時進行監控。libcore.io.BlockGuardOs檔案就是監控的地方。以open為例,如下進行監控。

<a></a>

       嚴格模式的開啟可以放在Application或者Activity以及其他元件的onCreate方法。為了更好地分析應用中的問題,建議放在Application的onCreate方法中。 

       其中,我們隻需要在app的開發版本下使用 StrictMode,線上版本避免使用 StrictMode,這裡定義了一個布爾值變量DEV_MODE來進行控制。

       其中Android3.0引入的方法包括detectCustomSlowCalls()和noteSlowCode(),它們都是用來檢測應用中執行緩慢代碼的或者潛在的緩慢代碼。

       嚴格模式有很多種報告違例的形式,但是想要分析具體違例情況,還是需要檢視日志,終端下過濾StrictMode就能得到違例的具體stacktrace資訊。

Android嚴苛模式StrictMode使用詳解

當然也可以選擇彈窗形式來簡明提醒開發者

Android嚴苛模式StrictMode使用詳解

StrictMode.ThreadPolicy.Builder 主要方法如下

運作後,觸發的警告如下

Android嚴苛模式StrictMode使用詳解

運作後,觸發的警告如下 

Android嚴苛模式StrictMode使用詳解

       StrictMode從 API 11開始允許開發者自定義一些耗時調用違例,這種自定義适用于自定義的任務執行類中,比如我們有一個進行任務處理的類,為TaskExecutor。

       先需要跟蹤每個任務的耗時情況,如果大于500毫秒需要提示給開發者,noteSlowCall就可以實作這個功能,如下修改代碼

執行一個耗時2000毫秒的任務

       得到的違例日志,注意其中~duration=20 ms并非耗時任務的執行時間,而我們的自定義資訊msg=slowCall cost=2000才包含了真正的耗時。

StrictMode.VmPolicy.Builder 主要方法如下

我們反複旋轉螢幕就會輸出提示資訊(重點在 instances=2; limit=1 這一行) 

Android嚴苛模式StrictMode使用詳解

       這時因為,我們在Activity中建立了一個Thread匿名内部類,而匿名内部類隐式持有外部類的引用。而每次旋轉螢幕是,Android會新建立一個Activity,而原來的Activity執行個體又被我們啟動的匿名内部類線程持有,是以不會釋放,從日志上看,當先系統中該Activty有4個執行個體,而限制是隻能建立1各執行個體。我們不斷翻轉螢幕,instances 的個數還會持續增加。

運作後觸發警告如下 

Android嚴苛模式StrictMode使用詳解

運作後觸發警告如下

Android嚴苛模式StrictMode使用詳解

       除了通過日志檢視之外,我們也可以在開發者選項中開啟嚴格模式,開啟之後,如果主線程中有執行時間長的操作,螢幕則會閃爍,這是一個更加直接的方法。 

Android嚴苛模式StrictMode使用詳解

隻在開發階段啟用StrictMode,釋出應用或者release版本一定要禁用它。

嚴格模式無法監控JNI中的磁盤IO和網絡請求。

應用中并非需要解決全部的違例情況,比如有些IO操作必須在主線程中進行。

本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/p/6024690.html,如需轉載請自行聯系原作者

繼續閱讀