〔読書ノート〕『Android開発芸術探索』第15章ノート

3743 ワード

Androidパフォーマンスの最適化
AndroidはメモリとCPUリソースを無制限に使用することはできません.メモリの使用が多すぎると、メモリがオーバーフローします.つまりOOMです.CPUリソースを使いすぎると、多くの時間のかかるタスクを行い、携帯電話がカートンになり、プログラムが応答できない場合、ANRになることもあります.
15.1.1レイアウトの最適化
1、レイアウトの最適化方法
  • まず、レイアウト内の不要なコントロールと階層
  • を削除する.
  • には、次に、使用性能の低いView Groupが選択されています.
  • レイアウト最適化の別の手段は、ラベル、ラベル、ViewStubを採用することである.ラベルは主にレイアウトの再利用に使用され、ラベルは一般的に使用され、レイアウトのレベルを減らすことができますが、ViewStubはオンデマンドでロードする機能を提供し、必要に応じてViewStubのレイアウトをメモリにロードし、プログラムの初期化効率を向上させます.

  • 2、ラベルはandroid:layout_のみをサポートする先頭のプロパティ、android:idプロパティ例外.
    3、ViewStubはViewを継承し、非常に軽量で、幅/高さが0なので、レイアウトや描画プロセスには関与しません.ViewStubの意味は、必要なレイアウトファイルをオンデマンドでロードすることであり、実際の開発では、ネットワーク異常時のインタフェースなど、通常の状況では表示されないレイアウトファイルが多い.この場合、インタフェース全体を初期化する際にロードする必要はなく、ViewStubによって使用時に再ロードすることができ、プログラム初期化の性能を向上させることができる.
    以下に示すように、android:idはViewStubのidであり、android:inflatedIdはレイアウトのルート要素のidである.
    <ViewStub android:id="@+id/xxx"
      android:inflatedId="@+id/yyy"
      android:layout="@layout/zzz"
      ...
    </ViewStub>

    ViewStubのレイアウトをロードする必要がある場合は、次の2つの方法で行うことができます.
    ((ViewStub)findViewById(R.id.xx)).setVisibility(View.VISIBLE);

    または
    View importPanel = ((ViewStub)findViewById(R.id.stub_import)).inflate();

    15.1.1描画の最適化
    描画最適化とは、ViewのonDrawメソッドが多くの操作を回避することを意味します.
  • onDrawで新しいローカルオブジェクトを作成しないでください.これはonDrawメソッドが頻繁に呼び出される可能性があるためです.これにより、一瞬にして大量の一時オブジェクトが生成され、メモリが多すぎるだけでなく、システムのgcがより頻繁になり、プログラムの実行効率が低下します.
  • onDrawメソッドでは、時間のかかるタスクを指定しないで、何千回ものループ操作を実行することはできません.Viewの描画フレームレートは60 fpsが最適です.これは、フレームごとの描画時間が16 msを超えないことを要求します.プログラムでは16 msという時間を保証するのは難しいですが、onDrawメソッドの複雑さをできるだけ低減することは常に確実に有効です.

  • 15.1.3メモリリークの最適化
    静的変数、単一モード、アトリビュートアニメーション、AsyncTask、Handlerなど、メモリ漏洩の原因となるシーンが多い
    15.1.4応答速度の最適化とANRログ分析
  • ANRが発生した場合:Activityは5秒以内に画面タッチイベントまたはキーボード入力イベントに応答しなければANRになります.BroadcastReceiverは10 sで操作が完了しない場合もANRが表示されます.
  • プロセスにANRが発生すると、/data/anrディレクトリの下にファイルtracesが作成されます.txtは、このファイルを分析することでANRの原因を特定できます.

  • 15.1.5 ListViewとBitmapの最適化
  • ListView最適化:ViewHolderを使用し、getViewメソッドでの時間のかかる操作を回避します.リストのスライド状態に基づいてタスクの実行効率を描画します.ハードウェアアクセラレーション期間をオンにしてListViewのスライドをスムーズにすることができます.
  • Bitmap最適化:必要に応じて画像をサンプリングし、主にBitmapFactoryを通過する.Optionsは必要に応じて画像をサンプリングし、サンプリングは主にBitmapFactoryを用いる.OptionsのinSampleSizeパラメータ.

  • 15.1.6スレッド最適化
  • はスレッドプールを採用し、プログラムに大量のThreadが存在しないようにする.スレッドプールは内部のスレッドを再利用することができ、スレッドの作成と破棄によるパフォーマンスオーバーヘッドを回避します.また、スレッドプールはスレッドプールの最大同時数を効果的に制御し、大量のスレッドがシステムリソースを奪い合い、ブロック現象の発生を回避します.

  • 15.1.7パフォーマンス最適化の推奨事項
  • オブジェクトの作成を避ける
  • あまり列挙を使用しないでください.列挙によって消費されるメモリ空間は整形より
  • 大きいです.
  • 定数
  • をstatic finalで修飾してください
  • は、SparseArrayやPairなどのAndroid固有のデータ構造を使用しており、
  • のパフォーマンスが向上しています.
  • ソフトリファレンスおよび弱リファレンス
  • を適宜使用する.
  • メモリキャッシュとディスクキャッシュ
  • を採用
  • は、静的な内部クラスをできるだけ採用することで、内部クラスによるメモリ漏洩の潜在的な回避を可能にすることができる
  • .
    15.2メモリ漏洩分析のMATツール
    MATは強力なメモリ分析ツールで、主にHistogramsやDominator Treeなどの機能があります.
    15.3プログラムの保守性の向上
  • 命名は規範的で、変数や方法の意味を正確に伝えるには、略語を少なくし、変数に関する接頭辞はAndroidソースコードの命名方式を参照することができます.例えば、プライベートメンバーはmで始まり、静的メンバーはsで始まり、定数はすべて大文字で表されます.
  • コードのレイアウトには、異なるコードブロックを区別するために合理的な空白を残す必要があります.このうち、同類変数の宣言は一緒に配置し、2種類の変数の間に1行の空白を残して区別します.
  • の合理的なネーミングスタイルは、非常に重要なコードにのみコメントを追加します.