Androidの最適化されたコールドスタートの解析

序文

特定のテスト・クラウドに移動する二日間のライン上の契約の前にイベントでは、自分自身が最適化しようとしたが、効果は非常に明白ではないことが判明し、追求してきた前に、コールドスタート速度は、問題の平均よりも低くなっていることを示唆しています開発者は、コールドスタートの最適化問題を注意深く見て少し自由時間を活用すること。

アプリの起動プロセス

私たちは、アプリを起動するには、「アプリケーションの起動時間」を記述し、公式ドキュメントを見ることができます。コールドスタート、ホットスタート、ウォームスタートへのアプリケーションの起動。コールドスタートは、より複雑な知識を必要とする最初からアプリケーションです。今回は主に寒さに解析と最適化のためのアプリケーションを起動します。コールドスタートでのアプリケーションは、次の3つのタスクを実行する必要があります。

  • ロードと起動するアプリケーション。
  • 開始アプリケーションが起動直後に空白のウィンドウを実演。
  • アプリの作成プロセスの手順;

実行するための3つのタスクは、システムがアプリケーション・プロセスを作成した後、アプリケーション・プロセスは次のステップになります。

  • アプリケーションは、オブジェクトを作成しました。
  • メインスレッドを起動します。
  • 活動スタートページを作成します。
  • ビューをロード。
  • 画面レイアウト。
  • 初期描画;

現在表示しているページの活動開始と背景ウィンドウを置き換えるために、最初のアプリケーションプロセスのマッピング、システム・プロセスの完了後、この時間は、ユーザーがアプリを使用することができます。次の図に示すワークフローシステムとアプリケーション。

上記の手順と、我々はアプリケーションプロセスが作成され、見ることができます図から、それは確かに私たちに実行されるアプリケーションのライフサイクルをアプリケーション・プロセスがアプリケーションを作成したときに、メインスレッドが私たちの最初のページMainActivityと初期化されます、実行MainActivityをライフサイクルI故意に大胆な焦点、これは我々が最適化部分に始めることができるものです。分析を最適化する方法を、私たちが最初に見ることができる前に、私たちのアプリケーションは、コールドスタート最適化するために必要されていません。

PSは:実際には、これらは、我々は、我々は受精卵フォークの具体的なプロセス、ActivityManagerServiceのソースコードを解析しようとしている一番下に到達するために完了する必要がある場合、我々は、表面を見ている事をしている、と私たちは、ある本を推薦し、この章で詳しく説明しません羅Sunの「Androidシステムのソースコードのシナリオ分析」、の劉王ジュ「のAndroid高度な暗号解読。」

スタート時間検出

だから、それを開始する権利時間はどのくらいですか?5秒以上で時にコールドスタートを記述するための公式ドキュメントでは、Androidのバイタルは、コールドスタートの最適化に関連したアプリケーションのニーズを検討します。しかし、AndroidのバイタルがGoogle Playの品質テストツールのためのアプリです、我々はすべて私のような、それを知っていますが、モバイル試験のアリ雲、アリクラウドから提供されるデータを使用することができ、業界の指標中央冷たい開始は4875.67です適切な場合には、MSは、我々は、比較することができます。さて、ここで我々は冷たいアプリケーションの起動時間を検出した場合について話しています。

表示されている時間

表示時間としては、図1に示したアンドロイド4.4(APIレベル19)以降、logcatログは、この値は、ブート・プロセスが完了し、描画画面上の各活動の間で経過していることを示し、表示名前情報が含まれてい時間の量。

ADBコマンド

 

adb shell am start -W [packageName]/[packageName.MainActivity]

ログの印刷ステーションを使用して時刻を表示ように、我々は[のpackageName] / [packageName.MainActivity]必要なもので、私たちは直接コピーを使用することができ、その後、我々は、ターミナルASで立ち往生、以下に続く、ログに表示見ましたその後、我々は指定されたページを起動する時のデータを印刷しています。

 

Status: ok
Activity: com.xx.xxx/com.xx.xxxx.welcome.view.WelcomeActivity
ThisTime: 242
TotalTime: 242
WaitTime: 288
Complete

  • ThisTime:それはこの活動を呼び出すstartActivityAndWaitの終わりに最後の活動開始時間を呼び出す処理を指し、
  • TOTALTIMEは:最後の活動startActivityAndWaitの終わりに最初の活動開始時間を呼び出す処理を指します。
  • WAITTIME:startActivityAndWait、この方法は時間のかかる通話です。

reportFullyDrawn

いくつかの特別なシーンでは、我々だけで十分ですページの完了コールバックの時間を描き始めることができませんでした、私たちは、私たちがreportFullyDrawnを使用することができ、データ・ページインターフェーススプラッシュ画面の広告は完全な成功コールバック時間とみなされた後も起動する必要があります

 

public class WelcomeActivity extends MvpActivity<WelcomePresenter> implements WelcomeMvp.View {
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_welcome);
 // 请求数据
 mvpPresenter.config();

 }
 @Override
 public void finishRequest() {
 // 数据回调
 reportFullyDrawn();
 }
}

PS:そうSDKのバージョンや判断に設定する。この方法でminSdkVersionがニーズのAPI19 +、。

Traceview

Traceviewは非常に簡単にAndroidデバイスのためのパフォーマンス分析ツールを使用することです、それは、私たちは、プログラムのパフォーマンスを追跡することを可能にする、と明らかに時間のかかるの数を確認し、各機能を呼び出すことができ、詳細なインタフェースとすることができます。

SYSTRACE

SYSTRACE非常に直感的な表示APIと時間のかかる場合も上記各スレッドの呼び出し手順。

TraceviewとSYSTRACEので、学生が興味を持っているならば、あなたは「最適化のAndroidアプリケーションをスムーズに私の以前の記事を読むことができ、ここでは詳しく説明しません、DDMSツールパネルではないが、今よりAS3.0版よりは、もはや推奨されます詳細には、これらの2つのツールの使用を記載している実用的な操作」の。

ヒューゴ

github.com/JakeWharton...

私たちは、注釈の方法によって消費クラスまたは関数に対応するJakeWhartonヒューゴ、取得時間を使用することができます。私たちは詳細を引っ張ってページアクティビティのライフサイクルを開始するためにそれを使用することができます。

スタートの最適化の実用的な操作

ユーザーエクスペリエンスの最適化

コールドスタートに最適化された経験では、個人的に黒と白/黒の第一印象のために、ユーザは、カトン遅いので、起動時にメインの黒と白/黒画面の排除だと思います。私たちは、自分の目標を達成するために、スタートアップページのテーマを設定することができます。

 

<style name="WelcomeTheme" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
 <item name="android:windowBackground">@drawable/shape_welcome</item>
 <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

windowDrawsSystemBarBackgrounds部をカラムシステム動作が設けられています。これは、レイアウトウィンドウの背景色が続いています。

 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
 <item android:drawable="@android:color/white"/>
 <item>
 <bitmap
 android:src="@drawable/welcome_bg"
 android:gravity="center"/>
 </item>
</layer-list>

広告は、ホームページへの完全なジャンプを表示するページを起動し、私たちの一般的なスタイルは、マニフェストファイル内のコードに設定することができますバックセット。

 

<activity
 ···
 android:theme="@style/AppBaseFrameTheme"/>

起動ページのテーマを設定することにより、彼らは黒と白/消去に黒になり、アプリケーションのディスプレイ上のアイコンをユーザーがクリックすると、ユーザーが迅速に生成を開始することができ、描画を開始する「錯覚を。」スタートページとホームページ間の遷移がより自然になるように、同時に、そこにアニメ化することができます。

アプリケーション起動の最適化

分析を地図上に要約されているから、私はポイントのアプリケーションのライフサイクルを最適化するための大胆なヒントだったし、我々は動作バックの最適化のこの部分に来ます。

アプリケーション#attachBaseContext()

アプリケーションはattachBaseContext()後に開始されます - >のonCreate();この時点で、私たちはattachBaseContextから何までのライフサイクルを考えますか?はいMultiDex下請けのメカニズムです。我々は外注に対処する方法の数が65535を超えているので、その後確かに、我々は、機構を外注する寒さにつながる重要な理由は、プラグ指向のアプローチを使用してスロースタート、今アプリケーションの一部である、黒と白/黒画面の問題が生じ始める、見つけますこれは方法ですが、開発コストは、多くのアプリケーションのために不要である高すぎるもののMultiDexは、黒と白に起因する問題を避けるために。まずMultiDexのコンパイル時と2つの部分のMultiDexの最適化に関するましょう話は、実行時に分けることができます。

  • コンパイル:アプリケーションクラスも含まれる第1メインクラスDEXのDEXの数を減らすために複数DEXに分割戦略ことを特徴とします。
  • ランタイム:アプリケーションの起動時に、仮想マシンがクラスで唯一のメインのdexをロードします。アプリ後に他の修正が反射によってdexElementsをDEX ClassLoaderをロードするために、Multidex.installの使用を開始します。

オンライン多くの記事の実用的な分析から、彼らは主に非同期モードで使用します。アプリは、我々は下請けの仕事を処理するために無料になります、メインDEXパッケージ以来、最初のスタートをロードします、我々は、メインのdexパッケージの細かなポイントを達成するためにDEXでメインクラスのホーム・ページと必要なライブラリ、コンポーネントおよびその他の主なポイントを開始しますサイズ、文言の具体的な操作、あなたがオンラインMultiDex開始の最適化の記事を参照することができますが、我々はメイン、サブDEXの過程で、最適化された操作の私達の範囲を介してメインDEXがメインのdexの大きさを減少させ、それゆえ増加していることに注意してください我々は、最適化のテスト作業で良い仕事をしなければならないので、異常のNoClassDefFoundErrorが、この時点で私たちのアプリケーションを危険につながることは、起動に失敗しました。

アプリケーション#のonCreate()

onCreate()のライフサイクル後attachBaseContext()した後、おそらく最も私たちのアプリケーションの、ここではサードパーティのライブラリやコンポーネントの私達の使用のために仕事に初期化されます。連続反復バージョンのため、サードパーティのライブラリは、ライフサイクルにつながった初期の作品の多くは重すぎる)のonCreate(に直接書かれている初期化、我々はこれらのサードパーティのライブラリを分類する必要があります。ここでアプリケーションが起動し、私の仕上げ私たちの仕事の分類は以下のとおりです。

開始時間に影響を与え、初期化初期化マップ、サードパーティ製ツールの多様性とビジネスロジックに見えました。それらは4つの部分に分割することがしてみましょう。

  • あなたはのonCreate(になる)と、メインプロセスの初期設定である必要があります
  • それを遅らせることができるが、必要性は、アプリケーションで初期化します
  • 初期化のコールバックは、ライフサイクルの開始ページまで遅延することができます
  • 再初期化するには時間遅れで

私たちは、自分のプロジェクトに応じて自分自身のすべてのプロジェクトを最初に初期化を列挙され、その後、分類することができます。私はここで、特定の操作コードを掲示していませんが、私は新しいスレッドを考えるかと言う簡単すぎるIntentServiceを作成していないが、ここでは全体の寒さの最適化が起動するという事は、彼が踏まので、ここで、注意する必要がありませんピット。例えばGrowingIO、GIOの非常に古いバージョンを使用してプロジェクトが、GIOは、その後の前に突然契約、子スレッド操作で初期化されると、業務部門が承感をコンパイルして実行した後、GIOのアップグレードバージョンのニーズをSDK検査はGIOの新しいバージョンは子スレッドで初期化されていない明らかにした後、新しいバージョンの後の行に直接パッケージ化、運用のフィードバックを行うには何も、データに○をつけませんでした。このレッスンから、学生は私はあなたが冷たい開始を最適化することに興味があることから、少数のコピーとは、特定の条件にしているコードを、貼り付けることは確かに悪くはないと思います。私がまとめてみよう焦点を

  • 無脳開いスレッドません、遅い起動し、ビンにコードを差し込む、あなたは右の薬を必要とします。
  • オープンスレッドは、科学、スレッド、ThreadPoolExecutor、AsyncTask、IntentService、正確に何を選択しています。
  • あなたに良い新しいスレッドを仮定し、ちょうど掘りながらピットを埋めていない、良いメモリリークを考慮していません。
  • いくつかのサードパーティのSDKは、メインスレッドで初期化する必要があることに注意してください。
  • アプリケーションは、いくつかのサードパーティSDKことを認識して、マルチプロセスである場合は、同じ名前のプロセスとパッケージで初期化する必要があります。
  • 実際には、コードの反復バージョンの年は、これらの古いコードをオフに終えていないされた後、コードを分類し、ニーズを整理するために無用である、多くのプロジェクトがあります。

活動開始ページの最適化

  1. 我々は、コントロール、マップコントロールスプラッシュスクリーン広告、動画広告スプラッシュスクリーンコントロール、初めてのインストールのために導入さマップコントロールを描き始める含むページレイアウト最適化の活動を開始します。レイアウト最適化のために、コントロールの描画を開始するだけでなく、他のアプリケーションがコントロールを起動したとき、我々はViewStubを使用することができ、初期化されるものではありません。特定のビジネスシナリオでは、指定したコントロールを初期化します。
  2. 我々はI / O操作が)SharedPreferences#が(適用、このようなデータベースを読み取り、書き込みなど、リアルタイムではありません知っているI / O操作は避けてください。私たちは、これらのアクションを実行するためにメインスレッドをブロックしていないことに注意すべきである、と私たちは適切に何のディスクの読み取りと書き込みがない起動したときに検出することができますStrictMode strictモードを利用することができます。
  3. 私たちが知っていることに注意してください画像のビットマップ読み込み速度やエンコード形式、ほとんどの場合、ページが画像を表示されている起動して、どのように我々はこの点でそれの写真を詳細を引く、そしてそれは、サードパーティ製の像のさまざまなライブラリをロードするための選択肢ですかグライドなどピカソ、フレスコは、PREFER_ARGB_8888、PREFER_RGB_565選択問題があり、私たちは自分のプロジェクトのためのケースを選択することができます。
  4. ベクターグラフィックVectorDrawableオブジェクトを使用して、ベクターのコアはスペース節約、時間を節約することです。一部のユーザーのために、それは絵を描き始めるかもしれない、それはちょうどロゴ、我々はベクトルグラフィックスの使用を考慮することができ、この時、非常に簡単です。
  5. 私たちのアプリケーション#のonCreate()の最適化、特定の非常に必要ではないネットワーク要求におけるライフサイクル活動を開始し、ウェルカムページに移動し、私たちは直接直接スタートページにコピーされたネットワークリクエストを操作することができないことに注意してくださいコールバックonCreate()、私たちは巧みに活動#onWindowFocusChanged(ブールhasFocus)ライフサイクルのアクティビティを使用することができ、これはあなたがコールバックを初期化し、すべてのコントロールの真実である、私たちはもちろん、我々はまた、サービスを利用することができ、ここではネットワーク上で動作することができます。

コールドスタートの最適化の概要

コールドスタートを最適化するために、我々はコピーレイアウト最適化ルーチンがそうであるとは異なり、非常に多くの回数用語のボトルネックのボトルネックは、公式文書に表示され、ステップ解析によってステップを行く必要レベルの接地しませんコールドスタートを最適化する我々の方法を説明し、我々はする必要がありますアンドロイドStudioのCPUプロファイラを駆使TraceviewとSYSTRACEが、二つのことで、オンライン要約の多くは、アップグレードのAS3.0版で廃棄されているので、私たちは地面の側面を反映したい、(私たちは、詳細この機能を使用して分析する機会を持っています)いない誰か他の人の翻訳分析を通じて、変化を考える彼らの最初のAndroidの角度で、公式文書を参照してください。最後に、我々は今日のAndroidの市場でより競争力のあるもの同士を奨励、競合製品とは対照的に勝つためにどのように、我々はまた、完全に行うには十分の内容の一つにステップバイステップを必要としています。

シェアは、これらは、良い歓迎の注意を感じていることである、後者は、Androidの技術と高度な情報を共有するために継続し、他のドライグッズ

公開された56元の記事 ウォンの賞賛1 ビュー2905

おすすめ

転載: blog.csdn.net/chuhe1989/article/details/104663865
おすすめ