【Android Studio/Kotlin】StrictModeの使い方とセットアップ方法
この記事からわかること
- Android Studio/KotlinのStrictModeの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
- Android OS:15以降
StrictModeとは?
「StrictMode」とは推奨されない挙動を検知するためのデバッグツールです。推奨されない挙動とはメインスレッドでの重い処理や、メモリ・リソースの不適切な使い方などアプリのパフォーマンスやクラッシュに繋がるような処理のことを指しています。
StrictModeを使用することでこれらの挙動を事前に検知することが可能になり、警告や意図的なクラッシュで開発者に知らせるような仕組みを構築することが可能です。
使い方
StrictModeはコードで仕込む必要があります。基本的に仕込む場所はApplicationクラスのonCreateなどアプリ全体のエントリーポイントになる箇所が推奨されています。
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
// スレッドポリシー
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.penaltyDeath()
.build()
)
// VMポリシー
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.detectActivityLeaks()
.penaltyLog()
.build()
)
}
}
}
また基本的にデバッグ環境でしか使用しないのでBuildConfig.DEBUGのみで動作するようにしておきます。
スレッドポリシー
スレッドに纏わる違反を検知するためにはsetThreadPolicyを使用します。メインスレッドでのディスクの読み出しや書き込み、ネットワークアクセスなどを検知し、警告出力(penaltyLog)またはクラッシュ(penaltyDeath)をさせることが可能になっています。
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
// メインスレッド(UIスレッド)でのディスク読み込みを検出
// → SQLiteクエリやファイル読み込みなど
.detectDiskReads()
// メインスレッドでのディスク書き込みを検出
// → ファイル保存、SharedPreferences書き込みなど
.detectDiskWrites()
// メインスレッドでのネットワークアクセスを検出
// → HttpURLConnection, OkHttpの同期通信など
.detectNetwork()
// 違反検出時にLogcatへ出力(警告ログ)
.penaltyLog()
// 違反検出時にアプリを即クラッシュさせる
// → 見逃し防止(デバッグ時のみ推奨)
.penaltyDeath()
// ポリシーをビルドして適用
.build()
)
ViewModelポリシー
ViewModelに纏わる違反を検知するためにはsetVmPolicyを使用します。メモリリーク、リソースの未クローズなどを検知し、警告出力(penaltyLog)またはクラッシュ(penaltyDeath)をさせることが可能になっています。
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
// SQLite オブジェクト(Cursorなど)のclose忘れを検出
.detectLeakedSqlLiteObjects()
// Closeable(InputStream, OutputStreamなど)のclose忘れを検出
.detectLeakedClosableObjects()
// Activity のメモリリークを検出
// → 破棄されるべきActivityがGCされない場合に警告
.detectActivityLeaks()
// 違反検出時にLogcatへ出力
.penaltyLog()
// ポリシーをビルドして適用
.build()
)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






