【Android Studio/Kotlin】StrictModeの使い方とセットアップ方法

【Android Studio/Kotlin】StrictModeの使い方とセットアップ方法

この記事からわかること

  • Android Studio/KotlinStrictMode使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

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()
)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

Search Box

Sponsor

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index