Android:StrictMode紹介

3881 ワード

StrictModeにはさまざまなポリシーがあり、各ポリシーには異なるルールがあり、開発者がルールに違反した場合、各ポリシーにはユーザーに注意を促す方法があります.ここでは、AndroidでStrictModeを使用する方法を例に挙げて説明する.
StrictModeのポリシーとルール
現在、一般的なモニタリングに関するポリシーと、VM仮想マシンに関するポリシーの2つのポリシーが使用可能です.よく使用されるモニタリングに関するポリシーは、次のとおりです.
  • Disk Readsディスク読み出し
  • Disk Writesディスク書き込み
  • Network accessネットワークアクセス
  • Custom Slow Codeカスタムの実行速度の遅いコード分析
  • 前の3つの意味は、ディスクの読み取りと書き込み、ネットワークアクセスをそれぞれ監視する名前のように、読者がよく知っているはずです.4つ目のカスタムスローコード解析は,呼び出しクラスにアクセスした場合にのみトリガーされ,この方法で実行が遅いコードを監視することができる.プライマリ・スレッドで呼び出されると、これらの検証ルールはコードをチェックするのに役立ちます.たとえば、アプリケーションが大量のデータをダウンロードしたり解析したりするときに、カスタム実行速度の遅いコードのクエリー分析をトリガーすることができます.StrictModeは、アプリケーションのプライマリ・スレッドで発生する時間のかかるディスク、ネットワーク・アクセス、または関数呼び出しをキャプチャするために使用できます.これにより、プライマリ・スレッド処理UIおよびアニメーションがディスクの読み書きおよびネットワーク操作時によりスムーズになり、プライマリ・スレッドがブロックされないようにプログラムを改善することができます.
    VMに関する戦略は、次のようなものに重点を置いています.
  • メモリ漏洩Activityオブジェクト
  • メモリリークSQLiteオブジェクト
  • メモリ漏洩の解放対象
  • ここで、メモリ漏洩のActivityオブジェクトとメモリ漏洩のSQLiteオブジェクトは理解しやすいが、閉じたオブジェクトのチェックとは、close()メソッドを呼び出すべきオブジェクトなど、解放されたオブジェクトを主に監視することである.
    開発者がルールに違反した場合、各ポリシーには、開発者に当時の状況を知らせる方法があります.関連する違反は、LogCatに記録するか、DropBox(android.os.DropBox)サービスに格納することができる.また、通常のモニタリングクラスのポリシーでは、違反が発生した場合に関連するダイアログボックスと当時のコンテキスト環境が表示されます.これらは、開発者がプログラムの欠陥をできるだけ早く理解し、プログラムの品質を提出するために使用されます.
    StrictModeの使用方法
  • StrictModeを有効にします.設定=>開発者オプション=>モニタを開き、厳格モード
  • を有効にします.
  • 共通監視例:
  • StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                        .detectAll()
                        .penaltyLog()
                        .penaltyDialog()
                        .build());
  • VMモニタをオンにする例:
  • StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                        .detectAll()
                        .penaltyLog()
                        .build());

    もちろん、上記のコードは、本番バージョンでstrictmodeを有効にする必要はありません.したがって、最適なコード実践は、次のようにする必要があります.
    private static boolean isStrictMode = true;
    
    public void onCreate(){
        if(isStrictMode && BuildConfig.DEBUG && Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO){
    
            //    ,      
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                        .detectAll()
                        .penaltyLog()
                        .penaltyDialog()
                        .build());
    
                //VM  
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                        .detectAll()
                        .penaltyLog()
                        .build());
        }
        
        super.onCreate();
    }
    

    StrictModeの実行
    アプリケーションがstrictmodeモードを有効にしている場合、実際には通常のアプリケーションと変わらず、テストと実行時に通常のアプリケーションと同じように実行すればよい.Strictmodeモードが有効になっている場合、すべてのプログラムの実行状況が監視され、重大な問題が発生したり、ポリシー・ルールに違反したりした場合、ユーザーにプロンプトが表示されます.次にstrictmodeモードが有効なアプリケーションを実行すると、ルールに違反していることが判明した場合、ユーザーに表示される情報を、通常のエラー情報と何が違うのかよく観察しましょう.
    StrictModeの出力と、ダイアログボックスがポップアップされるヒントがlogcatから表示されます.
    いくつかの規則を無視
    ほとんどのStrictModeによって生成されたルールの警告は守らなければならないと言うべきですが、発生したすべての情報があなたのプログラムに間違いがあることを示しているわけではありません.たとえば、アプリケーションのプライマリ・スレッドでディスクをすばやく読み書きすることは、アプリケーションのパフォーマンスに大きな影響を与えません.また、デバッグ・フェーズでデバッグしたコードが設定されたルールに違反している場合もあります.これらのルールは無視できます.
    ルールを無視するには2つの方法があります.1つは、単純にコードの中でStrictmodeのコードを注釈することです.もう1つは、無視する必要があるときと場所に、対応するコードを増やしてシステムにこれらのルールを使用して検査を停止させ、開発者が検査が必要だと思っているときに、これらのルールを再適用することです.例えば、
    StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
    
      StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
    
      .permitDiskWrites()
    
      .build());
    
      doCorrectStuffThatWritesToDisk();
    
      StrictMode.setThreadPolicy(old);

    小結
    StrictModeは、Androidアプリケーションのパフォーマンスと問題点を確認するのに便利なクラスです.このモードをオンにすると、開発者はアプリケーションに存在する潜在的な問題をよくチェックすることができます.詳細はAndroidドキュメントのAPIの説明を参照してください.参照先:
  • StrictMode | Android Developers
  • android:StrictModeの紹介は主にこの文書
  • を参照する.
  • Android Best Practices: StrictMode