最適化の目的を開始する
ユーザー体験:
アプリケーションの起動速度はユーザー エクスペリエンスに直接影響します。ユーザーは、アプリが迅速に起動し、アクションに迅速に応答することを期待しています。アプリの起動が遅い場合、ユーザーは不満を抱き、アンインストールしたり、競合他社のアプリに切り替えたりする可能性があります。起動の最適化により、アプリケーションの起動速度が向上し、ユーザーはより良いエクスペリエンスを得ることができます。
競争上の優位性:
モバイル アプリケーション市場は競争が激しく、ユーザーには膨大な数の選択肢があります。アプリの起動が遅いと、特に類似のアプリと比較した場合にユーザーを失う可能性があります。最適化を有効にすることで、アプリケーションの応答速度が向上し、より多くのユーザーをアプリケーションに滞留させ、競合他社との差別化競争力を高めることができます。
資源管理:
アプリケーションの起動時に、インターフェイス レイアウトやデータなどの多くのリソースをロードして初期化する必要がある場合があります。起動プロセスに時間がかかり、多くのリソースを消費すると、システムの負荷が増大し、他のアプリケーションのパフォーマンスに影響を与え、さらにはシステムのクラッシュを引き起こす可能性があります。最適化を開始すると、リソースをより効果的に管理および利用し、システム リソースの占有を減らし、システム全体のパフォーマンスと安定性を向上させることができます。
最適化の範囲を開始する
Android アプリケーションの起動プロセス中には、最初の画面、2 番目の画面、および 3 番目の画面という 3 つのメイン画面が表示されます。最初の画面は、应用程序加载的过程
テーマ内で通常表示される背景画像を指します。2 番目の画面は、Splash页面
起動インターフェイスのコンテンツが表示されていることを意味します。3 番目の画面は、MainActivity
アプリケーションのメインの対話型インターフェイスの表示を指します。
ユーザーエクスペリエンスを向上させるために、私たちは通常、アプリケーションが起動してインタラクティブなページが表示されるまでにかかる時間、つまり最初の画面と 2 番目の画面に費やす時間に注意を払います。その前にApplicationの作成処理とSplashActivityのスタートアップ作成処理があります。したがって、スタートアップの最適化の範囲は、通常、Application.attachBaseContext()
最初からMain.onWindowFocusChanged()
最後までとなります。
最適化の目標は、起動時間を短縮し、アプリケーションができるだけ早くインタラクティブなページを表示できるようにすることです。そのため、1画面目の消費時間、つまりアプリの起動時間と、1画面目と2画面目の合計の消費時間、つまりアプリからの起動時間に注意する必要があります。インタラクティブなページが起動します。
アプリケーション作成処理の呼び出しシーケンス:
Activityの作成から表示処理までの呼び出しシーケンス
最適化のアイデア
1. ツールの使用方法
このようにして、Android Studio が提供するパフォーマンス検出ツールを検出に使用できます。
2. 最適化手法
1. 業務やレイアウトの遅延ロードを含む遅延ロード
2. 子スレッドに投げて自らロードする
3. 事前ロード、マルチスレッド化による効率化
4. メインスレッドのIO動作確認
5. 制御スレッド数とGC数
Application.onCreate()
SDKの最適化:
遅延読み込み:
アプリケーションの初期化中に SDK をすべてロードするのではなく、本当に必要になるまで SDK の初期化を遅らせます。これにより、起動時の初期化時間が短縮され、起動速度が向上します。
SDK 間の依存関係の最適化:
一部の SDK は、他の SDK のロードが完了した後に初期化する必要がある場合があります。トポロジ アルゴリズムを使用して SDK のロード順序を最適化し、依存する SDK が依存する SDK よりも前にロードおよび初期化されるようにすることができます。これにより、依存関係による初期化エラーや時間がかかることが回避されます。
子スレッドは SDK を初期化します。
メインスレッドの時間をブロックしないように、SDK の初期化プロセスを子スレッドに配置します。特に、初期化が必要な一部の SDK は、複数のスレッドを通じてロードでき、CountDownLatch を使用してスレッドをブロックしてウェイクアップし、メイン スレッドがユーザー操作にできるだけ早く応答できるようにします。
ビジネスコードの最適化
ContentProvider の悪用は禁止されています。
ContentProvider は Application.attachBaseContext() で初期化されるため、乱用すると起動時間が長くなる可能性があります。したがって、ContentProvider は慎重に使用し、ビジネス ロジックを処理するために過度に使用しないようにする必要があります。
メインスレッドでの時間のかかる操作を最適化します。
アプリケーションのメインスレッドで時間のかかるコードを見つけて最適化し、起動時間への影響を軽減します。時間のかかる操作は、非同期操作またはその他の最適化方法によってサブスレッドに移動できるため、アプリケーションの起動速度が向上します。
Activity.onCreate()
レイアウトを最適化する:
レイアウトの背景の繰り返しレンダリングを減らし、レイヤーを減らし、ViewStub を使用して、必ずしもオンデマンドで表示されるとは限らないレイアウトを読み込みます。メインスレッドのブロック時間を短縮するために、子スレッドにレイアウトをロードするか、事前にロードすることを検討できます。
遅延初期化:
IO 操作やプレーヤーなど、initView() での時間のかかる操作は避けてください。これらの操作をオンデマンドで遅延ロードするか、メインスレッドのブロックを避けるために複数のスレッドにロードします。
遅延読み込みフラグメント:
メイン ページの ViewPager+Fragment の場合、Fragment はオンデマンドで遅延ロードされ、対応するページにスライドするときにのみロードおよび初期化されるため、すべての Fragment を一度にロードすることがなくなり、リソースが節約され、応答速度が向上します。
Activity.onResume()
ここでは時間のかかる操作を実行しないでください、ここでは時間のかかる操作を実行しないでください、ここでは時間のかかる操作を実行しないでください。
WMS の知識ポイント: ページのレンダリングは onResume にあります。
SDK 間の依存関係の最適化 (上記の SDK 最適化の 2 番目のポイントに進みます)
有向非巡回グラフ (DAG)
グラフは、一連のノード (頂点とも呼ばれます) とそれらのノードを接続するエッジで構成されるデータ構造です。有向グラフは、グラフのエッジに方向があるのに対し、無向グラフのエッジには方向がないことを意味します。有向非巡回グラフとは、有向グラフ内にループを形成するパスが存在しないこと、つまり、任意のノードから開始していくつかのエッジを通過すると開始点に戻ることができないことを意味します。
Android のアプリ起動の最適化で DAG を使用する一般的なシナリオは、依存関係の管理です。複雑な Android アプリケーションでは、異なるコンポーネント (アクティビティ、フラグメント、サービスなど) 間に依存関係が存在する場合があります。つまり、コンポーネントの起動は他のコンポーネントの完了に依存します。有向非循環グラフの助けを借りて、これらの依存関係を明確に表すことができ、トポロジ ソート アルゴリズムを通じて起動シーケンスを決定して、アプリケーションの起動パフォーマンスを向上させることができます。
具体的には、Android のアプリケーション起動プロセスは、ノードがさまざまなコンポーネントを表し、エッジがコンポーネント間の依存関係を表す有向グラフとして見ることができます。たとえば、アクティビティは、開始する前に他のアクティビティが初期化を完了するまで待つ必要がある場合があります。効果的な有向非巡回グラフを構築することで、これらの依存関係を可視化し、トポロジソートアルゴリズムに従って起動順序を決定することで、無駄な待ち時間を削減し、アプリケーションの応答速度を向上させることができます。
Androidの起動
Android スタートアップは、アプリケーションの起動時にコンポーネントを初期化するためのより簡単かつ効率的な方法を提供します。開発者は Android スタートアップを使用して起動シーケンスを簡素化し、初期化順序とコンポーネント間の依存関係を明示的に設定できます。同時に、Android スタートアップは、同期および非同期の待機、依存実行タイミングの手動制御をサポートし、有向非巡回グラフ トポロジ ソートを通じて内部依存コンポーネントの初期化順序を保証します。