目次
導入:
まず、Android のパフォーマンス最適化について簡単に分類して整理します。パフォーマンスに影響を与える多くの要因により、たとえば、この記事で分類されているアプリ、メモリ、ネットワーク、フリーズはすべて相互に影響します。Caton は、ユーザーにとって最も直感的で目に見えるパフォーマンスの問題である必要があります。
APP の最適化は、起動、UI 描画、リソースの最適化の 3 つの側面に焦点を当てます。
メモリの最適化では、メモリ ジッター、メモリ リーク、メモリ拡張の考慮事項に焦点を当てます。
ネットワークリクエストとデータ圧縮の側面からネットワークの最適化を検討
上記の 3 つの側面を最適化することは、システム フリーズの問題の解決に役立ちます。先ほどのフリーズはユーザーが直感的に認識するものですが、表示の観点から見ると、フリーズの問題はコマ落ちによって引き起こされます。この記事では、当面は表示リフレッシュの原理について詳しく説明しません。
アプリの最適化:
UI の最適化 (レイアウトの最適化、描画の最適化)
レイアウトの最適化: RelativeLayout が、デフォルトのルート レイアウトとして LinearLayout を置き換えます。ネストされたレイアウトを減らし、レンダリング効率を向上させます。
<include> タグ
<ViewStub> タグは、一般的ではないレイアウトを読み込み、読み込みを遅延し
ます。 <merge> タグは、レイアウトのネスト レベルを減らします。
インストール パッケージの最適化 (解像度リソース ファイルの最適化)
ボリュームを削減します。
解像度リソースの最適化
コード 最適化:
ライブラリ リソースの最適化:
アセット リソースの最適化
コード難読化圧縮、最適化、難読化、 その他の 機能
を含む proGuard コード難読化ツールを使用します。
コールド スタート、ホット スタート、時間のかかるスレッドはサブスレッドを使用して実行します
起動ロジック、読み込みロジック、
必須でないオブジェクトは遅延初期化可能、
グローバル静的オブジェクトは作成せず、シングルトン モードに切り替えて、アプリケーション プロセスを初回のみ初期化する必要があるようにする、
依存関係注入フレームワークを検討する
ネットワークの最適化:
ネットワーク リクエストのマージ、ネットワーク リクエストの削減、
DNS 分析の回避、
大量のデータの読み込み、ページングされた
ネットワーク データの使用、GZIP 圧縮を使用し
たネットワーク データ キャッシュの追加、画像アップロードのためのネットワークへの頻繁なリクエストの回避、
必要に応じて画像の圧縮
メモリの最適化:
メモリ リークを避ける: 存続期間の長いオブジェクトは、存続期間の短いオブジェクトを指します。ヒープに割り当てられたオブジェクトは使用されなくなりましたが、GC コレクターはそれらを再利用できません。
静的変数の問題: 内部クラスを静的内部クラスとして設定するか、context.applicationContext() をシングルトン モードとして独立して使用します
: context.getApplicationconText() プロパティにパラメーターを渡します。アニメーション
: Activity.onDestroy は、Animation.cancel() を呼び出します。
ハンドラー: static を使用します。内部クラス +WeakReference 弱参照; 内部クラスがライフ サイクルを終了するときにメッセージ キューをクリアする スレッドの
問題: AsyncTask と Runnable を静的内部クラスとして設定するか、それらを分離し、スレッド内で弱参照を使用して保存します コンテキスト参照
リソースが閉じられていません:アクティビティが破棄されたときに閉じられた場合でも、またはログアウトします:
BroadcastReceiver は unregisterReceiver() を呼び出します
。 カーソル、ストリーム、ファイル: close
アダプターを呼び出します
。 問題: キャッシュを使用せずにアイテムを毎回再インスタンス化し、getView() のみに依存します。 GCの圧迫ConvertViewを使用する アダプタ:webView
構築時の :マップなどに静的参照があり、削除操作が行われない
メモリの拡張: マニフェスト ファイルのアプリケーションにlargeHeap="true" 属性を追加します。同じアプリケーションが複数のプロセスの実行を開始し、アプリケーションの合計メモリ容量を増やすことができます。
Caton の最適化:
メイン スレッドでネットワーク アクセスや大きなファイル IO 操作を実行しないでください。
レイアウトを最適化し
、描画を最適化します
。onDraw で不必要な再描画や過剰描画を回避します。 新しいローカル オブジェクトを作成しないでください。
onDraw メソッドでは時間のかかる操作を行わないでください。