私は8月に出発し、2か月が経ちました。サプライズレビューの後、結果は説明と見なすことができます。YouZan(Shenzhen)、投資は3つの側面を通過し、HR側を待ち、Tencentは2つの側面を通過し、インタビュー中の状態はOKでした。3つの側面があるのではないかと思います。 HRヌードル!(私はテンセントに行くのが好きです)、キングディーは2番目の側で死にました。理由は何ですか?(当時の私自身の状況や面接官からの質問には理由があるので、判断はしません。)一般的に、4つの主要な工場に面接したところ、結果は大丈夫でした!
テンセントがセカンドサイドで出会ったインタビューの質問ですが、当時はあまりよく答えられなかったので、繰り返したかったです!まとめですので、ピットに入らないように注意したいと思います。
1.プロセスの概要
起動プロセス:
①デスクトップアプリアイコンをクリックすると、ランチャープロセスはバインダーIPCを使用してsystem_serverプロセスへのstartActivityリクエストを開始します。
②system_serverプロセスはリクエストを受信した後、プロセスを作成するリクエストをzygoteプロセスに送信します。
③Zygoteプロセスは、新しい子プロセスであるAppプロセスをフォークします。
Appプロセスは、BinderIPCを介してsytem_serverプロセスへのattachApplication要求を開始します。
⑤リクエストを受信した後、system_serverプロセスは一連の準備を実行し、バインダーIPCを介してscheduleLaunchActivityリクエストをAppプロセスに送信します。
⑥Appプロセスのバインダースレッド(ApplicationThread)は、リクエストを受信した後、ハンドラーを介してメインスレッドにLAUNCH_ACTIVITYメッセージを送信します。
△メッセージを受信した後、メインスレッドは起動メカニズムを介してターゲットアクティビティを作成し、Activity.onCreate()などのメソッドをコールバックします。
⑧この時点で、アプリは正式に起動し、アクティビティライフサイクルに入り始めます。onCreate/ onStart / onResumeメソッドを実行すると、UIレンダリングが終了した後、アプリのメインインターフェイスが表示されます。
上記の一連の手順では、メインページの表示にAPPを起動するプロセスを簡単に紹介します。これらのプロセスの用語の中には、ランチャー、zygote、applicationThreadなど、少し紛らわしいものがあるかもしれません。
以下に、それらを1つずつ紹介します。
2.理論的根拠
1.接合子
Zygoteは「受精卵」を意味します。AndroidはLinuxシステムに基づいています。Linuxでは、すべてのプロセスがinitプロセスによって直接的または間接的にフォークされ、zygoteプロセスも例外ではありません。
Androidシステムでは、zygoteはプロセスの名前です。AndroidはLinuxシステムに基づいています。電話の電源を入れると、Linuxカーネルがロードされた後に「init」と呼ばれるプロセスが開始されます。Linuxシステムでは、すべてのプロセスがinitプロセスによってフォークされ、zygoteプロセスも例外ではありません。
私たちは皆、すべてのアプリが実際に
●個別のdalvik仮想マシン
●別のプロセス
したがって、システムの最初のzygoteプロセスが実行されたときに、その後にアプリを開くことは、新しいプロセスを開始することと同じです。リソース共有とより高速な起動速度を実現するために、Androidシステムが新しいプロセスを開始する方法は、最初のzygoteプロセスをフォークすることによって実現されます。それで、最初のザイゴートプロセスを除いて、他のアプリケーションのプロセスはすべてザイゴートの子プロセスですが、なぜこのプロセスが「受精卵」と呼ばれるのか理解できますか?受精卵のようなものなので、急速に分裂し、遺伝物質と同じ細胞を作り出すことができます!
2.system_server
SystemServerもプロセスであり、zygoteプロセスによってフォークされます。
SystemServerの性質を知っているので、私たちはそれに慣れていません。このプロセスは、Android Frameworkの2つの非常に重要なプロセスの1つであり、もう1つのプロセスは上記のzygoteプロセスです。
SystemServerが非常に重要なのはなぜですか?システム内の重要なサービス(ActivityManagerService、PackageManagerService、WindowManagerServiceなど)はすべてこのプロセスで開始されるためです。
3.ActivityManagerService
ActivityManagerServiceは、AMSと略され、システム内のすべてのアクティビティのライフサイクルを担当するサーバー側のオブジェクトです。
ActivityManagerServiceの初期化のタイミングは非常に明確です。つまり、SystemServerプロセスが開始されると、ActivityManagerServiceが初期化されます。
以下では、Androidシステムのサーバーとクライアントの概念について説明します。
実際、サーバークライアントの概念は、Web開発だけでなく、Androidフレームワークの設計にも存在します。サーバー側とは、ここで説明したActivityManagerServiceや前述のPackageManagerService、WindowManagerServiceなど、すべてのアプリで共有されるシステムサービスを指します。これらの基本的なシステムサービスは、すべてのアプリで共有されます。アプリが実装する場合操作中に、これらのシステムサービスに伝えます。たとえば、アプリを開きたい場合は、パッケージ名とMainActivityクラス名がわかった後で開くことができます。
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
ただし、このアプリはstartActivity()を呼び出して別のアプリを直接開くことはできません。このメソッドは一連の呼び出しを実行し、最後にAMSに次のように伝えます。「このアプリを開きたい。彼の住所と名前を知っている。助けてくれる開いてみましょう!」つまり、AMSはzygoteプロセスに、ターゲットアプリを起動するための新しいプロセスをフォークするように通知します。これは、ブラウザがハイパーリンクを開きたい場合、ブラウザがWebページアドレスをサーバーに送信してから、サーバーが必要なリソースファイルをクライアントに送信するようなものです。
Android Frameworkのクライアントサーバーアーキテクチャを理解した後でも、1つのことを理解する必要があります。つまり、アプリ、AMS(SystemServerプロセス)、およびzygoteプロセスは3つの別々のプロセスに属しています。これらはどのように通信しますか?
アプリとAMSはバインダーを介してIPC通信を実行し、AMS(SystemServerプロセス)とzygoteはソケットを介してIPC通信を実行します。詳細な紹介は後で。
では、AMSの用途は何ですか?以前ご存知のように、アプリを開く場合は、AMSがzygoteプロセスに通知する必要があります。さらに、実際には、アクティビティのすべてのアクティブ化、一時停止、およびシャットダウンはAMSによって制御される必要があるため、AMSがシステム内のすべてに責任があると述べました。活動のライフサイクル。
Androidシステムでは、アクティビティの起動は、AMSとアプリケーションプロセス(主にActivityThread)の間の協力によって完了します。AMSサービスは、システム内のすべてのプロセスのアクティビティの起動を一律にスケジュールし、各アクティビティの起動プロセスは、それが属するプロセスによって具体的に完了します。
4.ランチャー
携帯電話のデスクトップにあるアイコンをクリックすると、ランチャーによってアプリが起動します。しかし、ランチャーとは何かについて考えたことはありますか?
ランチャーは本質的に私たちのアプリのようなアプリケーションであり、アクティビティからも継承します
packages / apps / Launcher2 / src / com / android / launcher2 / Launcher.java
public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,
View.OnTouchListener {
}
Launcherは、クリックや長押しなどのコールバックインターフェイスを実装して、ユーザー入力を受け取ります。通常のアプリなので、開発経験はここでも当てはまります。たとえば、アイコンをクリックしたときにアプリを開くにはどうすればよいですか?アイコンクリックイベントをキャプチャすると、startActivity()が対応するインテントリクエストを送信します。はい、ランチャーもこれを行います、それはとても簡単です!
5.Instrumentation和ActivityThread
各アクティビティはInstrumentationオブジェクトへの参照を保持しますが、プロセス全体に存在するInstrumentationオブジェクトは1つだけです。Instrumentationクラスのほとんどのメソッドは、Application and Activityに関連しています。このクラスは、Application andActivityの初期化とライフサイクルを完了するツールクラスです。インストルメンテーションクラスは非常に重要であり、アクティビティライフサイクルメソッドへの呼び出しは彼と切り離せません。彼は大きな家政婦であると言えます。
ActivityThreadはUIスレッドに依存します。アプリとAMSはバインダーを介して情報を送信するため、ActivityThreadはAMSとの外交作業に専念しています。
6.ApplicationThread
アプリの起動とアクティビティの表示にはAMSの制御が必要であることはすでにわかっているため、サーバーと通信する必要があります。この通信は双方向です。
クライアント->サーバー
また、同じパブリックインターフェイスクラスを継承するため、ActivityManagerProxyはActivityManagerServiceと同じ関数プロトタイプを提供します。これにより、ユーザーはサーバーがローカルで実行されているかリモートで実行されているかを認識できず、これらの重要なシステムサービスをより便利に呼び出すことができます。
サーバー->クライアント
通信は引き続きバインダーを介して行われますが、ApplicationThreadとApplicationThreadProxyという別のペアが置き換えられます。
それらはすべて同じインターフェースIApplicationThreadを実装します
private class ApplicationThread extends ApplicationThreadNative {}
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}
class ApplicationThreadProxy implements IApplicationThread {}
さて、羅李の前にはたくさんの言葉があり、たくさんの名詞が紹介されていますが、あまり明確ではないかもしれませんが、問題ではありません。以下はフローチャートと併せて紹介されています。
3、起動プロセス
1.プロセスを作成します
①LauncherのstartActivity()メソッドから、バインダー通信を介してActivityManagerServiceのstartActivityメソッドを呼び出します。
②一連のトス、最後にstartProcessLocked()メソッドを呼び出して新しいプロセスを作成します。
③この方法は、前述のソケットチャネルを介してZygoteプロセスにパラメータを渡します。Zygoteは自分自身を孵化します。ZygoteInit.main()メソッドを呼び出して、ActivityThreadオブジェクトをインスタンス化し、最後に新しいプロセスのpidを返します。
④ActivityThread.main()メソッドを呼び出すと、ActivityThreadはLooper.prepareLoop()とLooper.loop()を順番に呼び出してメッセージループを開始します。
メソッド呼び出しのフローチャートは次のとおりです。
より簡単なプロセスの説明:
①アプリ起動プロセス:デスクトップからアプリケーションを起動する場合、起動プロセスはランチャーが配置されているプロセスです。アプリからリモートプロセスを起動する場合、送信プロセスはアプリが配置されているプロセスです。開始プロセスは、最初にバインダーを介してsystem_serverプロセスにメッセージを送信します。
②system_serverプロセス:Process.start()メソッドを呼び出し、ソケットを介してzygoteプロセスに新しいプロセスを作成する要求を送信します。
③Zygoteプロセス:ZygoteInit.main()を実行した後、runSelectLoop()ループに入ります。クライアント接続がある場合は、ZygoteConnection.runOnce()メソッドを実行し、階層化された呼び出しの後に新しいアプリケーションプロセスをフォークします。
④新しいプロセス:handleChildProcメソッドを実行し、最後にActivityThread.main()メソッドを呼び出します。
2.バインディングアプリケーション
上記のプロセスを作成した後、ActivityThread.main()メソッドを実行してから、attach()メソッドを呼び出します。
プロセスを指定されたアプリケーションにバインドします。これは、前のセクションのActivityThreadオブジェクトでbindApplication()メソッドを呼び出すことによって行われます。このメソッドは、BIND_APPLICATIONメッセージをメッセージキューに送信し、最後にhandleBindApplication()メソッドを介してメッセージを処理します。次に、makeApplication()メソッドを呼び出して、Appクラスをメモリにロードします。
メソッド呼び出しのフローチャートは次のとおりです。
より簡単なプロセスの説明:
(AMS、ATPなどの用語がわからない場合は、後で説明します)
3.アクティビティインターフェイスを表示します
最初の2つのステップの後、システムにはすでに申請プロセスがあります。後続の呼び出しシーケンスは、既存のプロセスから新しいプロセスを開始する通常のアクティビティです。
実際の呼び出しメソッドはrealStartActivity()であり、アプリケーションスレッドオブジェクトでscheduleLaunchActivity()を呼び出して、LAUNCH_ACTIVITYメッセージをメッセージキューに送信し、handleLaunchActivity()を介してメッセージを処理します。handleLaunchActivity()で、performLaunchActiivty()メソッドを介してActivityのonCreate()メソッドとonStart()メソッドを呼び出し、次にhandleResumeActivity()メソッドを介してActivityのonResume()メソッドを呼び出し、最後にActivityインターフェイスを表示します。
より簡単なプロセスの説明:
四、Binder通信
略語:
ATP: ApplicationThreadProxy
AT: ApplicationThread
AMP: ActivityManagerProxy
** AMS:** ActivityManagerService
図:
①startProcessLockedメソッドがsystem_serverプロセスで呼び出されます。このメソッドは、最終的にZygoteプロセスに、socketメソッドを使用して新しいプロセスを作成する必要があることを通知し、Socketが新しく作成されたプロセスのpidを返すのをブロックします。
②Zygoteプロセスは、system_serverから送信されたメッセージを受信し、forkメソッドを使用してzygoteプロセスをコピーして新しいプロセスを生成し、ActivityThread関連のリソースを新しいプロセスアプリプロセスにロードします。これは、アクティビティなどのコンポーネントを運ぶために使用できます。
③新しいプロセスアプリプロセスで、system_serverプロセスのバインダーサーバーAMSをservicemanagerに照会し、対応するクライアント(AMP)を取得します。このバインダーc / sペアのペアを使用すると、アプリプロセスはバインダーをクロスプロセスsystem_serverに渡すことができます。リクエストを送信します。つまり、attachApplication()
④system_serverプロセスは、対応するバインダー操作を受信した後、複数回呼び出した後、ATPを使用してバインダー要求をアプリプロセス、つまりbindApplicationに送信します。system_serverにはATP / AMSがあり、新しく作成された各プロセスには対応するAT / AMPがあり、クロスできます。プロセスは相互に通信します。これは、プロセス作成プロセスの完全なエコロジカルチェーンです。
以上、APPの起動からメインページ表示までのプロセスを大まかに紹介します。このプロセスは主にマクロの観点から紹介されており、ソースコードと併せて理解することができます。
好きなものを読んだ後、習慣を身につけ、WeChatで「ProgrammingApe Development Center」を検索して、乾物を書くのが好きなこのプログラマーをフォローしてください。
また、そこにある主要なAndroidの最初の行の企業とのインタビューのための完全なテストサイトでは、その情報が私の中で更新された[Githubに]。フレンズインタビューを必要とするが、それらを参照することができます。それはあなたに役に立つならば、あなたはスターを注文することができます!