Android的效能監控工具StrictMode

berber78發表於2015-05-12

目前,StrictMode的能力與限制包括:
1.基於執行緒的對磁碟讀寫,網路操作,以及自定義耗時操作等的監控;
2.基於VM程式的對物件洩露(Activity物件,SQLite物件,未反註冊物件,未關閉物件)的監控;
3.可以檢測到跨程式的耗時操作(當然必須是同步操作);
4.當前不支援在jni中發生的網路與磁碟操作。
隨著Android的進化,StrictMode的功能也將越來越強大。當StrictMode檢測到指定的事件發生時,它以指定的方式通知你:崩潰,彈出對話方塊,閃屏,logcat,dropbox。

==========================
StrictMode是Gingerbread的一個新API,用來設定對一個thread的策略,你可以設定不允許在這個thread上執行的某些操作,並且設定對應的懲罰措施,如果出現不允許的操作的話。通過優雅的設計,這些策略可以通過一些整數很容易的指定。

目前有2種策略可用,第一個和執行緒相關,它主要針對主執行緒(或UI執行緒)。由於在主執行緒中讀寫磁碟和進行網路訪問都不是好的做法,Google已經在磁碟和網路程式碼中新增了嚴苛模式(StrictMode)鉤子(hook)。如果你對某個執行緒開啟嚴苛模式(StrictMode),當那個執行緒進行磁碟和網路訪問,你將獲得警告。你可以選擇警告方式。一些違例包含耗時函式,磁碟讀寫,網路訪問。你能選擇將警告寫入LogCat,顯示一個對話方塊,閃下螢幕,寫入DropBox日誌檔案,或讓應用崩潰。最通常的做法是寫入LogCat或讓應用崩潰。

penaltyLog()表示將警告輸出到LogCat,你也可以使用其他或增加新的懲罰(penalty)函式,例如使用penaltyDeath()的話,一旦StrictMode訊息被寫到LogCat後應用就會崩潰。

類似於執行緒策略(ThreadPolicy) StrictMode 有虛擬機器策略(VmPolicy)。虛擬機器策略(VmPolicy)能檢查記憶體洩漏,譬如,當關閉一個SQLite物件前的完結操作,或其他任何類似可關閉物件在關閉前的完結操作。虛擬機器策略(VmPolicy)由一個類似的Builder類建立,如列表2-10所示。和執行緒策略(ThreadPolicy)不同的是,虛擬機器策略(VmPolicy)不能通過一個對話方塊提供警告。

若需避免對某些違規的檢測,譬如,你需要在正在監視的執行緒中進行磁碟讀取。此時,你要麼不去呼叫detectDiskReads(),要麼在呼叫detectAll()之後跟一個permitDiskReads()。

執行緒策略監控的方面:
Disk Reads 磁碟讀
Disk Writes 磁碟寫
Network access 網路訪問
Custom Slow Code 自定義的執行速度慢的程式碼分析

VM 策略監控的方面:
記憶體洩露的Activity物件
記憶體洩露的SQLite物件
記憶體洩露的釋放的物件

相關文章