BlockCannery-強力なAndroidプログラムデバッグツールで、簡単にカートンを見つけることができます.


まだプロジェクトのメモリ漏洩に悩んでいますか?まだカートン現象のために原因が見つからないのですか?今日は強力なデバッグツールを紹介します.*BlockCannery*です.これを学んだら、あなたは多くの収穫を得ることができると信じています.
BlockCannery-Android Appインタフェースカートンの元凶を簡単に見つける
BlockCanaryはAndroidプラットフォームの1つで、アプリケーションは抽象クラスを実現するだけで、このコンポーネントに必要なコンテキスト環境を提供し、普段アプリケーションを使用するときにメインスレッド上の各種カードの遅い問題を検出し、コンポーネントが提供した各種情報を通じて原因を分析し、修復することができる.
BlockCanaryにはいくつかの異なるバージョンがあり、以下のように改善されています.
  • 1.5.0 デバッグモードで監視を停止できるコンテキストを追加します.
  • 1.4.1エラーの修正
  • 1.4.0エラー修正、コンテキストにonBlockブロッキングを追加します.
  • 1.3.1 ラベルとアイコンの構成を有効にします.
  • 1.3.0 ホワイトリストと注目パッケージ機能を追加します.

  • まず効果図を見てみましょう.
    コードはDemoFragmentを指しています.JAvaの109行目
    使用方法:
  • 最初のステップ:
  • ここにいるよxmlでの構成:
    //compile 'com.github.markzhai:blockcanary-android:1.5.0'
    debugCompile'com.github.markzhai:blockcanary-android:1.5.0'
    releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0'
  • 第2ステップ:
  • 独自のアプリケーションを実現し、onCreate()メソッドに追加します.
      BlockCanary.install(this, new AppBlockCanaryContext()).start();
  • 第3ステップ
  • 監視アプリケーションのラベルとアイコンはxhdpi drawableディレクトリとstringsで使用できます.xmlに描画可能なブロックカナリア図を配置して構成します.
    /**
     *        ,       ,   uid,    ,      ,Log      
     */
    
    public class AppBlockCanaryContext  extends BlockCanaryContext {
    
        /**
         * Implement in your project.
         *
         * @return Qualifier which can specify this installation, like version + flavor.
         */
        public String provideQualifier() {
            return "unknown";
        }
    
        /**
         * Implement in your project.
         *
         * @return user id
         */
        public String provideUid() {
            return "uid";
        }
      ......
    }

    ステップ4でdemoを実行すればいい
    ここでは、関連する例を書きました.
    *使用例demo接続:*https://github.com/androidstarjack/MyBlockCanaryTest
    関連紹介
  • *非侵入式*で、簡単な2行で監視を開き、あちこちで打つ必要がなく、コードの優雅性を破壊します.
  • *精確*で、出力された情報は問題点(行まで精確)を特定するのに役立ち、Logcatのようにゆっくり探す必要はありません.現在、コアモニタ出力ファイルとUI表示カートン情報機能が含まれています.Android端子のみサポートされています.

  • もし私たちがMessage/Looper/Handlerシリーズの靴をよく知っていたら、Looper.JAvaでは、
    public static void prepareMainLooper() {
        prepare(false);
        synchronized (Looper.class) {
            if (sMainLooper != null) {
                throw new IllegalStateException("The main Looper has already been prepared.");
            }
            sMainLooper = myLooper();
        }
    }
    
    /** Returns the application's main looper, which lives in the main thread of the application.
     */
    public static Looper getMainLooper() {
        synchronized (Looper.class) {
            return sMainLooper;
        }
    }

    すなわち、アプリケーション全体のプライマリ・スレッドは、このlooperのみで、handlerがいくらあっても最後にここに戻ります.
    cpuBusy判断:
    ここまで来て皆さんはよく知っていますか.原理は参考の簡書の作者がhttp://www.jianshu.com/p/cd7fc77405ac.ここで深く感謝します.
    BlockCanaryパラメータの解読
  • cpuCore:携帯電話のcpu個数.
  • processName:パッケージ名を適用します.
  • freeMemory:携帯電話のメモリ残量、単位KB.
  • totalMemory:携帯電話内訓総和、単位KB.
  • timecost:このMessage(イベント)実行時間、単位ms.
  • threadtimecost:このMessage(イベント)実行スレッド時間(スレッドの実際の実行時間、他のスレッドがcpu時間を占有することを含まない)、単位ms.
  • cpubusy:trueはcpu負荷が重すぎることを示し、falseはcpu負荷が重くないことを示す.cpu負荷が重すぎるとMessage(イベント)がタイムアウトし、エラーは本イベント処理にありません.

  • BlockCanaryカートン検出プロセス
    BlockCanaryは、UIスレッドの現在のスタック情報を保存するスレッドを開始し、スタック情報およびCPU情報をmThreadStackEntriesおよびmCpuInfoEntriesにそれぞれ保存し、各情報を時間撮影してkeyとして保存します.
    BlockCanaryは、イベントの開始終了時間を取得するためにloggingを登録しています.イベント処理時間が閾値(デフォルト値1 s)を超えることが検出されると、mThreadStackEntriesからT 1~T 2の間のスタック情報が検索され、mCpuInfoEntriesからT 1~T 2の間のCPUおよびメモリ情報が検索される.情報をフォーマットしてローカルファイルに保存し、ユーザーに通知します.
    動作原理フローチャート:
    現在、アリ内の複数のAndroidプロジェクトにアクセスし、BlockCanaryを使用してAndroidアプリケーションのパフォーマンスを最適化していることが知られています.
    BlockCanneryは使いやすいし、LeakCanaryを使ってメモリの漏れや解決策を検出することもできます.
    また、Androidメモリの漏洩やオーバーフローに慣れていない子供靴については、*Android性能最適化(1)--メモリのオーバーフローとメモリの漏洩の紹介*
    ブログアドレス:
    http://blog.csdn.net/androidstarjack/article/details/70197985
    もしあなたがこの文があなたに役に立つと思ったら、QQ交流群に入ることを歓迎します:232203809微信公衆番号:端末研究開発部