StrictMode とは
StrictMode は Android Gingerbread から追加されたユーティリティで、以下のような望ましくない処理を検出して、ログなどに出力させることができるようになっています。
- メインスレッドからのディスクアクセス
- メインスレッドからのネットワークアクセス
- SQLite 関連オブジェクトの close 忘れ
ただし、JNI 実装内でのディスクアクセスやネットワークアクセスなどは検出されない可能性があるので過信は禁物です。
StrictMode によって何を検出したいかの設定(detect*
設定)や、検出した場合にどこに出力するかの設定(penalty*
設定)を以下のようにコード内で行います。
// すべてを検出し、見つかったものをログに出力する場合
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build();
StrictMode.setThreadPolicy(policy);
ここではスレッドに関連するポリシーである StrictMode.ThreadPolicy
の設定を行っていますが、VM に対する StrictMode.VmPolicy
の設定も同様に行うことができます。
参考リンク
- StrictMode | Android Developers
- StrictMode.ThreadPolicy | Android Developers
- StrictMode.VmPolicy | Android Developers
- Android Developers Blog: New Gingerbread API: StrictMode
- Y.A.M の 雑記帳: Android Android 2.3 - StrictMode
- StrictModeでパフォーマンスをチューニングする - Android(アンドロイド)情報-ブリリアントサービス
StrictMode で検出されたバイオレーションログを検索する
Logcat ログを StrictMode タグで絞り込んで、さらにパッケージ名で絞り込むと、StrictMode によって検出された問題個所を素早く見つけることができます。
$ logcat -s StrictMode:* | grep -e 'violation' -e 'com.yourcompany' &