Android開発の統計アプリ起動時間
前言
Androidの開発者としては、起動速度の最適化に関わることが多いと思います。ユーザーが多くなるにつれて、製品の機能も反復するにつれて増えてきました。その中で一番重要なのは起動速度の最適化です。しかし、本論文の主人公は起動速度最適化ではなく、起動時間統計である。
一、起動タイプ
仕事をよくしようとするなら,まず道具を研がなければならない.アプリの起動速度を最適化するには、起動時間を正確に測定する方法が必要です。でないと、最適化した後の効果はどうなりますか?アプリの起動時間の統計をする前に、どのような起動タイプがあるのか、各起動タイプの特徴を明らかにしなければなりません。一般的に、安卓において適用される起動方式は以下のいくつかに分類される。
1、コールドスタート:アプリケーションを起動すると、バックグラウンドにアプリケーションのプロセスがない場合、システムは新たなプロセスを作成し、アプリケーションに割り当てられます。この起動方式はコールドスタートです。コールドスタートは、システムが新たなプロセスを作成し、それに割り当てられますので、最初に
2、熱起動:アプリケーションを起動する時、バックグラウンドには既にこのアプリケーションのプロセスがあります。だから、既存のプロセスの場合、この起動は既存のプロセスからアプリケーションを起動します。この方式は熱起動といいます。熱起動は既存のプロセスから開始されるので、熱起動は
3、初起動:最初の起動は厳格に寒い起動であり、最初の起動を単独列に並べたのは、一般的に、最初の起動時間は非最初の起動より長くなり、最初の起動はキャッシュディレクトリの生産、データベースの構築、SharedPrferenceの初期化など、いくつかのシステム初期化作業を行います。最初の起動にはいくつかの特殊な処理ロジックがあり、起動速度に大きな影響を与えるので、最初の起動速度は非常に重要です。
二、ローカル起動時間の統計方式
ローカルデバッグであれば、起動時間を統計するのは簡単です。コマンドライン方式で行けばいいです。
開発者は主にTotalTimeに関心を持っていればいいです。この時間こそ自分のアプリが本当に起動する時間です。
三、オンライン起動時間の統計方式
アプリがオンラインに送信された後、Appのユーザの携帯電話における起動速度を統計したいなら、コマンドラインで統計することはできません。どの位置に起動時間統計のLogを加えるかが重要です。Log添加の位置は起動時間統計の正確さを直接決定します。同様に起動速度最適化効果の判断にも影響します。適切な正確な位置を見つけて起動時間のログを記録するには、アプリケーションの起動フローと各ライフサイクル関数の呼び出し順序を知る必要があります。どの位置にログを記録するのが適切かを分析します。
アプリケーションの主な起動フロー
アプリの起動プロセスに関する記事が多く、記事の底にはスタートフローに関する参考記事があります。ここでは大まかな流れだけを示します。
1、
3、
4、これまでのプロセスはすべて
5、
6、zygoteプロセスは新しいアプリケーションを孵化した後、
7、
総括プロセスとは、ユーザーが
ライフサイクル関数実行フロー
上記の起動フローはAndroidによって提供されたメカニズムであり、開発者としては、プロセスと原理を明確にまたは少なくとも知る必要がありますが、この過程では何をすることができません。私たちができるのは、上記のプロセスの最後のステップからです。すなわち、
開始時間
開始時点は記録しやすいです。寒いスタート時間を記録すれば、普通は
終了時間
終了時間は理論的にアプリで第一画面画面を表示する時を選択しますが、どの位置のアプリで第一画面画面を表示しますか?ネット上の多くの文章は
締め括りをつける
以上はAndroid開発の統計アプリの起動時間の全部の内容についてですが、本文の内容はやはりとても重要だと思います。やはりその言葉です。仕事がよくなりたいなら、まずその器を利して、十分な準備をしてください。この文章の内容が皆さんの役に立つことを願います。
Androidの開発者としては、起動速度の最適化に関わることが多いと思います。ユーザーが多くなるにつれて、製品の機能も反復するにつれて増えてきました。その中で一番重要なのは起動速度の最適化です。しかし、本論文の主人公は起動速度最適化ではなく、起動時間統計である。
一、起動タイプ
仕事をよくしようとするなら,まず道具を研がなければならない.アプリの起動速度を最適化するには、起動時間を正確に測定する方法が必要です。でないと、最適化した後の効果はどうなりますか?アプリの起動時間の統計をする前に、どのような起動タイプがあるのか、各起動タイプの特徴を明らかにしなければなりません。一般的に、安卓において適用される起動方式は以下のいくつかに分類される。
1、コールドスタート:アプリケーションを起動すると、バックグラウンドにアプリケーションのプロセスがない場合、システムは新たなプロセスを作成し、アプリケーションに割り当てられます。この起動方式はコールドスタートです。コールドスタートは、システムが新たなプロセスを作成し、それに割り当てられますので、最初に
Application
クラスを作成し、初期化し、MainActivity
クラスを作成し、初期化し、最後にインターフェースに表示します。2、熱起動:アプリケーションを起動する時、バックグラウンドには既にこのアプリケーションのプロセスがあります。だから、既存のプロセスの場合、この起動は既存のプロセスからアプリケーションを起動します。この方式は熱起動といいます。熱起動は既存のプロセスから開始されるので、熱起動は
Application
のステップではなく、直接MainActivity
を歩くので、熱起動のプロセスはApplication
を作成して初期化する必要はありません。一つのアプリケーションは新しいプロセスの作成からプロセスの廃棄まで、Application
は一回だけ初期化されます。3、初起動:最初の起動は厳格に寒い起動であり、最初の起動を単独列に並べたのは、一般的に、最初の起動時間は非最初の起動より長くなり、最初の起動はキャッシュディレクトリの生産、データベースの構築、SharedPrferenceの初期化など、いくつかのシステム初期化作業を行います。最初の起動にはいくつかの特殊な処理ロジックがあり、起動速度に大きな影響を与えるので、最初の起動速度は非常に重要です。
二、ローカル起動時間の統計方式
ローカルデバッグであれば、起動時間を統計するのは簡単です。コマンドライン方式で行けばいいです。
adb shell am start -w packagename/activity
出力の結果は以下のようです。
$ adb shell am start -W com.speed.test/com.speed.test.HomeActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.speed.test/.HomeActivity }
Status: ok
Activity: com.speed.test/.HomeActivity
ThisTime: 496
TotalTime: 496
WaitTime: 503
Complete
WaitTime
は、startActivity
からアプリケーション第1のフレームに戻り、この時間を完全に表示する。つまり、総消費時間は、前のアプリケーションActivity pause
の時間と新しいアプリケーションの開始時間とを含む。ThisTime
は、一連の起動Activity
の最後のActivity
の開始時間を示す。TotalTime
は、新しいアプリケーションの起動時、新しいプロセスの起動とActivity
の起動を含むが、前のアプリケーションActivity
pauseの時間消費量を含まないことを示している。開発者は主にTotalTimeに関心を持っていればいいです。この時間こそ自分のアプリが本当に起動する時間です。
三、オンライン起動時間の統計方式
アプリがオンラインに送信された後、Appのユーザの携帯電話における起動速度を統計したいなら、コマンドラインで統計することはできません。どの位置に起動時間統計のLogを加えるかが重要です。Log添加の位置は起動時間統計の正確さを直接決定します。同様に起動速度最適化効果の判断にも影響します。適切な正確な位置を見つけて起動時間のログを記録するには、アプリケーションの起動フローと各ライフサイクル関数の呼び出し順序を知る必要があります。どの位置にログを記録するのが適切かを分析します。
アプリケーションの主な起動フロー
アプリの起動プロセスに関する記事が多く、記事の底にはスタートフローに関する参考記事があります。ここでは大まかな流れだけを示します。
1、
Launcher
を通じてアプリケーションを起動する時、アプリケーションアイコンをクリックした後、Launcher
はstartActivity
を呼び出してアプリケーションを起動します。Launcher Activity
は最終的にInstrumentation
のexecStartActivity
を呼び出してアプリケーションを開始します。3、
Instrumentation
は、ActivityManagerProxy
(ActivityManagerServiceのアプリケーションのプロキシオブジェクト)オブジェクトを呼び出すstartActivity
方法でActivity
を起動する。4、これまでのプロセスはすべて
Launcher
プロセスで実行され、続いてActivityManagerProxy
オブジェクトはプロセスをまたいでActivityManagerService
を呼び出します。serverプロセス)のstartActivity
方法でアプリケーションを開始します。5、
ActivityManagerService
のstartActivity
方法は一連の呼び出しを経て、最後にzygoteSendArgsAndGetResult
を呼び出してsocket
を通じてzygote
プロセスに送信し、zygote
プロセスは新たなアプリケーションプロセスを孵化する。6、zygoteプロセスは新しいアプリケーションを孵化した後、
ActivityThread
種類のmain
方法を実行します。この方法では、まずLooper
とメッセージ・キューを準備し、その後、attach
の方法を呼び出して、アプリケーションをActivityManagerService
に結びつけ、その後loop
のループに入り、メッセージ・キュー内のメッセージを継続的に読み取り、メッセージを配信する。7、
ActivityManagerService
は、アプリケーションのプロキシオブジェクトを保存し、その後、ActivityManagerService
は、プロキシを介してアプリケーションの作成のためのエントリActivity
の例を通知し、そのライフサイクル関数を実行する。総括プロセスとは、ユーザーが
Launcher
のプログラムでアプリケーションアイコンをクリックすると、ActivityManagerService
にアプリケーションの入り口Activity
を起動させ、ActivityManagerService
がこのアプリケーションがまだ起動していないことを発見したら、Zygote
プロセスがアプリケーションプロセスを孵化させるように通知し、その後、このアプリケーションプロセスでActivityThread
のmain
の方法を実行するということです。その後、アプリケーションプロセスはActivityManagerService
に開始されたことを通知し、ActivityManagerService
はアプリケーションプロセスのプロキシオブジェクトを保存し、このプロキシによってアプリケーションプロセスを制御し、その後、ActivityManagerService
はアプリケーションプロセスの入口Activityのインスタンスを作成することを通知し、そのライフサイクル関数を実行する。ライフサイクル関数実行フロー
上記の起動フローはAndroidによって提供されたメカニズムであり、開発者としては、プロセスと原理を明確にまたは少なくとも知る必要がありますが、この過程では何をすることができません。私たちができるのは、上記のプロセスの最後のステップからです。すなわち、
ActivityManagerService
は、プロキシを通じてアプリケーションプロセスの作成について、入口ActivityManagerService
の例を通知します。そしてそれを実行するライフサイクル関数が始まります。私たちの起動時間統計と起動速度最適化もここから始まります。以下はMain Activityの起動フローです。
-> Application
-> Application.attachBaseContext()
-> Application.onCreate()
-> Activity
-> Activity.setTheme()
-> Activity.onCreate()
-> Activity.onStart
-> Activity.onResume
-> Activity.onAttachedToWindow
-> Activity.onWindowFocusChanged
Logでアプリの起動時間を記録すると、少なくとも2つの点、1つの開始点、1つの終了時点を記録します。開始時間
開始時点は記録しやすいです。寒いスタート時間を記録すれば、普通は
Activity
からスタート地点を記録することができます。その前にApplication.attachBaseContext()
は初期化されていないので、普通は何もできません。もちろんこれは具体的な状況によって決められます。実際には、Appの具体的な業務ロジックが実行される前に開始時点を記録すればいいです。熱起動時点を記録するとContext
に開始時点を記録することができる。終了時間
終了時間は理論的にアプリで第一画面画面を表示する時を選択しますが、どの位置のアプリで第一画面画面を表示しますか?ネット上の多くの文章は
Activity.onRestart()
のActivity
の方法で実行された後、onResume
はユーザーに見られました。実際にはActivity
のライフサイクルを歩いた後、Windows属性の設定Activity
のようないくつかの構成が完成しただけです。しかし、後はonCreate onStart onResume
それぞれにActivity
などを実行する必要があります。したがって、View
において終了時点のLogを記録するのは正確ではないので、上のフローの最後の関数View
に注目してください。以下はそのコメントです。
/**
*Called when the current {@link Window} of the activity gains or loses
* focus. This is the best indicator of whether this activity is visible
* to the user. The default implementation clears the key tracking
* state, so should always be called.
...
*/
この関数はmeasure layout draw
が見える最適な位置かどうかを判断するために、アプリケーション起動の終了時点をOnResume
に記録することができますが、この関数はActivity.onWindowFocusChanged
の焦点が変化するとトリガになりますので、必要でない状況を削除するために、判断を下す必要があります。締め括りをつける
以上はAndroid開発の統計アプリの起動時間の全部の内容についてですが、本文の内容はやはりとても重要だと思います。やはりその言葉です。仕事がよくなりたいなら、まずその器を利して、十分な準備をしてください。この文章の内容が皆さんの役に立つことを願います。