序文
Android 開発者にとって、基本的なアプリケーション開発スキルを習得するだけでは十分ではありません。仕事中でも面接中でも、アプリケーション エクスペリエンスを向上させるには、パフォーマンスの最適化に関する確かな知識を持つことが重要です。Android のパフォーマンスの最適化では、主に起動の最適化、レンダリングの最適化、メモリの最適化、ネットワークの最適化、フリーズの検出と最適化、消費電力の最適化、インストール パッケージ サイズの最適化、セキュリティの問題が取り上げられます。以下は、インターネット上の多くの有力者による経験共有に基づいた Android パフォーマンスの最適化の概要です。
Android のパフォーマンスを最適化するためのソリューションは数多くありますが、開発プロセスでは主に次の最適化が考慮されます。
- レイアウトの最適化
- 描画の最適化
- メモリリークの最適化
- 応答速度の最適化
- リストビューの最適化
- ビットマップの最適化
- スレッドの最適化
次に、これらの観点からの最適化スキームを簡単に紹介します。
レイアウトの最適化
Android には Linerlayout や RelativeLayout などのレイアウトがたくさんあることは皆さんご存知かと思いますが、レイアウトの最適化とはレイアウト ファイルのレベルを下げることであり、レベルを下げるとプログラムの描画が大幅に速くなり、パフォーマンスが向上します。
レイアウト コードでは、どのレイアウトを使用するかは基本的に次の規則に従います。
- LinearLayout と RelativeLayout の両方をレイアウトで使用できる場合は、RelativeLayout の機能がより複雑で、レイアウト プロセスにより多くの CPU 時間を必要とするため、LinearLayout が使用されます。
- レイアウトをネストした方法で行う必要がある場合。この場合、RelativeLayout を使用することをお勧めします。ViewGroup のネストはレイアウト レベルを上げることと同等であり、プログラムのパフォーマンスも低下するためです。
3. or タグと ViewStub を使用して、レイアウトの共通部分のレイアウトを抽出します。これにより、レイアウトの初期化の効率が向上します。
描画の最適化
描画の最適化では、ビューの onDraw メソッドで多くの操作を実行しません。
まず、onDraw メソッドで新しいオブジェクトを作成しないでください。onDraw メソッドが頻繁に呼び出される可能性があり、大量の一時ファイルが生成され、過剰なメモリ使用量が発生し、プログラムの実行効率が低下します。
2 番目に、時間のかかる操作はできるだけ行わないでください。ループが多数発生すると CPU 時間も消費されます。
メモリリークの最適化
メモリ リークの最適化 言い換えると、どのような状況でメモリ リークが発生する可能性があるかについては、初心者向けの典型的な面接の質問でもあるため、誰もが明確であると思います。主に以下のような状況が考えられます。
- アクティビティを完全に破棄して解放できないように、アクティビティ内で静的変数を宣言しないでください。
- シングルトン設計パターンでのメモリ リークは、シングルトン設計パターンの静的な性質により、そのライフ サイクルがアプリケーションのライフ サイクルと同じくらい長くなります。つまり、オブジェクトが使用されなくなり、シングルトン オブジェクトがそのオブジェクトへの参照をまだ保持している場合、GC はオブジェクトをリサイクルできず、メモリ リークが発生します。したがって、シングルトン モードを使用する場合、受信コンテキストは ApplicationContext を使用する必要があります。
- 非静的内部クラスによって作成された静的インスタンスによって引き起こされるメモリ リーク
- ハンドラーが原因でメモリ リークが発生する場合は、非静的匿名内部クラスを使用してアクティビティ内でハンドラーを参照しないでください。次に例を示します。
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadData();
}
private void loadData(){
Message message = Message.obtain();
mHandler.sendMessage(message);
}
}
このようにして、ハンドラーはアクティビティへの参照を保持し、ハンドラーは Looper スレッドで実行され、Looper スレッドはポーリングしてメッセージ キュー内のメッセージを処理します。10 個のメッセージを処理し、6 番目のメッセージに到達すると、ユーザーは終了して現在のアクティビティを破棄するとします。
応答速度の最適化
応答速度の最適化の中心的な考え方は、メインスレッドで時間のかかる操作を避けることです。Android では、Activity が 5 秒以内に画面タッチイベントまたはキーボード入力イベントに応答しなかった場合に ANR が発生すると規定されています。BroadcastReceiver が 10 秒の場合、サービス時間は 20 秒です。もちろん、これは確率の低いイベントです。対応する時間内に反映されない場合は、ANR が発生します。」時間のかかる操作がある場合は、スレッドを個別に開いて操作できます。
リストビューの最適化
リストビューの最適化については誰もがよく知っていると思いますが、面接の定番の質問でもあります。ここでは詳しく説明しません。主にビューの再利用が含まれます。まず、ビューが空かどうかを判断します。
ビットマップの最適化
実際、アイデアも非常にシンプルで、BitmapFactory.Options を使用して必要なサイズの画像をロードするというものです。ここでは、ImageView で画像を表示することを想定しています。多くの場合、ImageView は元の画像サイズほど大きくありません。このとき、画像全体を読み込んでから imageView に設定します。ImageView には元の画像を表示する方法がないため、これは明らかに不要です。BitmapFactory.Options を使用すると、縮小画像を特定のサンプリング レートに従ってロードし、その縮小画像を ImageView で表示できるため、メモリ使用量が削減され、OOM がある程度回避され、Bitmap ロードのパフォーマンスが向上します。
スレッドの最適化
スレッド最適化の考え方は、スレッド プールを使用してプログラム内で多数のスレッドが発生するのを避けることです。スレッド プールは内部スレッドを再利用できるため、スレッドの作成と破棄によるパフォーマンスのオーバーヘッドを回避すると同時に、スレッド プールの最大同時実行数を効果的に制御し、多数のスレッドがシステム リソースを優先し合うことによって引き起こされるブロッキング現象の発生を回避できます。したがって、実際の開発では、毎回 Thread オブジェクトを作成するのではなく、スレッド プールを使用するようにする必要があります。
Androidのパフォーマンスの最適化
理論的側面
Android のパフォーマンスの最適化には多くの知識ポイントが含まれています。上記の一般的なソリューションに加えて、基礎となる原則についても詳細に議論する価値があります。さらに、パフォーマンスの監視やツールの使用などもあります。Android 開発の経験をもとに、これらのパフォーマンス最適化の基礎となる原理、さまざまな問題の解決策、知識の概要を資料にまとめました。皆さんのお役に立てれば幸いです。
内容概要:「Androidパフォーマンス最適化実践編」 360°全方位のパフォーマンス最適化。
コンテンツの特徴: グラフィック表現を含む明確な構成により、理解しやすくなります。
記事の内容が多く、スペースが限られているため、情報は PDF ドキュメントにまとめられています。「Android パフォーマンス最適化の実践」および360° オールラウンド パフォーマンス チューニングの完全なドキュメントが必要な場合は、以下のカードをスキャンして入手できます。
## **「Android パフォーマンス最適化実践編」**